K8S上生產(chǎn)環(huán)境后,90%都會遇到這個故障
在Kubernetes/K8s上生產(chǎn)環(huán)境中,90%的人都會遇到的一個故障,K8s集群突然有一天執(zhí)行kubectl命令時,報錯提示509證書過期。返回如下報錯信息:
Unable to connect to the server: x509: certificate has expired or is not yet valid
這是什么導(dǎo)致的呢?該怎么解決呢?
我們了解到kubectl,它實在上是讀取kube/config這個文件,向API Server發(fā)起請求。也就是kubectl的任何操作,都是攜帶這個文件向API Server獲取數(shù)據(jù)后顯示到你當(dāng)前的終端。
那這個提示就意味kube/config這個文件中的證書與API Server它的證書過期了。如果你使用kubeadm搭建的集群,它所有的證書默認(rèn)存儲在/etc/kubernetes/pki。這里面主要是k8s的證書和etcd使用的證書。這些證書默認(rèn)有效期是1年。一旦過期,k8s集群就無法提供服務(wù)。
那為什么只有一年呢?
這是因為K8S官方,他希望你每年更新一次K8S的版本,來保持最新版本。同時它的證書實際也會給你延期。
那這種每年更新一次版本,來去更新證書,在生產(chǎn)環(huán)境中顯然不太合適的。這種操作會增加集群不穩(wěn)定或者出現(xiàn)其他問題的風(fēng)險。
當(dāng)然kubeadm也提供了一個命令方式,可以自動的給你續(xù)簽這些所有的證書。
我們可以通過kubeadm certs check-expiration來去查看當(dāng)前集群證書的一個有效期,因為本身這證書就是kubeadm在搭建集群中自動生成的,所以,它管理證書也是通過kubeadm這個命令進行管理它的一個續(xù)期。
通過這個命令可以查看當(dāng)前所有證書它的一個有效期,可以看到證書的有效期剩余342天。下面是它的根證書,默認(rèn)是10年,也就是「根證書它是非常重要的」。
客戶端證書過期了,可以通過根證書可以生成。而這根證書一旦發(fā)生變化,它的影響范圍就比較大了,所以,kubeadm它的根證書默認(rèn)是10年,是完全足夠用的。主要升級的也是客戶端證書。
它提供一個命令,也是可以直接對這些客戶端證書進行升級,不過在升級之前,我們先將一些數(shù)據(jù)給備份一下,以免在升級的過程中,產(chǎn)生一些額外的問題,好方便進行去恢復(fù)。
首先把/etc/kubernetes/pki這個目錄進行備份。
cp /etc/kubernetes/pki /etc/kubernetes/pki.bk -r
然后再將etcd的數(shù)據(jù)目錄備份一下。
cp /var/lib/etcd /var/lib/etcd.bk -r
使用kubeadm certs renew all將所有的證書升級,續(xù)期一年。
執(zhí)行完之后,根據(jù)提示重啟相關(guān)組件,由于該K8S集群使用kubeadm部署,只需要執(zhí)行如下命令即可實現(xiàn)重啟K8S相關(guān)組件。
mv /etc/kubernetes/manifests/*.yaml /home
sleep 20
mv /home/*.yaml /etc/kubernetes/manifests/
等待k8s集群啟動成功后,再次查看證書時間,如下:
通過上述結(jié)果可以看到證書的有效期變成了一年。