最近在给客户部署一套 k8s 集群时,主节点master1安装完后,master2 join时提示 etcd 证书报错,铲掉重装后问题还是稳定复现,客户提供的机器操作系统为Ubuntu 22.04、Kernel:Linux 5.15.x,报错信息节选如下:
error execution phase control-plane-prepare/certs: error creating PKI assets: failed to write or validate certificate "etcd-server": cert, not master2 is invalid: x509: certificate is valid for localhost, master2
...
(sudo -E /bin/bash <<EOF
kubeadm join --config=/etc/kubernetes/kubeadm.yaml -v 0 --ignore-preflight-errors=SystemVerification,Port-10250,DirAvailable--etc-kubernetes-manifests
EOF) : error(Process exited with status 1)
使用的安装工具是产研封装的一套k8s外加自研产品的自动化部署流程,相当于个黑盒,看直接报错,问题是出在master2的etcd证书上。首先查看master1和master2的kubeadm.yaml中certSANS和ETD证书配置都没有问题,再去master2上查看etcd server.crt和peer.crt,发现 CN(Common Name) 和 SAN(Subject Alternative Name) 配置中的主机名都多了一个换行符,但是查看master2的主机中/etc/hostname文件中并没有换行符,然后用master3 join也同样报这个错,但master1就没这个问题,这就很奇葩了,问研发和同事都没遇到过这种问题。
# 检查节点证书 SAN 是否包含所有必要条目 openssl x509 -in /etc/kubernetes/pki/etcd/server.crt -text -noout | egrep -A1 "Subject:|DNS:"
master2节点 etcd-server 证书 SAN 输出示例(签的不是统一证书,每台etcd证书都不一样),多了一个换行符:
Subject:CN = master2\0D X509v3 Subject Alternative Name: DNS:localhost, DNS:master2^M, IP Address:127.0.0.1, IP Address:192.168.1.100
输出字段说明
CN:master2
用于标识证书持有者的名称。
DNS:master2
主节点的主机名(必须与节点实际主机名一致)。
DNS:localhost
本地回环地址的 DNS 标识(用于本地通信)。
IP Address:192.168.1.100
主节点的实际 IP 地址(用于跨节点通信)。
IP Address:127.0.0.1
本地回环 IP 地址(用于本机内部通信)。