k8s1.18.1用kubeadm安裝證書續(xù)期

查看k8s中所有證書的到期時間:
kubeadm alpha certs check-expiration


image.png

查看CA證書過期時間:
openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text |grep Not


image.png

查看集群證書過期時間:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '


image.png

如果集群證書還沒有過期
獲取一個創(chuàng)建好的 k8s集群的初始化配置文件
kubeadm config view > kubeadm.yaml


image.png

如果證書已經(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é)點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é)點地址
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #這里使用國內(nèi)阿里云的鏡像倉庫

或者更簡單的:

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.13.5 #--------這里改成你集群對應的版本
imageRepository: k8s.gcr.io #-------k8s官方的鏡像倉庫

重新生成默認一年時長證書
在集群已經(jīng)部署好的情況下集群的證書過期,可以選擇對證書進行重新生成。
單master或多master集群(etcd在集群內(nèi))處理:
1)、備份原先的證書文件和配置文件:
cp -rp /etc/kubernetes /etc/kubernetes.bak
2)、刪除過期的證書文件:
(注意:1.13.0以下的版本需要刪除舊的證書,不然不會重新生成,1.13.5以上的就不用操作了會自動更新的。ca.cer\ca.key\sa的這些證書不要刪除ca默認就是10年沒必要重新生成,同時kubeadm在重新生成apiserver這些組件的證書的時候需要使用ca證書來進行簽發(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ā)。
生成相應組件的證書(此格式會使用相應組件的原來的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    #我用的這個,上邊那個我的平臺運行失敗。
或如下格式(這種格式需要刪除原來存在的相應證書和key,此格式會重新創(chuà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
或如下格式重新生成相關組件的配置文件:
kubeadm init phase kubeconfig all --config kubeadm.yaml     #我用的這個

將新生成的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個容器:(一定要ps -a要不有可能服務容器沒啟動)

docker ps -a | grep -v pause | grep -E "etcd|scheduler|controller|apiserver" | awk '{print $1}' | awk '{print "docker","restart",$1}' | bash

6)、各節(jié)點重啟kubelet或相關組件:
systemctl restart kubelet

注意:若集群式采用高可用ha方式安裝的話有所區(qū)別,etd的相關證書需要另外簽發(fā)操作,要是之前搭建集群的時候已經(jīng)使用了長時間的則僅僅需要處理k8s其它組件的證書即可。

再查看證書過期時間已經(jīng)更新了。

參考文檔
http://www.itdecent.cn/p/289c62200818
https://www.cnblogs.com/skymyyang/p/11093686.html
https://blog.51cto.com/u_12988868/2587697
http://www.itdecent.cn/p/cdffaff82a34


客戶端kubelet證書輪換自動續(xù)期:

kubectl證書輪換是在當前證書即將過期時,將自動生成新的密鑰,并從k8s api申請新的證書。

kubelet 進程接收 --rotate-certificates 參數(shù),該參數(shù)決定 kubelet 在當前使用的證書即將到期時,是否會自動申請新的證書。 由于證書輪換是 beta 特性,必須通過參數(shù) --feature-gates=RotateKubeletClientCertificate=true 進行啟用。

kube-controller-manager 進程接收 --experimental-cluster-signing-duration 參數(shù),該參數(shù)控制證書簽發(fā)的有效期限。
當 kubelet 啟動時,如被配置為自舉(使用--bootstrap-kubeconfig 參數(shù)),kubelet 會使用其初始證書連接到 Kubernetes API ,并發(fā)送證書簽名的請求。 可以通過以下方式查看證書簽名請求的狀態(tài):

$kubectl get csr

最初,來自節(jié)點上 kubelet 的證書簽名請求處于 Pending 狀態(tài)。 如果證書簽名請求滿足特定條件, 控制管理器會自動批準,此時請求會處于 Approved 狀態(tài)。 接下來,控制器管理器會簽署證書, 證書的有效期限由 --experimental-cluster-signing-duration 參數(shù)指定,簽署的證書會被附加到證書簽名請求中。

Kubelet 會從 Kubernetes API 取回簽署的證書,并將其寫入磁盤,存儲位置通過 --cert-dir 參數(shù)指定。 然后 kubelet 會使用新的證書連接到 Kubernetes API。

當簽署的證書即將到期時,kubelet 會使用 Kubernetes API,發(fā)起新的證書簽名請求。 同樣地,控制管理器會自動批準證書請求,并將簽署的證書附加到證書簽名請求中。 Kubelet 會從 Kubernetes API 取回簽署的證書,并將其寫入磁盤。 然后它會更新與 Kubernetes API 的連接,使用新的證書重新連接到 Kubernetes API。

1)、開啟證書輪換:

修改kubelet啟動配置文件增加如下參數(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 對象
創(chuàng)建rbac對象,允許節(jié)點輪換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

參考文章http://www.itdecent.cn/p/289c62200818

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容