kubeadm升級證書-集群已GG


集群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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM