查看k8s中所有證書的到期時(shí)間:
kubeadm alpha certs check-expiration
查看CA證書過期時(shí)間:
openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text |grep Not
查看集群證書過期時(shí)間:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
如果集群證書還沒有過期
獲取一個(gè)創(chuàng)建好的 k8s集群的初始化配置文件
kubeadm config view > kubeadm.yaml
如果證書已經(jīng)過期了:
vim kubeadm.yaml
sion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.15.0 # kubernetes 版本
apiServer:
certSANs:
- 192.168.10.xxx # master 所有節(jié)點(diǎn)IP地址退子,包括master和slave
- 192.168.10.xxx # slave1
- 192.168.10.xxx # slave2
extraArgs:
service-node-port-range: 80-32767
advertise-address: 0.0.0.0
controlPlaneEndpoint: "192.168.10.xxx:6443" # APIserver 地址,也就是master節(jié)點(diǎn)地址
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #這里使用國內(nèi)阿里云的鏡像倉庫
或者更簡單的:
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.13.5 #--------這里改成你集群對(duì)應(yīng)的版本
imageRepository: k8s.gcr.io #-------k8s官方的鏡像倉庫
重新生成默認(rèn)一年時(shí)長證書
在集群已經(jīng)部署好的情況下集群的證書過期,可以選擇對(duì)證書進(jìn)行重新生成愉舔。
單master或多master集群(etcd在集群內(nèi))處理:
1)休傍、備份原先的證書文件和配置文件:
cp -rp /etc/kubernetes /etc/kubernetes.bak
2)对省、刪除過期的證書文件:
(注意:1.13.0以下的版本需要?jiǎng)h除舊的證書迁筛,不然不會(huì)重新生成啤誊,1.13.5以上的就不用操作了會(huì)自動(dòng)更新的刃滓。ca.cer\ca.key\sa的這些證書不要?jiǎng)h除ca默認(rèn)就是10年沒必要重新生成,同時(shí)kubeadm在重新生成apiserver這些組件的證書的時(shí)候需要使用ca證書來進(jìn)行簽發(fā))
$ rm -f /etc/kubernetes/pki/apiserver*
$ rm -f /etc/kubernetes/pki/front-proxy-client.*
$ rm -rf /etc/kubernetes/pki/etcd/healthcheck-client.*
$ rm -rf /etc/kubernetes/pki/etcd/server.*
$ rm -rf /etc/kubernetes/pki/etcd/peer.*
3)欠痴、獲取k8s集群初始化的配置文件yaml文件:
kubeadm config view > kubeadm.yaml
4)迄靠、生成新的證書文件
生成證書有兩種方式一種是重新生成私鑰和公鑰,一種是使用存在的私鑰重新簽發(fā)喇辽。
生成相應(yīng)組件的證書(此格式會(huì)使用相應(yīng)組件的原來的key重新簽發(fā)證書):
$kubeadm alpha phase certs renew etcd-healthcheck-client --config kubeadm.yaml
$kubeadm alpha phase certs renew etcd-peer --config kubeadm.yaml
$kubeadm alpha phase certs renew etcd-server --config kubeadm.yaml
$kubeadm alpha phase certs renew front-proxy-client--config kubeadm.yaml
$kubeadm alpha phase certs renew apiserver-etcd-client --config kubeadm.yaml
$kubeadm alpha phase certs renew apiserver-kubelet-client --config kubeadm.yaml
$kubeadm alpha phase certs renew apiserver --config kubeadm.yaml
##或者重新簽發(fā)全部組件的證書
$kubeadm alpha phase certs renew all --config kubeadm.yaml
kubeadm alpha certs renew all --config=kubeadm.yaml #我用的這個(gè)掌挚,上邊那個(gè)我的平臺(tái)運(yùn)行失敗。
或如下格式(這種格式需要?jiǎng)h除原來存在的相應(yīng)證書和key菩咨,此格式會(huì)重新創(chuàng)建相應(yīng)組件的私鑰和公鑰):
$kubeadm init phase certs apiserver --config kubeadm.yaml
生成新的配置文件(admin.conf吠式、controller-manager.conf、kubelet.conf旦委、scheduler.conf):
mv /etc/kubernetes/*.conf ~/.
kubeadm alpha phase kubeconfig all --config kubeadm.yaml
或如下格式重新生成相關(guān)組件的配置文件:
kubeadm init phase kubeconfig all --config kubeadm.yaml #我用的這個(gè)
將新生成的admin.conf文件覆蓋掉.kube/config文件:
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
chmod 644 $HOME/.kube/config
5)奇徒、重啟kube-apiserver,kube-controller,kube-scheduler,etcd這4個(gè)容器:(一定要ps -a要不有可能服務(wù)容器沒啟動(dòng))
docker ps -a | grep -v pause | grep -E "etcd|scheduler|controller|apiserver" | awk '{print $1}' | awk '{print "docker","restart",$1}' | bash
6)、各節(jié)點(diǎn)重啟kubelet或相關(guān)組件:
systemctl restart kubelet
注意:若集群式采用高可用ha方式安裝的話有所區(qū)別缨硝,etd的相關(guān)證書需要另外簽發(fā)操作,要是之前搭建集群的時(shí)候已經(jīng)使用了長時(shí)間的則僅僅需要處理k8s其它組件的證書即可罢低。
再查看證書過期時(shí)間已經(jīng)更新了查辩。
參考文檔
http://www.reibang.com/p/289c62200818
https://www.cnblogs.com/skymyyang/p/11093686.html
https://blog.51cto.com/u_12988868/2587697
http://www.reibang.com/p/cdffaff82a34
客戶端kubelet證書輪換自動(dòng)續(xù)期:
kubectl證書輪換是在當(dāng)前證書即將過期時(shí),將自動(dòng)生成新的密鑰网持,并從k8s api申請(qǐng)新的證書宜岛。
kubelet 進(jìn)程接收 --rotate-certificates 參數(shù),該參數(shù)決定 kubelet 在當(dāng)前使用的證書即將到期時(shí)功舀,是否會(huì)自動(dòng)申請(qǐng)新的證書萍倡。 由于證書輪換是 beta 特性,必須通過參數(shù) --feature-gates=RotateKubeletClientCertificate=true 進(jìn)行啟用辟汰。
kube-controller-manager 進(jìn)程接收 --experimental-cluster-signing-duration 參數(shù)列敲,該參數(shù)控制證書簽發(fā)的有效期限。
當(dāng) kubelet 啟動(dòng)時(shí)帖汞,如被配置為自舉(使用--bootstrap-kubeconfig 參數(shù))戴而,kubelet 會(huì)使用其初始證書連接到 Kubernetes API ,并發(fā)送證書簽名的請(qǐng)求翩蘸。 可以通過以下方式查看證書簽名請(qǐng)求的狀態(tài):
$kubectl get csr
最初所意,來自節(jié)點(diǎn)上 kubelet 的證書簽名請(qǐng)求處于 Pending 狀態(tài)。 如果證書簽名請(qǐng)求滿足特定條件, 控制管理器會(huì)自動(dòng)批準(zhǔn)扶踊,此時(shí)請(qǐng)求會(huì)處于 Approved 狀態(tài)泄鹏。 接下來,控制器管理器會(huì)簽署證書秧耗, 證書的有效期限由 --experimental-cluster-signing-duration 參數(shù)指定命满,簽署的證書會(huì)被附加到證書簽名請(qǐng)求中削锰。
Kubelet 會(huì)從 Kubernetes API 取回簽署的證書墙懂,并將其寫入磁盤偿枕,存儲(chǔ)位置通過 --cert-dir 參數(shù)指定年局。 然后 kubelet 會(huì)使用新的證書連接到 Kubernetes API哑子。
當(dāng)簽署的證書即將到期時(shí)漱牵,kubelet 會(huì)使用 Kubernetes API桐罕,發(fā)起新的證書簽名請(qǐng)求宁否。 同樣地缩麸,控制管理器會(huì)自動(dòng)批準(zhǔn)證書請(qǐng)求铸磅,并將簽署的證書附加到證書簽名請(qǐng)求中。 Kubelet 會(huì)從 Kubernetes API 取回簽署的證書杭朱,并將其寫入磁盤阅仔。 然后它會(huì)更新與 Kubernetes API 的連接,使用新的證書重新連接到 Kubernetes API弧械。
1)八酒、開啟證書輪換:
修改kubelet啟動(dòng)配置文件增加如下參數(shù)
在/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf增加如下參數(shù):
Environment="KUBELET_EXTRA_ARGS=--feature-gates=RotateKubeletServerCertificate=true --feature-gates=RotateKubeletClientCertificate=true"
修改kube-controller-manager.yaml配置文件
在/etc/kubernetes/manifests/kube-controller-manager.yaml 添加如下參數(shù):
- command:
- kube-controller-manager
- --experimental-cluster-signing-duration=87600h0m0s #10年
- --feature-gates=RotateKubeletServerCertificate=true
- ....
創(chuàng)建 rbac 對(duì)象
創(chuàng)建rbac對(duì)象,允許節(jié)點(diǎn)輪換kubelet server證書:
vim kubelet-ca-update.yaml
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
kubectl create -f kubelet-ca-update.yaml