前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes集群证书过期解决办法

Kubernetes集群证书过期解决办法

作者头像
jwangkun
发布2021-12-23 16:50:06
4.5K0
发布2021-12-23 16:50:06
举报
文章被收录于专栏:John Wong's BlogJohn Wong's Blog

问题现象

K8S集群证书过期后,会导无法创建Pod,通过kubectl get nodes也无法获取信息,甚至dashboard也无法访问。

一、确认K8S证书过期时间

查看k8s某一证书过期时间:

代码语言:javascript
复制
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not

显示如下,通过下面可看到证书有效期是1年,从2021到2022年:

img
img

其它证书同理,K8s各个证书过期时间如下:

代码语言:javascript
复制
/etc/kubernetes/pki/apiserver.crt           #1年有效期
/etc/kubernetes/pki/front-proxy-ca.crt        #10年有效期
/etc/kubernetes/pki/ca.crt              #10年有效期
/etc/kubernetes/pki/apiserver-etcd-client.crt    #1年有效期
/etc/kubernetes/pki/front-proxy-client.crt      #1年有效期
/etc/kubernetes/pki/etcd/server.crt         #1年有效期
/etc/kubernetes/pki/etcd/ca.crt           #10年有效期
/etc/kubernetes/pki/etcd/peer.crt          #1年有效期
/etc/kubernetes/pki/etcd/healthcheck-client.crt  #1年有效期
/etc/kubernetes/pki/apiserver-kubelet-client.crt  #1年有效期

或使用统一命令查看

代码语言:javascript
复制
kubeadm alpha certs check-expiration

二、使用延长证书过期的方法解决K8S证书过期问题

K8S在过期之前,使用kubeadm alpha phase里的certs和kubeconfig命令,同时配合kubelet证书自动轮换机制来解决这个问题(具体操作可以百度搜索),这里介绍证书已经过期的解决方法,以下延长证书过期的方法适合kubernetes1.14、1.15、1.16、1.17、1.18版本。操作步骤如下:

2.1 下载update-kubeadm-cert.sh

https://github.com/yuyicai/update-kube-cert

2.2 把update-kubeadm-cert.sh文件上传到k8s各节点任意位置

2.3 在每个节点都执行如下命令

1)给update-kubeadm-cert.sh证书授权可执行权限

代码语言:javascript
复制
chmod +x update-kubeadm-cert.sh

2)执行下面命令,修改证书过期时间,把时间延长到10年

代码语言:javascript
复制
./update-kubeadm-cert.sh all

3)在master节点查询Pod是否正常,能查询出数据说明证书签发完成

注:执行命令时需要断开连接重新连接命令才生效

代码语言:javascript
复制
kubectl  get pods -n kube-system

显示如下,能够看到pod信息,说明证书签发正常:

img
img

4)重启kubelet

代码语言:javascript
复制
systemctl restart kubelet

三、验证证书有效时间是否延长到10年

代码语言:javascript
复制
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text  | grep Not

显示如下,通过下面可看到apiserver证书有效期是10年,从2021到2031年:

img
img

其它证书同理进行验证,或使用统一查看命令

代码语言:javascript
复制
kubeadm alpha certs check-expiration
img
img

1. 只更新 master 证书

小于等于 v1.9 版本,etcd 默认不使用 TLS 连接,没有 etcd 相关证书,只需要更新 master 证书即可

如果有多个 master 节点,在每个 master 节点都执行一次

代码语言:javascript
复制
./update-kubeadm-cert.sh master

将更新以下 master 证书和 kubeconfig 配置文件

代码语言:javascript
复制
/etc/kubernetes
├── admin.conf
├── controller-manager.conf
├── scheduler.conf
├── kubelet.conf
└── pki
    ├── apiserver.crt
    ├── apiserver-kubelet-client.crt
    └── front-proxy-client.crt

2. 使用脚本处理后证书是延续 10 年吗?

准确来说并不是

kubeadm 签发的 CA 默认有效期是 10 年 (从 init 集群那一刻开始算),当 CA 到期后,整套证书体系都失效了

也就是说,10 年有效期是从 init 集群那一刻开始算的,不是从执行脚本更新证书那一刻开始算

3. kubeadm 证书相关命令发展

  • v1.8 版开始提供了证书生成命令 kubeadm alpha phase certs <cert_name>
  • v1.13 版开始证书生成命令改为 kubeadm init phase certs <cert_name>
  • v1.15 版增加了证书更新命令 kubeadm alpha certs renew <cert_name>(这个命令与上面两个区别是:上面两个是生成证书,这个是更新证书),v1.15 版之后可使用 kubeadm alpha certs renew <cert_name> 来更新证书

4. kubeadm 命令更新证书手动处理

使用该脚本更新证书,不涉及下面这个 bug,无需手动处理

bug 见 https://github.com/kubernetes/kubeadm/issues/1753 ,这个bug 在 1.17 版修复

针对小于 1.17版本 ,使用 kubeadm alpha certs renew <cert_name> 来更新证书

kubeadm alpha certs renew 并不会更新 kubelet 证书(kubelet.conf 文件里面写的客户端证书),因为 kubelet 证书是默认开启自动轮回更新的,但是在执行 kubeadm init 的 master 节点的 kubelet.conf 文件里面的证书是以 base64 编码写死的 (类似 controller-manager.conf 里面的证书)

在用 kubeadm 命令更新 master 证书时需要手动将 kubelet.conf 文件的 client-certificate-dataclient-key-data 改为:

代码语言:javascript
复制
client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
client-key: /var/lib/kubelet/pki/kubelet-client-current.pem

5. 更新slave证书

v1.7.5版本使用 #1 中./update-kubeadm-cert.sh master,没有自动更新 slave 节点。(高版本不会出现这个问题,会自动更新 slave 节点)。

slave 中具体报错为Failed to list *v1.Pod: the server has asked for the client to provide credentials (get pods)

解决办法: 在 master 中查看 token, 在 slave 中使用 kubeadm join

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题现象
  • 一、确认K8S证书过期时间
  • 二、使用延长证书过期的方法解决K8S证书过期问题
    • 2.1 下载update-kubeadm-cert.sh
      • 2.2 把update-kubeadm-cert.sh文件上传到k8s各节点任意位置
        • 2.3 在每个节点都执行如下命令
          • 1)给update-kubeadm-cert.sh证书授权可执行权限
          • 2)执行下面命令,修改证书过期时间,把时间延长到10年
          • 3)在master节点查询Pod是否正常,能查询出数据说明证书签发完成
          • 4)重启kubelet
      • 三、验证证书有效时间是否延长到10年
      • 1. 只更新 master 证书
      • 2. 使用脚本处理后证书是延续 10 年吗?
      • 3. kubeadm 证书相关命令发展
      • 4. kubeadm 命令更新证书手动处理
      • 5. 更新slave证书
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档