Kubernetes Kubeadm Kubelet 证书自动续签

104 篇文章 134 订阅

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.pem
ca.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                 etcd
apiserver-etcd-client.crt     front-proxy-ca.crt
apiserver-etcd-client.key     front-proxy-ca.key
apiserver.key                 front-proxy-client.crt
apiserver-kubelet-client.crt  front-proxy-client.key
apiserver-kubelet-client.key  sa.key
ca.crt                        sa.pub
ca.key

 Apiserver也是需要https去访问,etcd也一样,包括从etcd当中读写数据都要携带证书去访问

不管你是kubeadm安装的还是二进制安装的,管理节点不管证书有效期有多长5年,10年,工作节点证书有效期限都是1年, 就会出现证书过期的情况。

红线: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 8080
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      57758/kube-apiserve 

[root@k8s-master ~]# netstat -tpln | grep 6443
tcp        0      0 192.168.179.99:6443     0.0.0.0:*               LISTEN      57758/kube-apiserve

[root@k8s-master ~]# kubectl get ep
NAME         ENDPOINTS              AGE
kubernetes   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=https://192.168.179.99:2379,https://192.168.179.100:2379,https://192.168.179.101:2379 \
--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 MANAGED
admin.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 MANAGED
ca                      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]# ls
ca-key.pem  kubelet-client-2022-03-25-21-23-51.pem  kubelet.crt  server-key.pem
ca.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 GMT
notAfter=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 工作流程:

部署一套完整的Kubernetes高可用集群(二进制,最新版v1.18)上

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 MANAGED
admin.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 MANAGED
ca                      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 -dates
notBefore=Nov 15 07:52:15 2020 GMT
notAfter=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-system
pod "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 -dates
notBefore=Nov 15 07:52:15 2020 GMT
notAfter=Nov 15 07:52:15 2021 GMT

为了方便测试我们,修改服务器时间,模拟证书即将到期: 

[root@k8s-node1 pki]# date
Tue 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 csr
NAME        AGE   SIGNERNAME                                    REQUESTOR           CONDITION
csr-vs6dp   13s   kubernetes.io/kube-apiserver-client-kubelet   system:node:node1  Approved,Issued


[root@k8s-node1 pki]# ls
kubelet-client-2020-11-15-15-57-15.pem  kubelet-client-current.pem  kubelet.key
kubelet-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 -dates
notBefore=Feb 25 01:50:14 2021 GMT
notAfter=Nov 13 06:56:26 2030 GMT

可以看到这就是10年的时间了,同样其他节点相同操作,这样长时间就不需要管kubelet是否过期了,后面只要考虑管理节点就可以。

可以看到二进制部署的好处,在证书方面是可以控制的,在部署的时候将证书的时间调大一点,在之后的时间之内,都不会出现证书相关的问题。 

转载至https://blog.csdn.net/qq_34556414/article/details/114057422

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值