k8s之證書過期處理


k8s之證書過期處理


通過Kubeadm安裝的K8S集群,其控制平面證書有效期默認為1年,到期後你會遇到x509: certificate has expired or is not yet valid錯誤。

解決辦法,通過kubeadm命令重新生成證書:

cd /etc/kubernetes/
rm -rf pki/apiserver.* pki/apiserver-kubelet-.* pki/front-proxy-*

# apiserver API Server服務器證書
# apiserver-etcd-client API Server訪問Kubelet使用的證書
# apiserver-kubelet-client 用於API Server連接到kubelet的證書
# ca 根證書
# sa 用於簽名Service Account Token的證書
# front-proxy-ca 前置代理的自簽名CA證書
# front-proxy-client 前置代理客戶端證書
kubeadm alpha phase certs apiserver \\
--apiserver-cert-extra-sans=k8s.gmem.cc,localhost,10.0.2.1,10.0.3.1,127.0.0.1,radon,neon
kubeadm alpha phase certs apiserver-kubelet-clientkubec
kubeadm alpha phase certs sa
kubeadm alpha phase certs front-proxy-ca
kubeadm alpha phase certs front-proxy-client

# 配置文件也需要重新生成
rm -rf *.conf
kubeadm alpha phase kubeconfig all --apiserver-advertise-address=10.0.2.1
cp admin.conf $HOME/.kube/config

生成的文件中,除了front-proxy-client.crt之外的所有crt文件,都是基於/etc/kubernetes/pki/ca.*進行簽名。

用於Service Account Token的簽名和校驗的sa.pub則僅僅是公鑰,這也意味著,所有API Server必須共享一致的sa.key/sa.pub。

證書更新後,kube-proxy可能無法訪問API Server,報錯 Unauthorized,原因是重新生成了sa.*,簽名用的密鑰變了。其實sa.*不需要重新生成,它不牽涉證書過期的問題。清空所有Token,導致其重新自動生成即可解決此問題:

kubectl get secrets --all-namespaces --no-headers | grep service-account-token | awk '{system("kubectl -n "$1" delete secrets "$2)}'

所有依賴於Service Account Token的Pod(基本上所有控制平面Pod都需要訪問API Server)都需要重啟:

# 否則,這些Pod訪問API Server後,API Server會報錯
# invalid bearer token, [invalid bearer token, square/go-jose: error in cryptographic primitive
kubectl -n kube-system delete pod --all


分享到:


相關文章: