集群GG了,一查默認的證書失效只有一年。恢復吧,手生啊。
kubeadm 是 kubernetes 提供的一個初始化集群的工具,使用起來非常方便,但是它創建的 apiserver、controller-manager 等證書默認只有一年的有效期,
同時 kubelet 證書也只有一年有效期,一年之后 kubernetes 將停止服務。
方法總結下來有以下幾個:
1、官方推薦:一年之內 kubeadm upgrade 更新一次 kubernetes 系統。
2、坊間方法:源代碼編譯,使得 kubeadm 生成的證書時間邊長。
3、手動更新證書( kubeadm alpha phase )。
4、啟用自動輪換 kubelet 證書
查詢api證書過期時間
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
查詢etcd證書過期時間
openssl x509 -in /etc/kubernetes/pki/etcd/healthcheck-client.crt -noout -text |grep ' Not '
一、環境GG的情況下更新證書
1、准備 kube-config.yaml
kubeadm命令升級master證書時,它也會默認從牆外讀取一個stable.txt的文件,生產環境沒有牆外線是絕對訪問不到的。
這時候就需要自備的kube-config.yaml文件。生成方式如下命令:
kubeadm config view > kube-config.yaml
實際情況集群掛了的時候這個命令也是無法執行,可以自己寫一個,但是擔心版本問題,之前也沒備份。好在我司用的集群是我標准化過的。
找台機器重新部署一個同版本的,>kubeadm config view > kube-config.yaml 生成一個kube-config.yaml當然新生成的yml要修改里邊的apiserver地址為master地址。應該是替換/etc/kube下的同名文件,記得備份。補的文檔,記不太清楚了,當時也沒標注這個。應該是沒問題。
修改:
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.14.1 #-->這里改成你集群對應的版本
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
#這里使用國內的鏡像倉庫,否則在重新簽發的時候會報錯:could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt"
2、備份證書
cp -r /etc/kubernetes /etc/kubernetes.bak
移動證書和配置【注意!必須移動,不然會使用現有的證書,不會重新生成】
cd /etc/kubernetes
mkdir ./pki_bak
mkdir ./pki_bak/etcd
mkdir ./conf_bak
mv pki/apiserver* ./pki_bak/
mv pki/front-proxy-client.* ./pki_bak/
mv pki/etcd/healthcheck-client.* ./pki_bak/etcd/
mv pki/etcd/peer.* ./pki_bak/etcd/
mv pki/etcd/server.* ./pki_bak/etcd/
mv ./admin.conf ./conf_bak/
mv ./kubelet.conf ./conf_bak/
mv ./controller-manager.conf ./conf_bak/
mv ./scheduler.conf ./conf_bak/
3、生成證書
kubeadm alpha phase certs all --config=cluster.yaml
版本不一致執行的命令也不一樣,需要查看對應版本alpha命令
參考文檔:
https://www.cnblogs.com/skymyyang/p/11093686.html
https://hacpai.com/article/1575013191401 ()
有相關介紹,不過我參考的是第二個,第一個嘗試失敗
4、更新配置文件
kubeadm alpha phase kubeconfig all --config=cluster.yaml
mv $HOME/.kube/config $HOME/.kube/config.old
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
sudo chmod 777 $HOME/.kube/config
完成后重啟kube-apiserver,kube-controller,kube-scheduler,etcd這4個容器,親測systemctl rstart docker 也可以
報錯:
error: Error loading config file "/etc/kubernetes/scheduler.conf": read /etc/kubernetes/scheduler.conf: is a directory
diff kube-config.yaml cluster.yaml 發現nodename不一致,可能是他導致的,試試
kubeadm config view > kube-config.yaml
rm -rf /etc/kubernetes/scheduler.conf 我這里secheduler.conf現在是個目錄,不知道啥情況。
單獨更新scheduler的證書就行
kubeadm alpha phase kubeconfig scheduler --config=/root/kube-config.yaml
完成
二、啟用自動輪換 kubelet 證書
kubelet 證書分為 server 和 client 兩種, k8s 1.9 默認啟用了 client 證書的自動輪換,但 server 證書自動輪換需要用戶開啟.
1、增加 kubelet 參數
在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf 增加如下參數
Environment="KUBELET_EXTRA_ARGS=--feature-gates=RotateKubeletServerCertificate=true"
增加 controller-manager 參數
在/etc/kubernetes/manifests/kube-controller-manager.yaml 添加如下參數
- command:
- kube-controller-manager
- --experimental-cluster-signing-duration=87600h0m0s
- --feature-gates=RotateKubeletServerCertificate=true
- ....
2、創建 rbac 對象
創建rbac對象,允許節點輪換kubelet server證書:
cat > ca-update.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
rules:
- apiGroups:
- certificates.k8s.io
resources: - certificatesigningrequests/selfnodeserver
verbs: - create
- certificates.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubeadm:node-autoapprove-certificate-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:nodes
EOF
3、開啟輪換
kubectl create –f ca-update.yaml