kubeadm拉起的k8s集群證書過期的做法
- 這個是很久之前遇到的了,今天有空(心血來潮)就都回憶回憶寫在這里為愛發光,部分內容來自arch先生(死黨)的幫助。
- 有時候有很多部門提了建k8s的需求,有些是臨時的,有些沒有說具體用多久,但是某天,他們和你說集群壞了,這時候你上去一看證書過期了,這里又有兩種情況我們分別說明:
- 集群還活著
- 集群已歸西
- 1、備份數據
- 2、報錯內容及分析
- 3、生成證書
- 4、證書內容合并
- 5、證書替換
- 6、證書生效
這個是很久之前遇到的了,今天有空(心血來潮)就都回憶回憶寫在這里為愛發光,部分內容來自arch先生(死黨)的幫助。
有時候有很多部門提了建k8s的需求,有些是臨時的,有些沒有說具體用多久,但是某天,他們和你說集群壞了,這時候你上去一看證書過期了,這里又有兩種情況我們分別說明:
集群還活著
集群已歸西(麻煩事兒)
集群還活著
#查看證書過期時間
kubeadm certs check-expiration#如果過期就更新
kubeadm certs renew all#更新完證書再次查看
kubeadm certs check-expiration#更新完證書后還需要重啟api-server,controller-manager,scheduler,etcd#看看有沒有這個文件
ll /etc/crictl.yaml#沒有就主動生成
echo "runtime-endpoint: unix:///run/containerd/containerd.sock" \| tee /etc/crictl.yamlcontainerd執行腳本更新相關服務
pods="crictl pods --namespace kube-system --state READY"
for component in kube-apiserver kube-controller-manager kube-scheduler etcd; doecho "> `date +%DT%T` Restart $component"$pods | grep "$component" | awk '{print "crictl stopp "$1 | "sh"}'sleep 5echo "---------------------------------------"
done
使用kubectl獲取集群資源看是否正常。
集群已歸西
此時集群無法連接、無法管理,甚至無法啟動
1、備份數據
mkdir ~/recoverysudo rsync -av /etc/kubernetes/ ~/recovery/etc-kubernetes/sudo rsync -av /var/lib/etcd/ ~/recovery/var-lib-etcd/sudo rsync -av /var/lib/kubelet/ ~/recovery/var-lib-kubelet/
2、報錯內容及分析
journalctl -u kubelet.service
kubelet[2447]: E0923 bootstrap.go:265] part of the existing bootstrap client certificate in /etc/kubernetes/kubelet.conf is expired: xxxxxxxxx
顯而易見,kubelet 使用的證書過期了
查看 /etc/kubernetes/kubelet.conf 內容,看它使用的證書文件路徑
users:
- name: system:node:xxxxuser:client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pemclient-key: /var/lib/kubelet/pki/kubelet-client-current.pem
接著進入 /var/lib/kubelet/pki kubelet 的證書、私鑰都在這里,而且還有一個 kubelet.conf 引用的 pem 文件
.crt + .key = .pem
接著解析 kubelet.crt 內容
openssl x509 -in kubelet/pki/kubelet.crt -noout -textCertificate:Signature Algorithm: sha256WithRSAEncryptionIssuer: CN=kubernetesValidityNot Before: Jan 6 15:53:54 2022 GMTNot After : Jan 6 15:53:54 2023 GMTSubject: O=system:nodes, CN=system:node:vm-m1Subject Public Key Info:Public Key Algorithm: rsaEncryptionX509v3 extensions:X509v3 Subject Alternative Name:DNS:vm-m1主機名是 vm-m1,被 CN 和 DNS 用到Subject 格式 O=system:nodes, CN=system:node:${主機名}
DNS 格式 ${主機名}
3、生成證書
由于過期的是 kubelet 使用的證書,而 ca 沒過期,因此基于已有 ca 生成證書
node_name=vm-m1
#生成 EC 私鑰 (P-256 橢圓曲線)
openssl ecparam -genkey -name prime256v1 -noout -out kubelet.key#創建證書簽署請求 (CSR)
openssl req -new -key kubelet.key -out kubelet.csr -subj "/O=system:nodes/CN=system:node:${node_name}"#引用已有 ca,生成 crt 證書
openssl x509 -req -in kubelet.csr \-CA /etc/kubernetes/pki/ca.crt \-CAkey /etc/kubernetes/pki/ca.key \-CAcreateserial \-out kubelet.crt \-days 365 \-extensions v3_req \-extfile <(cat <<EOF
[ v3_req ]
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
subjectAltName = @alt_names[ alt_names ]
DNS.1 = ${node_name}
EOF
)
4、證書內容合并
date_time= ( d a t e + c a t k u b e l e t . c r t > k u b e l e t ? c l i e n t ? (date +%F-%H-%M-%S) cat kubelet.crt > kubelet-client- (date+catkubelet.crt>kubelet?client?{date_time}.pem
cat kubelet.key >> kubelet-client-${date_time}.pem
5、證書替換
systemctl stop kubelet.servicecp -vf kubelet.crt kubelet.key /var/lib/kubelet/pki/cd /var/lib/kubelet/pki/ln -sf /var/lib/kubelet/pki/kubelet-client-${date_time}.pem kubelet-client-current.pem systemctl start kubelet.service
6、證書生效
當然這個場景下也得同步更新其他組件的證書
kubeadm certs renew all
接著刷新各個組件使用的證書,更建議直接 reboot 刷新