Kubernetes Kubeadm无法在升级时签署证书
在使用kubespray将Kubernetes从1.14升级到1.15的过程中,我的团队在“升级第一主程序”步骤中遇到了以下消息的阻塞问题: 尝试隔离任务并手动运行kubeadm命令行会导致相同的错误消息:Kubernetes Kubeadm无法在升级时签署证书,kubernetes,kubespray,Kubernetes,Kubespray,在使用kubespray将Kubernetes从1.14升级到1.15的过程中,我的团队在“升级第一主程序”步骤中遇到了以下消息的阻塞问题: 尝试隔离任务并手动运行kubeadm命令行会导致相同的错误消息: #/usr/local/bin/kubeadm upgrade apply -y v1.15.3 --config=/etc/kubernetes/kubeadm-config.yaml --ignore-preflight-errors=all --allow-experimental-u
#/usr/local/bin/kubeadm upgrade apply -y v1.15.3 --config=/etc/kubernetes/kubeadm-config.yaml --ignore-preflight-errors=all --allow-experimental-upgrades --allow-release-candidate-upgrades --etcd-upgrade=false -v 6
甚至尝试手动续订证书:
/etc/kubernetes/pki# kubeadm alpha certs renew apiserver-kubelet-client -v 9
I0919 14:42:11.515503 18597 initconfiguration.go:105] detected and using CRI socket: /var/run/dockershim.sock
I0919 14:42:11.515897 18597 interface.go:384] Looking for default routes with IPv4 addresses
I0919 14:42:11.515916 18597 interface.go:389] Default route transits interface “eth0”
I0919 14:42:11.516284 18597 interface.go:196] Interface eth0 is up
(...)
I0919 14:42:11.516835 18597 feature_gate.go:216] feature gates: &{map[]}
failed to renew certificate apiserver-kubelet-client: unable to sign certificate: must specify at least one ExtKeyUsage
最终找到了解决方案并发布在下面。问题来自kubeadm,它在必须续订旧证书时使用旧证书。但是,当这些初始证书太旧或是手动生成的时,它们可能不包括需要存在的一些必填字段 在错误消息中,
ExtKeyUsage
指的是X509v3扩展密钥用法
字段
您可以通过查看您的证书来检查:涉及2个证书:apiserverkubelet-client.crt
和front-proxy-client.crt
它们位于主主机上的/etc/kubernetes/pki
你可以跟我核对一下
#openssl x509-在apiserver-kubelet-client.crt-text-noout中
如果它们不包含以下内容(接近末尾),那么kubeadm将完全无法续订证书
(...)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Client Authentication
TL;博士 解决方案只是通过以下过程创建全新的证书
######### Backup your certificates (just in case)
master01:/etc/kubernetes/pki# cp -a /etc/kubernetes/pki /root/backup_cert/
######### Delete incomplete certificates
master01:/etc/kubernetes/pki# rm apiserver-kubelet-client.*
master01:/etc/kubernetes/pki# rm front-proxy-client.*
######### Then recreate them
master01:/etc/kubernetes/pki# kubeadm init phase certs apiserver-kubelet-client
master01:/etc/kubernetes/pki# kubeadm init phase certs front-proxy-client
您现在可以重新启动升级过程,这应该是正常的。(注意:如果您的集群处于第一个主机具有SchedulingDisabled状态的状态,请不要忘记取消主机上的关联,因为kubespray playbook不会解决此问题)问题来自kubeadm,它在必须续订旧证书时使用旧证书。但是,当这些初始证书太旧或是手动生成的时,它们可能不包括需要存在的一些必填字段 在错误消息中,
ExtKeyUsage
指的是X509v3扩展密钥用法
字段
您可以通过查看您的证书来检查:涉及2个证书:apiserverkubelet-client.crt
和front-proxy-client.crt
它们位于主主机上的/etc/kubernetes/pki
你可以跟我核对一下
#openssl x509-在apiserver-kubelet-client.crt-text-noout中
如果它们不包含以下内容(接近末尾),那么kubeadm将完全无法续订证书
(...)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Client Authentication
TL;博士 解决方案只是通过以下过程创建全新的证书
######### Backup your certificates (just in case)
master01:/etc/kubernetes/pki# cp -a /etc/kubernetes/pki /root/backup_cert/
######### Delete incomplete certificates
master01:/etc/kubernetes/pki# rm apiserver-kubelet-client.*
master01:/etc/kubernetes/pki# rm front-proxy-client.*
######### Then recreate them
master01:/etc/kubernetes/pki# kubeadm init phase certs apiserver-kubelet-client
master01:/etc/kubernetes/pki# kubeadm init phase certs front-proxy-client
您现在可以重新启动升级过程,这应该是正常的。(注意:如果您的集群处于第一个主机具有SchedulingDisabled状态的状态,那么不要忘记取消主机上的协作,因为kubespray playbook不会解决这个问题)