经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
修改kubeadm证书过期时间及更新k8s集群证书
来源:cnblogs  作者:亚里士多智  时间:2024/8/26 9:17:42  对本文有异议

一、为什么要修改 kubeadm 证书时间

Kubernetes 官方提供了 kubeadm 工具安装 kubernetes 集群,使用这个工具安装集群非常便捷,使部署和升级 Kubernetes 变得简单起来。

不过该工具有点坑的就是,使用其安装的 kubernetes 集群的大部分证书有效期只有一年,需要在证书过期前,使用更新操作更新集群,使证书的有效期再续一年。如果忘记这个操作,那么在使用过程中证书到期将导致集群不可用,应用无法访问,急急忙忙解决也需要半天时间,这个问题是致命的。

不过实际情况下,在现网环境中大部分人追求稳定,一般不会大改 Kubernetes 版本,所以解决 kubeadm 集群证书有效期只有一年的最好办法就是重新编译 kubeadm 源码,将里面的 1 年有效期修改为 10 年或者 100 年,也不会影响使用 kubeadm 后续的升级,所以修改源码能很好的规避这个证书过期风险。

二、如何查看 kubernetes 证书过期时间

在执行修改 Kubeadm 源码且重新编译之前,我们先通观察下使用的官方的 Kubeadm 工具初始化的 Kubernetes 集群,观察在默认情况下证书过期时间,执行的命令如下:

  1. $ kubeadm alpha certs check-expiration
  2. 然后可以看到输出的过期时间如下:
  3. CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
  4. admin.conf Aug 14, 2022 03:15 UTC 364d no
  5. apiserver Aug 14, 2022 03:15 UTC 364d ca no
  6. apiserver-etcd-client Aug 14, 2022 03:15 UTC 364d etcd-ca no
  7. apiserver-kubelet-client Aug 14, 2022 03:15 UTC 364d ca no
  8. controller-manager.conf Aug 14, 2022 03:15 UTC 364d no
  9. etcd-healthcheck-client Aug 14, 2022 03:15 UTC 364d etcd-ca no
  10. etcd-peer Aug 14, 2022 03:15 UTC 364d etcd-ca no
  11. etcd-server Aug 14, 2022 03:15 UTC 364d etcd-ca no
  12. front-proxy-client Aug 14, 2022 03:15 UTC 364d front-proxy-ca no
  13. scheduler.conf Aug 14, 2022 03:15 UTC 364d no
  14. CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
  15. ca Aug 14, 2031 03:15 UTC 9y no
  16. etcd-ca Aug 14, 2031 03:15 UTC 9y no
  17. front-proxy-ca Aug 14, 2031 03:15 UTC 9y no

从上面可以了解到,默认情况下 ETCD 证书有效期是 10 年时间,其它证书有效期为 1 年时间,所以如果我们安装集群时没有修改证书过期时间,那么默认 1 年后可能会出现证书过期集群不可用的问题,所以接下来我们进入修改 kubeadm 源码过程。

三、修改 kubeadm 源码并重新编译

3.1 安装 Golang 等编译源码的环境包
由于 Kubeadm 是 Go 语言编写的,所以我们提前安装好编译 Kubeadm 源码的工具,操作过程按下面执行即可:

(1) 安装编译工具

  1. $ yum install -y gcc make rsync jq

(2) 下载并配置 Golang 环境

  1. ## 下载 golang 1.15.15
  2. $ wget https://dl.google.com/go/go1.15.15.linux-amd64.tar.gz
  3. ## 解压并放置在一个目录中
  4. $ tar zxvf go1.15.15.linux-amd64.tar.gz -C /usr/local
  5. ## 编辑 /etc/profile 文件,添加 Go 环境配置内容
  6. $ vi /etc/profile
  7. export GOROOT=/usr/local/go
  8. export GOPATH=/usr/local/gopath
  9. export PATH=$PATH:$GOROOT/bin
  10. ## 使配置生效
  11. $ source /etc/profile
  12. ## 测试 Go 命令是否配置成功,成功则显示如下
  13. $ go version
  14. go version go1.15.15 linux/amd64

3.2 下载 kubernetes 源码
下载 Kubernetes 源码,然后切换到指定版本,操作的命令如下:

  1. ## 下的 kubernetes 源码
  2. $ git clone https://github.com/kubernetes/kubernetes.git
  3. ## 进入 Kubernetes 目录
  4. $ cd kubernetes
  5. ## 切换 Kubernetes 版本
  6. $ git checkout v1.20.9

