更新一个10年有效期的 Kubernetes 证书
使用 kubeadm 安装 kubernetes 集群非常方便,但是也有一个比较烦人的问题就是默认的证书有效期只有一年时间,所以需要考虑证书升级的问题,本文的演示集群版本为 v1.17.0 版本,不保证下面的操作对其他版本也适用,在操作之前一定要先对证书目录进行备份,防止操作错误进行回滚。本文主要介绍两种方式来更新集群证书。
##手动更新证书
该命令显示 /etc/kubernetes/pki 文件夹中的客户端证书以及 kubeadm 使用的 KUBECONFIG 文件中嵌入的客户端证书的到期时间/剩余时间。
kubeadm 不能管理由外部 CA 签名的证书,如果是外部得证书,需要自己手动去管理证书的更新。
另外需要说明的是上面的列表中没有包含 kubelet.conf,因为 kubeadm 将 kubelet 配置为自动更新证书。
另外 kubeadm 会在控制面板升级的时候自动更新所有证书,所以使用 kubeadm 搭建得集群最佳的做法是经常升级集群,这样可以确保你的集群保持最新状态并保持合理的安全性。但是对于实际的生产环境我们可能并不会去频繁得升级集群,所以这个时候我们就需要去手动更新证书
要手动更新证书也非常方便,我们只需要通过 kubeadm alpha certs renew 命令即可更新你的证书,这个命令用 CA(或者 front-proxy-CA )证书和存储在 /etc/kubernetes/pki 中的密钥执行更新。
如果你运行了一个高可用的集群,这个命令需要在所有控制面板节点上执行。
接下来我们来更新我们的集群证书,下面的操作都是在 master 节点上进行,首先备份原有证书:
[root@k8s-1 ~]#
mkdir /etc/kubernetes.bak
[root@k8s-1 ~]#
cp -r /etc/kubernetes/pki/ /etc/kubernetes.bak/
[root@k8s-1 ~]#
cp /etc/kubernetes/*.conf /etc/kubernetes.bak/
然后备份 etcd 数据目录:
[root@k8s-1 ~]# cp -r /var/lib/etcd /var/lib/etcd.bak
然后更新证书
通过上面的命令证书就一键更新完成了,这个时候查看上面的证书可以看到过期时间已经是一年后的时间了:
然后记得更新下 kubeconfig 文件:
将新生成的 admin 配置文件覆盖掉原本的 admin 文件:
[root@k8s-1 ~]# mv $HOME/.kube/config $HOME/.kube/config.old
[root@k8s-1 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-1 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
完成后重启 kube-apiserver、kube-controller、kube-scheduler、etcd 这4个容器即可,我们可以查看 apiserver 的证书的有效期来验证是否更新成功:
[root@k8s-1 ~]# echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate
notAfter=Oct 21 07:19:04 2021 GMT
可以看到现在的有效期是一年过后的,证明已经更新成功了。
##用 Kubernetes 证书 API 更新证书
除了上述的一键手动更新证书之外,还可以使用 Kubernetes 证书 API 执行手动证书更新。对于线上环境我们可能并不会去冒险经常更新集群或者去更新证书,这些毕竟是有风险的,所以我们希望生成的证书有效期足够长,虽然从安全性角度来说不推荐这样做,但是对于某些场景下一个足够长的证书有效期也是非常有必要的。有很多管理员就是去手动更改 kubeadm 的源码为10年,然后重新编译来创建集群,这种方式虽然可以达到目的,但是不推荐使用这种方式,特别是当你想要更新集群的时候,还得用新版本进行更新。其实 Kubernetes 提供了一种 API 的方式可以来帮助我们生成一个足够长证书有效期。
要使用内置的 API 方式来签名,首先我们需要配置 kube-controller-manager 组件的 --experimental-cluster-signing-duration 参数,将其调整为10年,我们这里是 kubeadm 安装的集群,所以直接修改静态 Pod 的 yaml 文件即可:
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
修改完成后 kube-controller-manager 会自动重启生效。然后我们需要使用下面的命令为 Kubernetes 证书 API 创建一个证书签名请求。如果您设置例如 cert-manager 等外部签名者,则会自动批准证书签名请求(CSRs)。否者,您必须使用 kubectl certificate 命令手动批准证书。以下 kubeadm 命令输出要批准的证书名称,然后等待批准发生:
$ kubeadm alpha certs renew all --use-api --config kubeadm.yaml &
输出类似于以下内容:
然后接下来我们需要去手动批准证书:
[root@k8s-1 ~]# kubectl get csr
NAME AGE REQUESTOR CONDITION
kubeadm-cert-kube-apiserver-dcc55 88s kubernetes-admin Pending
kubeadm-cert-kubernetes-admin-r54fc 5m18s kubernetes-admin Pending
kubeadm-cert-kubernetes-admin-x4qjq 2m52s kubernetes-admin Approved,Issued
手动批准证书
$ kubectl certificate approve kubeadm-cert-kubernetes-admin-r54fc
certificatesigningrequest.certificates.k8s.io/kubeadm-cert-kubernetes-admin-pn99f approved
每更新完一个csr会生成一个新的csr
用同样的方式为处于 Pending 状态的 csr 执行批准操作,直到所有的 csr 都批准完成为止。最后所有的 csr 列表状态如下所示:
批准完成后检查证书的有效期:
我们可以看到已经延长小10年了,这是因为 ca 证书的有效期只有10年。
但是现在我们还不能直接重启控制面板的几个组件,这是因为使用 kubeadm 安装的集群对应的 etcd 默认是使用的 /etc/kubernetes/pki/etcd/ca.crt 这个证书进行前面的,而上面我们用命令 kubectl certificate approve 批准过后的证书是使用的默认的 /etc/kubernetes/pki/ca.crt 证书进行签发的,所以我们需要替换 etcd 中的 ca 机构证书:
##先拷贝静态 Pod 资源清单
[root@k8s-1 ~]# cp -r /etc/kubernetes/manifests/ /etc/kubernetes/manifests.bak
[root@k8s-1 ~]# vim /etc/kubernetes/manifests/etcd.yaml
由于 kube-apiserver 要连接 etcd 集群,所以也需要重新修改对应的 etcd ca 文件:
[root@k8s-1 ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
除此之外还需要替换 requestheader-client-ca-file 文件,默认是 /etc/kubernetes/pki/front-proxy-ca.crt 文件,现在也需要替换成默认的 CA 文件,否则使用聚合 API,比如安装了 metrics-server 后执行 kubectl top 命令就会报错:
[root@k8s-1 ~]# cp /etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/front-proxy-ca.crt
[root@k8s-1 ~]# cp /etc/kubernetes/pki/ca.key /etc/kubernetes/pki/front-proxy-ca.key
由于是静态 Pod,修改完成后上面的组件都会自动重启生效。由于我们当前版本的 kubelet 默认开启了证书自动轮转,所以 kubelet 的证书也不用再去管理了,这样我就将证书更新成10有效期了。在操作之前一定要先对证书目录进行备份,防止操作错误进行回滚。
- kubernetes_01_kubeadm方式安装_02_apiserver证书默认有效期修改_kubeadm重新编译_20191023
- 一个快速获取/更新 Let's encrypt 证书的 shell script
- Kubernetes K8S之SSL证书有效期修改
- 一个快速获取/更新 Let's encrypt 证书的 shell script
- Kubernetes K8S之SSL证书有效期修改
- 解决kubernetes默认证书1年有效期问题
- oracle 用一个表的多个字段更新另一个表对应的多个字段
- mac系统接usb键盘的快捷键操作,学习一个更新一个。
- 操作必须使用一个可更新的查询
- ACCESS数据库在IIS中的问题 错误提示"操作必须使用一个可更新的查询"
- 系分/高程证书也就一个作用不大的敲门砖,不考也罢
- 在.net3.0 winfx程序的“数字证书”有效期延长问题
- HTML 5 应用程序缓存(Application Cache)cache manifest 文件使用 html5 中创建manifest缓存以及更新方法 一个manifest文件会创建一份缓存,不同的manifest文件其缓存的内容是互不干扰的
- 更新Android SDK之后Eclipse提示SDK版本过低的一个简易解决办法
- 用钩子程序实现根据一个表的字段更新另一个表的字段
- Kubernetes汇总 ~ 持续更新
- 一个苹果证书供多台电脑开发使用——导出p12文件
- 《Lucene、webservice、(svn_ant_maven)、DWR、Freemarker、POI视频教程》更新了Spring、JAXWs的整合并且完成了一个小项目
- 蓝瘦香茹~win10开发版,这次更新就是一个完全安装
- 一个CCIE对证书的诠释