Z.S.K.'s Records

Kubernetes学习(解决x509 certificate is valid for xxx, not yyy)

最近因机房网段调整,影响到一个kubernetes集群中的一个master节点,在更换该master节点ip的时候,出现了有关证书的问题,特此记录一下

错误如下:

1
Unable to register node "xxxxx" with API server: Post https://xxxx:6443/api/v1/nodes: x509: certificate is valid for 10.96.0.1, yyyy, not xxxx

xxxx表示的本地地址

这个错误的意思是, 当kubelet在使用xxxx与api-server通信时,api-server证书返回的地址列表中不包含有xxxx这个地址,导致tls证书校验不通过,可以使用以下命令来查看api-server的证书中包含的所有地址列表

如果使用的是kubeadm搭建的集群,那api-server的证书在/etc/kubernetes/pki

1
openssl x509 -noout -text -in apiserver.crt

通过上述命令可以列出所有被写在证书的地址列表,比如:

1
2
X509v3 Subject Alternative Name:
DNS:shaolin, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:10.96.0.1, IP Address:10.27.53.32

证书中包含的可以是ip地址,也可以是域名,会发现确实不包含xxxx这个地址

那既然没有包含这个地址,是不是可以修改这个证书的地址列表呢,答案是肯定的:

由于需要生成新的证书,最好备份整个证书目录,整个过程如下:

1
2
3
4
5
6
7
8
9
10
11
# 生成密钥对
openssl genrsa -out apiserver.key 2048
# 生成
openssl req -new -key apiserver.key -subj "/CN=kube-apiserver," -out apiserver.csr

# 新增 apiserver.ext文件,包含所有的地址列表,ip:xxxx即为要包含的新节点的ip, 内容如下:
subjectAltName = DNS:wudang,DNS:kubernetes,DNS:kubernetes.default,DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP:10.96.0.1, IP:10.24.138.208, IP:xxxx

# 使用ca根证书生成新crt
openssl x509 -req -in apiserver.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out apiserver.crt -days 3650 -extfile apiserver.ext
# apiserver.key跟apiserver.crt是一组密钥对

再次查看新的apiserver.crt文件会发现已经包含新增加的ip地址

1
openssl x509 -noout -text -in apiserver.crt

重启api-server容器后,会发现x509证书错误消失

如果更改的是worker node的ip的话就更简单,只是ip变更一般主机名不会变,只需要直接修改kubelet的–node-ip,然后重启kubelet即可

参考文章:

转载请注明出处https://izsk.me

Z.S.K. wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?