3.3 修改 kubeadm 源码中证书过期时间
接下来我们修改 Kubernetes 代码中与 kubeadm 证书有效期相关的源码,操作的命令如下:

(1) 修改 constants.go 文件,操作如下:

  1. $ vim cmd/kubeadm/app/constants/constants.go
  2. ########### 后面追加个 * 100 (注掉部分为源代码,后面跟着的是修改后的代码)
  3. #const duration365d = time.Hour * 24 * 365
  4. const duration365d = time.Hour * 24 * 365 * 100
  5. // Config contains the basic fields required for creating a certificate
  6. type Config struct {
  7. CommonName string
  8. Organization []string
  9. AltNames AltNames
  10. Usages []x509.ExtKeyUsage
  11. }

(2) 修改 cert.go 文件,操作如下:

  1. $ vim staging/src/k8s.io/client-go/util/cert/cert.go
  2. ########### 修改10年为100年(注掉部分为源代码,后面跟着的是修改后的代码)
  3. #NotAfter: now.Add(duration365d * 10).UTC(),
  4. NotAfter: now.Add(duration365d * 100).UTC(),
  5. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
  6. BasicConstraintsValid: true,
  7. IsCA: true,
  8. ......

3.4 执行 kubeadm 编译
使用 make 命令编译 kubeadm, 执行的命令如下:

  1. $ make all WHAT=cmd/kubeadm GOFLAGS=-v

编译成功后的 kubeadm 会放到当前目录中的 ./_output/local/bin/linux/amd64/ 目录中,我们进入到该文件下,查看是否有对应的文件。

  1. ## 进入
  2. $ cd ./_output/local/bin/linux/amd64/
  3. ## 查看文件列表
  4. $ ls -l
  5. -rwxr-xr-x 10:03 conversion-gen
  6. -rwxr-xr-x 10:03 deepcopy-gen
  7. -rwxr-xr-x 10:03 defaulter-gen
  8. -rwxr-xr-x 10:03 go2make
  9. -rwxr-xr-x 10:04 go-bindata
  10. -rwxr-xr-x 10:04 kubeadm
  11. -rwxr-xr-x 10:47 kubectl
  12. -rwxr-xr-x 10:34 kubelet
  13. -rwxr-xr-x 10:04 openapi-gen
  14. -rwxr-xr-x 10:03 prerelease-lifecycle-gen

四、续签证书

4.1 备份数据

  1. kubectl -n kube-system get cm kubeadm-config -o yaml > kubeadm-config.yaml
  2. $ cp -rp /etc/kubernetes /root/kubernetes_$(date +%F)
  3. $ ls /etc/kubernetes_2024-08-25/
  4. admin.conf controller-manager.conf kubelet.conf manifests pki scheduler.conf

