linux怎么查看本机内存大小
370
2022-09-07
Kubernetes Kubeadm Kubelet 证书自动续签
Kubelet 证书自动续签
K8s证书一般分为两套:K8s组件(apiserver)和Etcd,假如按角色来分,证书分为管理节点和工作节点。
• 管理节点:如果是kubeadm部署则自动生成,如果是二进制部署一般由cfssl或者openssl生成。
• 工作节点:工作节点主要是指kubelet连接apiserver所需的客户端证书,这个证书由controller-manager组件自动颁发,默认是一年,如果到期,kubelet将无法使用过期的证书连接apiserver,从而导致无法正常工作,日志会给出证书过期错误(x509: certificate has expired or is not yet valid)(工作节点容易忽略掉证书有效期)
二进制,这个是k8s apiserver的一套证书
[root@k8s-master ~]# ls /opt/kubernetes/ssl/ca-key.pem kubelet-client-2020-09-30-11-12-16.pem kubelet.crt server-key.pemca.pem kubelet-client-current.pem kubelet.key server.pem
这个是apiserver连接etcd所需要的证书
[root@k8s-master ~]# ls /opt/etcd/ssl/ca-key.pem ca.pem server-key.pem server.pem
kubeadm部署的两套证书都放在这里
[root@k8s-master ~]# ls /etc/kubernetes/pki/apiserver.crt etcdapiserver-etcd-client.crt front-proxy-ca.crtapiserver-etcd-client.key front-proxy-ca.keyapiserver.key front-proxy-client.crtapiserver-kubelet-client.crt front-proxy-client.keyapiserver-kubelet-client.key sa.keyca.crt sa.pubca.key
Apiserver也是需要就会出现证书过期的情况。
红线:K8s自建证书颁发机构(CA),需携带由它生成的客户端证书访问apiserver
蓝色:Etcd自建证书颁发机构(CA),需携带由它生成的客户端证书访问etcd
自签证书和机构证书不同:加密强度不同和浏览器显示的不一样
证书是要配置在组件上面,这三个组件是管理节点部署的
Kube-apiserver controller-manager scheduler
工作节点
Kubelet kube-proxy
如果Kube-apiserver controller-manager scheduler这三个组件部署在一块,那么都是使用非安全端口去访问,也就是apiserver提供了两个端口(对本地127.0.0.1:8080,对外的就是ip:6443)
同一个机器上使用127.0.0.1:8080去连接Kube-apiserver,如果部署到其他节点通过6443
[root@k8s-master ~]# netstat -tpln | grep 8080tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 57758/kube-apiserve [root@k8s-master ~]# netstat -tpln | grep 6443tcp 0 0 192.168.179.99:6443 0.0.0.0:* LISTEN 57758/kube-apiserve[root@k8s-master ~]# kubectl get epNAME ENDPOINTS AGEkubernetes 192.168.179.99:6443 101d[root@k8s-master ~]# vim /opt/kubernetes/cfg/kube-controller-manager.conf --master=127.0.0.1:8080 \--cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \--cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \--root-ca-file=/opt/kubernetes/ssl/ca.pem \--service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \[root@k8s-master ~]# vim /opt/kubernetes/cfg/kube-scheduler.conf KUBE_SCHEDULER_OPTS="--logtostderr=false --v=2 --log-dir=/opt/kubernetes/logs --leader-elect --master=127.0.0.1:8080 --bind-address=127.0.0.1"
如果不在那么必须走6443连接apiserver,也就涉及到使用证书去连接
Apiserver去访问etcd也要携带证书去访问,所以要在Apiserver当中配置etcd的证书
[root@k8s-master ~]# cat /opt/kubernetes/cfg/kube-apiserver.conf --etcd-servers=\--etcd-cafile=/opt/etcd/ssl/ca.pem \--etcd-certfile=/opt/etcd/ssl/server.pem \--etcd-keyfile=/opt/etcd/ssl/server-key.pem \
上面是组件访问的关系,红线的都是使用一套证书,即k8s自签证书颁发的证书。因为访问控制就是基于证书进行授权的
Kubelet 证书自动续签
Kubeadm没有提供设置证书时间的参数,有效期是一年,获取集群证书过期时间
容易过期的是ca证书派发出来的证书文件,这里的过期时间是客户端的证书。(因为ca证书有效期是10年,足够用了,主要过期的是ca派发出来的证书)
[root@k8s-master ~]# kubeadm alpha certs check-expiration[check-expiration] Reading configuration from the cluster...[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGEDadmin.conf Nov 15, 2021 06:56 UTC 263d no apiserver Nov 15, 2021 06:56 UTC 263d ca no apiserver-etcd-client Nov 15, 2021 06:56 UTC 263d etcd-ca no apiserver-kubelet-client Nov 15, 2021 06:56 UTC 263d ca no controller-manager.conf Nov 15, 2021 06:56 UTC 263d no etcd-healthcheck-client Nov 15, 2021 06:56 UTC 263d etcd-ca no etcd-peer Nov 15, 2021 06:56 UTC 263d etcd-ca no etcd-server Nov 15, 2021 06:56 UTC 263d etcd-ca no front-proxy-client Nov 15, 2021 06:56 UTC 263d front-proxy-ca no scheduler.conf Nov 15, 2021 06:56 UTC 263d no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGEDca Nov 13, 2030 06:56 UTC 9y no etcd-ca Nov 13, 2030 06:56 UTC 9y no front-proxy-ca Nov 13, 2030 06:56 UTC 9y no
一年之后要更新集群的版本或者更新证书
kubeadm alpha certs renew对证书升级重新续约证书或者升级k8s版本kubeadm upgrade,在升级版本的时候会续签一年,最好一年升级一次
二进制部署方式
如果你采用的二进制方式部署,已经配置了默认是5年,所以在5年之前不会出现证书过期的问题。找一台节点查看∶
[root@k8s-master ssl]# lsca-key.pem kubelet-client-2022-03-25-21-23-51.pem kubelet.crt server-key.pemca.pem kubelet-client-current.pem kubelet.key server.pem[root@k8s-master ssl]# openssl x509 -in kubelet-client-current.pem -noout -datesnotBefore=Mar 25 13:18:51 2022 GMTnotAfter=Mar 24 11:58:00 2027 GMT[root@k8s-master ssl]# pwd/opt/kubernetes/ssl
启用 TLS Bootstrapping 机制
TLS Bootstraping:Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。为了简化流程,Kubernetes引入了TLS bootstraping机制来自动颁发客户端证书,kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署。所以强烈建议在Node上使用这种方式,目前主要用于kubelet,kube-proxy还是由我们统一颁发一个证书。
TLS bootstraping 工作流程:
kubeadm 部署方式续签
先看 下kubeadm 客户端证书过期时间:
[root@k8s-master ~]# kubeadm alpha certs check-expiration[check-expiration] Reading configuration from the cluster...[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGEDadmin.conf Nov 15, 2021 06:56 UTC 263d no apiserver Nov 15, 2021 06:56 UTC 263d ca no apiserver-etcd-client Nov 15, 2021 06:56 UTC 263d etcd-ca no apiserver-kubelet-client Nov 15, 2021 06:56 UTC 263d ca no controller-manager.conf Nov 15, 2021 06:56 UTC 263d no etcd-healthcheck-client Nov 15, 2021 06:56 UTC 263d etcd-ca no etcd-peer Nov 15, 2021 06:56 UTC 263d etcd-ca no etcd-server Nov 15, 2021 06:56 UTC 263d etcd-ca no front-proxy-client Nov 15, 2021 06:56 UTC 263d front-proxy-ca no scheduler.conf Nov 15, 2021 06:56 UTC 263d no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGEDca Nov 13, 2030 06:56 UTC 9y no etcd-ca Nov 13, 2030 06:56 UTC 9y no front-proxy-ca Nov 13, 2030 06:56 UTC 9y no
kubeadm alpha renew all 或者 升级k8s 版本 kubeadm upgrade 官方推荐,一年之内升级一次集群版本,还有个民间方法:修改源代码,再编译生成kubeadm
1、配置kube-controller-manager 组件,从新为kubelet客户端证书颁发(如果已配置请忽略) 2、开启kubelet 证书轮转(如果已配置请忽略) 3、修改node节点时间,重启kubelet
(1)配置kube-controller-manager 组件
- --experimental-cluster-signing-duration=87600h0m0s 为kubelet自动颁发证书的时间,有效期是10年- --feature-gates=RotateKubeletServerCertificate=true 启用server证书颁发配置完成后,重建pod使之生效,启用证书的轮转,证书过期的话,可以自动的续签:
证书的轮转。证书过期自动续签
[root@k8s-node1 ~]# ll /var/lib/kubelet/pki/kubelet-client-current.pem lrwxrwxrwx 1 root root 59 Nov 15 15:57 /var/lib/kubelet/pki/kubelet-client-current.pem -> /var/lib/kubelet/pki/kubelet-client-2020-11-15-15-57-15.pem[root@k8s-node1 ~]# cd /var/lib/kubelet/pki/[root@k8s-node1 pki]# openssl x509 -in kubelet-client-current.pem -noout -datesnotBefore=Nov 15 07:52:15 2020 GMTnotAfter=Nov 15 07:52:15 2021 GMT
延长时间之后,那么就不需要管理kubelet这块的证书了,自动长时间就可以去使用。
可以看到证书的过期时间是一年,自动颁发过期时间是一年
[root@k8s-master ~]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml - command: - kube-controller-manager - --experimental-cluster-signing-duration=87600h0m0s - --feature-gates=RotateKubeletServerCertificate=true[root@k8s-master ~]# kubectl delete pod kube-controller-manager-k8s-master -n kube-systempod "kube-controller-manager-k8s-master" deleted
启用server证书颁发,配置完成后,重建pod使之生效:
(2)开启kubelet 证书轮转
默认kubelet证书轮转已启用:
# vi /var/lib/kubelet/config.yaml ... rotateCertificates: true
(3)修改node节点时间,重启kubelet 找一台node 节点测试,先查看现有客户端证书有效期:
[root@k8s-node1 pki]# openssl x509 -in kubelet-client-current.pem -noout -datesnotBefore=Nov 15 07:52:15 2020 GMTnotAfter=Nov 15 07:52:15 2021 GMT
为了方便测试我们,修改服务器时间,模拟证书即将到期:
[root@k8s-node1 pki]# dateTue Sep 14 00:00:02 CST 2021[root@k8s-node1 pki]# date -s "20211114"Sun Nov 14 00:00:00 CST 2021
重启kubelet 组件,他会验证当前证书有效期,并自动从kube-controller-manager 进行续签
[root@k8s-node1 pki]# systemctl restart kubelet[root@master pki]# kubectl get csrNAME AGE SIGNERNAME REQUESTOR CONDITIONcsr-vs6dp 13s kubernetes.io/kube-apiserver-client-kubelet system:node:node1 Approved,Issued[root@k8s-node1 pki]# lskubelet-client-2020-11-15-15-57-15.pem kubelet-client-current.pem kubelet.keykubelet-client-2021-11-14-00-01-42.pem kubelet.crt[root@k8s-node1 pki]# ls -l kubelet-client-current.pem lrwxrwxrwx 1 root root 59 Nov 14 00:01 kubelet-client-current.pem -> /var/lib/kubelet/pki/kubelet-client-2021-11-14-00-01-42.pem[root@k8s-node1 pki]# openssl x509 -in kubelet-client-current.pem -noout -datesnotBefore=Feb 25 01:50:14 2021 GMTnotAfter=Nov 13 06:56:26 2030 GMT
可以看到这就是10年的时间了,同样其他节点相同操作,这样长时间就不需要管kubelet是否过期了,后面只要考虑管理节点就可以。
可以看到二进制部署的好处,在证书方面是可以控制的,在部署的时候将证书的时间调大一点,在之后的时间之内,都不会出现证书相关的问题。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~