4.2 续签证书

  • 查看证书到期时间
  1. $ kubeadm alpha certs check-expiration
  2. [check-expiration] Reading configuration from the cluster...
  3. [check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
  4. CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
  5. admin.conf Feb 17, 2025 02:26 UTC 175d no
  6. apiserver Feb 17, 2025 02:26 UTC 175d ca no
  7. apiserver-etcd-client Feb 17, 2025 02:26 UTC 175d etcd-ca no
  8. apiserver-kubelet-client Feb 17, 2025 02:26 UTC 175d ca no
  9. controller-manager.conf Feb 17, 2025 02:26 UTC 175d no
  10. etcd-healthcheck-client Feb 17, 2025 02:26 UTC 175d etcd-ca no
  11. etcd-peer Feb 17, 2025 02:26 UTC 175d etcd-ca no
  12. etcd-server Feb 17, 2025 02:26 UTC 175d etcd-ca no
  13. front-proxy-client Feb 17, 2025 02:26 UTC 175d front-proxy-ca no
  14. scheduler.conf Feb 17, 2025 02:26 UTC 175d no
  15. CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
  16. ca Feb 06, 2033 02:38 UTC 8y no
  17. etcd-ca Feb 06, 2033 02:38 UTC 8y no
  18. front-proxy-ca Feb 06, 2033 02:38 UTC 8y no
  • 续签所有证书
  1. ./kubeadm alpha certs renew all
  • 更新kubeconfig证书
  1. $ mv $HOME/.kube/config $HOME/.kube/config.old
  2. $ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. $ chown $(id -u):$(id -g) $HOME/.kube/config
  • 再次查看证书到期时间
  1. $ kubeadm alpha certs check-expiration
  2. [check-expiration] Reading configuration from the cluster...
  3. [check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
  4. CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
  5. admin.conf Aug 01, 2124 02:58 UTC 99y no
  6. apiserver Aug 01, 2124 02:58 UTC 99y ca no
  7. apiserver-etcd-client Aug 01, 2124 02:58 UTC 99y etcd-ca no
  8. apiserver-kubelet-client Aug 01, 2124 02:58 UTC 99y ca no
  9. controller-manager.conf Aug 01, 2124 02:58 UTC 99y no
  10. etcd-healthcheck-client Aug 01, 2124 02:58 UTC 99y etcd-ca no
  11. etcd-peer Aug 01, 2124 02:58 UTC 99y etcd-ca no
  12. etcd-server Aug 01, 2124 02:58 UTC 99y etcd-ca no
  13. front-proxy-client Aug 01, 2124 02:58 UTC 99y front-proxy-ca no
  14. scheduler.conf Aug 01, 2124 02:58 UTC 99y no
  15. CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
  16. ca Feb 06, 2033 02:38 UTC 8y no
  17. etcd-ca Feb 06, 2033 02:38 UTC 8y no
  18. front-proxy-ca Feb 06, 2033 02:38 UTC 8y no

完成后重启 kube-api server、kube-controller、kube-scheduler、etcd 这 4 个容器即可,我们可以查看 apiserver 的证书的有效期来验证是否更新成功:

  1. $ echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate
  2. notAfter=Aug 1 02:58:33 2124 GMT

可以看到现在的有效期是100年以后,证明已经更新成功。

  • 也可以直接获取所有证书的过期时间
  1. $ for item in `find /etc/kubernetes/pki -maxdepth 2 -name "*.crt"`;do openssl x509 -in $item -text -noout| grep Not;echo ======================$item===============;done
  2. Not Before: Feb 9 02:38:42 2023 GMT
  3. Not After : Feb 6 02:38:42 2033 GMT
  4. ======================/etc/kubernetes/pki/front-proxy-ca.crt===============
  5. Not Before: Feb 9 02:38:43 2023 GMT
  6. Not After : Aug 1 02:58:33 2124 GMT
  7. ======================/etc/kubernetes/pki/apiserver-etcd-client.crt===============
  8. Not Before: Feb 9 02:38:41 2023 GMT
  9. Not After : Feb 6 02:38:41 2033 GMT
  10. ======================/etc/kubernetes/pki/ca.crt===============
  11. Not Before: Feb 9 02:38:41 2023 GMT
  12. Not After : Aug 1 02:58:34 2124 GMT
  13. ======================/etc/kubernetes/pki/apiserver-kubelet-client.crt===============
  14. Not Before: Feb 9 02:38:41 2023 GMT
  15. Not After : Aug 1 02:58:33 2124 GMT
  16. ======================/etc/kubernetes/pki/apiserver.crt===============
  17. Not Before: Feb 9 02:38:42 2023 GMT
  18. Not After : Aug 1 02:58:36 2124 GMT
  19. ======================/etc/kubernetes/pki/front-proxy-client.crt===============
  20. Not Before: Feb 9 02:38:43 2023 GMT
  21. Not After : Aug 1 02:58:36 2124 GMT
  22. ======================/etc/kubernetes/pki/etcd/server.crt===============
  23. Not Before: Feb 9 02:38:43 2023 GMT
  24. Not After : Aug 1 02:58:35 2124 GMT
  25. ======================/etc/kubernetes/pki/etcd/peer.crt===============
  26. Not Before: Feb 9 02:38:43 2023 GMT
  27. Not After : Feb 6 02:38:43 2033 GMT
  28. ======================/etc/kubernetes/pki/etcd/ca.crt===============
  29. Not Before: Feb 9 02:38:43 2023 GMT
  30. Not After : Aug 1 02:58:34 2124 GMT
  31. ======================/etc/kubernetes/pki/etcd/healthcheck-client.crt===============
  • 高可用k8s master节点需要将以下证书拷贝至其他master节点并重启 kube-api server、kube-controller、kube-scheduler、etcd 4 个容器。
  1. cp /root/etc/kubernetes/pki/ca.* /etc/kubernetes/pki/
  2. cp /root/etc/kubernetes/pki/sa.* /etc/kubernetes/pki/
  3. cp /root/etc/kubernetes/pki/front-proxy-ca.* /etc/kubernetes/pki/
  4. cp /root/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf
  5. cp /etc/kubernetes/admin.conf /root/.kube/config

部分转载至 http://www.mydlq.club/article/118/

原文链接:https://www.cnblogs.com/wiseo/p/18378947/k8s_certificate

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号