k8s的证书机制 证书有效期的续期和过期故障 解决
Kubernetes 证书有效期的续期和过期故障解决
Kubernetes 证书机制
Kubernetes 集群中,各个组件间通信需要以安全加密的方式通信, 而证书是保障组件间安全通信的关键
基础设施。
Kubernetes 是基于 PKI 证书实现基于 TLS 的身份验证和安全通信
Kubernetes 证书分类
https://kubernetes.io/zh-cn/docs/setup/best-practices/certificates/

Kubernetes集群内部使用双向证书实现双向认证
如果你是使用 kubeadm 安装的 Kubernetes, 则会自动生成集群所需的证书。
证书相关文件放在 /etc/kubernetes/pki/ 目录下
在 Kubernetes常见的证书主要分为三类:
- 1. CA 证书(Certificate Authority)
- 2. 服务器证书(Server Certificate)
- 3. 客户端证书(Client Certificate)
它们的作用、用途、签发关系完全不同。
三类证书核心区别
类型 作用 谁持有 谁使用它用于验证 是否用于加密通信
CA证书
签发和信任其他证书 证书颁发机构(自己) 验证服务器/客户端
证书是否合法 间接参与
服务器证书
证明“我是真实的服
务器”
apiserver、etcd、等服
务端
被客户端使用用于
验证 是
客户
端证
书
证明“我是合法客户
端”,不是陌生人
kubectl、kubelet、
scheduler等客户端
被服务端使用用于
验证 是
服务器证书
- API 服务器端点的证书 Server certificate for the API server endpoint
- etcd 服务器的服务器证书 Server certificate for the etcd server
- 每个 kubelet 的服务器证书(每个节点运行一个 kubelet) Server certificates for each kubelet (every node runs a kubelet)
- 可选的前端代理的服务器证书 Optional server certificate for the [front-proxy](
客户端证书
- 针对每个 kubelet 的客户端证书,用于 API 服务器作为 Kubernetes API 的客户端进行身份验证 Client certificates for each kubelet, used to authenticate to the API server as a client of the Kubernetes API
- 每个 API 服务器的客户端证书,用于向 etcd 进行身份验证 Client certificate for each API server, used to authenticate to etcd
- 控制器管理器与 API 服务器进行安全通信的客户端证书 Client certificate for the controller manager to securely communicate with the API server
- 调度程序与 API 服务器进行安全通信的客户端证书 Client certificate for the scheduler to securely communicate with the API server
- 客户端证书(每个节点一个),用于 kube-proxy 向 API 服务器进行身份验证 Client certificates, one for each node, for kube-proxy to authenticate to the API server
- 集群管理员向 API 服务器进行身份验证的可选客户端证书 Optional client certificates for administrators of the cluster to authenticate to the API server
- 前端代理的可选客户端证书 Optional client certificate for the front-proxy
kubelet 的服务器和客户端证书
为了建立安全连接并向 kubelet 进行身份验证,API 服务器需要客户端证书和密钥对。
在此场景中,证书的使用有两种方法:
- 共享证书:kube-apiserver 可以使用与验证其客户端相同的证书和密钥对。 这意味着现有证书 (例如 apiserver.crt 和 apiserver.key )可用于与 kubelet 服务器进行通信。
- 单独的证书:或者,kube-apiserver 可以生成新的客户端证书和密钥对,以验证其与 kubelet 服务器的通信。 在这种情况下,将创建一个名为 kubelet-client.crt 的不同证书及其对应的私钥kubelet-client.key 。
根 CA
对于一个kubernetes集群,它依赖三个CA颁发的所有相关的证书

路径 默认 CN 描述
ca.crt、key kubernetes-ca
Kubernetes 通用 CAETCD 集群的根证书
Kubernetes 集群的根证书,用于签署 API Server、
kubelet 等核心组件的证书。
所有组件默认信任此 CA,是集群信任体系的基础。
基于kubeadm安装的有效期默认10年
etcd/ca.crt、key etcd-ca
与 etcd 相关的所有功能
用于签署其他 ETCD 组件证书(如 server、peer、client
证书)。
客户端(如 API Server)和 ETCD 节点之间通过此 CA 验证
对方证书的有效性,建立信任链。
基于kubeadm安装的有效期默认10年
front-proxyca.crt、key kubernetesfront-proxy-ca
用于前端代理前端代理的根证书。
用于验证客户端证书(如 front-proxy-client.crt ),
确保代理通信的安全性
基于kubeadm安装的有效期默认10年
openssl x509 -in /etc/kubernetes/pki/etcd/ca.crt -text -noout |head
[root@master1 ~]# openssl x509 -in /etc/kubernetes/pki/etcd/ca.crt -text -noout |head Certificate: Data: Version: 3 (0x2) Serial Number: 6610426580760907092 (0x5bbcf3f3a00dcd54) Signature Algorithm: sha256WithRSAEncryption Issuer: CN=etcd-ca Validity Not Before: Jun 18 07:31:46 2026 GMT Not After : Jun 15 07:36:46 2036 GMT Subject: CN=etcd-ca
openssl x509 -in /etc/kubernetes/pki/ca.crt -text -noout |head
[root@master1 ~]# openssl x509 -in /etc/kubernetes/pki/ca.crt -text -noout |head Certificate: Data: Version: 3 (0x2) Serial Number: 2931407444839702495 (0x28ae738a319b1fdf) Signature Algorithm: sha256WithRSAEncryption Issuer: CN=kubernetes Validity Not Before: Jun 18 07:31:46 2026 GMT Not After : Jun 15 07:36:46 2036 GMT Subject: CN=kubernetes
openssl x509 -in /etc/kubernetes/pki/front-proxy-ca.crt -text -noout |head
[root@master1 ~]# openssl x509 -in /etc/kubernetes/pki/front-proxy-ca.crt -text -noout |head Certificate: Data: Version: 3 (0x2) Serial Number: 5002027593346636259 (0x456ac5982220d9e3) Signature Algorithm: sha256WithRSAEncryption Issuer: CN=front-proxy-ca Validity Not Before: Jul 30 17:41:14 2026 GMT Not After : Jul 27 17:46:14 2036 GMT Subject: CN=front-proxy-ca
API Server 相关证书
API Server 是 Kubernetes 的核心控制平面,依赖多组证书与不同组件通信。
除CA证书外,基于kubeadm安装的有效期默认1年
ca.crt
- 功能:Kubernetes 集群的根证书,用于签署 API Server、kubelet 等核心组件的证书。
- 作用:所有组件默认信任此 CA,是集群信任体系的基础。
apiserver.crt
- 功能:API Server 的服务器证书,包含 API Server 的域名或 IP 地址(如kubernetes.default.svc )。
- 作用:客户端(如 kubectl、kubelet)通过验证此证书确认连接的是合法 API Server。
apiserver-etcd-client.crt
- 功能:API Server 作为 ETCD 客户端的证书。
- 作用:ETCD 集群通过验证此证书,仅允许授权的 API Server 访问数据存储。
apiserver-kubelet-client.crt
- 功能:API Server 与 kubelet 通信时使用的客户端证书。
- 作用:Kubernetes CA颁发的,kubelet 通过验证此证书,确保请求来自合法的 API Server(例如获取节点状态或执行远程命令)。
ETCD 证书
ETCD 是 Kubernetes 的核心数据存储,使用独立的证书体系确保数据安全性。
除CA证书外,基于kubeadm安装的有效期默认1年
ETCD 相关证书在 /etc/kubernetes/pki/etcd/ 目录下
ca.crt
- 功能:ETCD 集群的根证书,用于签署其他 ETCD 组件证书(如 server、peer、client 证书)。
- 作用:客户端(如 API Server)和 ETCD 节点之间通过此 CA 验证对方证书的有效性,建立信任链。
server.crt
- 功能:ETCD 服务器证书,用于对外提供服务(如接收客户端请求)。
- 作用:客户端(如 API Server)通过验证此证书确认连接的是合法 ETCD 实例。
peer.crt
- 功能:ETCD 节点间通信的证书(用于集群内部复制和同步)。
- 作用:每个 ETCD 节点使用此证书证明自己的身份,确保节点间通信加密且可信。即是服务器端,也是客户端证书
healthcheck-client.crt
- 功能:健康检查客户端证书,用于 kubelet 或监控系统检查 ETCD 健康状态。
- 作用:通过 TLS 验证,确保只有授权组件可以访问 ETCD 的健康检查接口(如 /health 端点)。
- 注意:健康检查证书实际没有被使用
front-proxy 前端代理相关证书
除CA证书外,基于kubeadm安装的有效期默认1年
front-proxy-ca.crt
- 功能:前端代理(如 Ingress Controller)的根证书。
- 作用:用于验证客户端证书(如 front-proxy-client.crt ),确保代理通信的安全性。
front-proxy-client.crt
功能:前端代理客户端证书
作用:kube-aggregator (Kube-Apiserver 内部模块)访问扩展 API 服务器 (如 metrics-server,custom-api-server)时,需要验证此客户端证书,确认请求来自受信任的合法客户端。
Kubelet 的证书
kubelet 证书目录说明,本目录由 kubelet 自动管理,不建议人工删除 / 手工签发 / 直接替换
目录结构
范例
/var/lib/kubelet/pki/
├── kubelet.crt
├── kubelet.key
├── kubelet-client-current.pem
└── kubelet-client-2025-11-13-09-06-03.pem
文件 类型 通信方向 用途
kubelet.crt 服务端证书 apiserver →
kubelet
kubelet 提供 HTTPS 服
务
kubelet.key Private
Key
配套私钥 TLS 加密
kubelet-clientcurrent.pem
客户端证书 kubelet →
apiserver
kubelet 访问 apiserver
范例
[root@node2 ~]# ll /var/lib/kubelet/pki/ total 12 -rw------- 1 root root 1114 Jul 31 02:20 kubelet-client-2026-07-31-02-20-01.pem lrwxrwxrwx 1 root root 59 Jul 31 02:20 kubelet-client-current.pem -> /var/lib/kubelet/pki/kubelet-client-2026-07-31-02-20-01.pem -rw-r--r-- 1 root root 2275 Jul 31 02:20 kubelet.crt -rw------- 1 root root 1679 Jul 31 02:20 kubelet.key [root@node2 ~]#
kubelet.crt / kubelet.key
kubelet.crt
kubelet.key
是谁的证书
- kubelet 自身的服务端证书
给谁用
- kube-apiserver
- metrics-server
- apiserver-kubelet-client
功能
kubelet 在 10250 端口 提供 HTTPS 服务
- 被用于:
- kubectl logs
- kubectl exec
- kubectl port-forward
- kube-apiserver ↔ kubelet 通信
TLS 角色
角色 说明
TLS Server kubelet
TLS Client kube-apiserver
典型 SAN
- 节点名( node1.wang.org )
- 节点 IP
失效/错误表现
x509: certificate has expired
Unable to connect to the server: tls handshake timeout
注意
- 这是 kubelet 的“服务器证书”
- 不是 kubelet 访问 apiserver 用的
kubelet-client-current.pem
是谁的证书
- kubelet 的客户端证书(当前正在使用)
给谁用
- kube-apiserver
功能
kubelet 主动访问 kube-apiserver
用途包括:
- Node 注册
- Pod 状态上报
- Lease 心跳
- Node 状态更新
TLS 角色
TLS Client kubelet
TLS Server
ls /var/lib/kubelet/pki
用户账号配置证书
用户证书基于kubeadm安装的有效期默认1年
这些文件用途如下:
文件名 默认 CN 命令 说明
admin.conf kubernetes-admin kubectl 配置集群的管理员
superadmin.conf kubernetes-super-admin kubectl 为集群配置超级管理员用户
kubelet.conf system:node: <nodeName> kubelet 集群中的每个节点都需要一份
controllermanager.conf
system:kube-controllermanager
kube-controller-manager
必须添加到 manifests/kube-co
manager.yaml 清单中
scheduler.conf system:kube-scheduler kubescheduler
必须添加到 manifests/kubescheduler.yaml 清单中
下面是前表中所列文件的完整路径。
/etc/kubernetes/admin.conf
/etc/kubernetes/super-admin.conf
/etc/kubernetes/kubelet.conf
/etc/kubernetes/controller-manager.conf
/etc/kubernetes/scheduler.conf
kubeadm 在 kubeconfig 文件中生成两个单独的管理员证书。
一个是在 admin.conf 中,带有 Subject: O = kubeadm:cluster-admins, CN = kubernetesadmin 。 kubeadm:cluster-admins 是绑定到 cluster-admin ClusterRole 的自定义组。 这个文件在
所有由 kubeadm 管理的控制平面机器上生成。
另一个是在 super-admin.conf 中,具有 Subject: O = system:masters, CN = kubernetessuper-admin 。 这个文件只在调用了 kubeadm init 的节点上生成。 system:masters 是一个紧急情
况下的超级用户组,可以绕过 Kubernetes 的授权层,如 RBAC。
证书工作机制总结
1. 双向 TLS 认证
- 客户端(如 API Server)和服务器(如 ETCD)互相验证对方证书,确保通信双方身份合法。
- 例如:API Server 访问 ETCD 时,API Server 验证 ETCD 的服务端证书 server.crt ,同时ETCD 验证 API Server 的客户端证书。 apiserver-etcd-client.crt 。
2. 证书与权限绑定
- 证书中的 Common Name (CN) 和 Subject Alternative Name (SAN) 字段会被映射到Kubernetes 的用户和组,作为 RBAC 权限控制的依据。
- 例如: apiserver-kubelet-client.crt 的 CN 可能被映射为 system:kube-apiserver ,赋予其访问 kubelet 的权限。
3. 证书有效期
- 除CA外的证书默认有效期为 1 年(kubeadm 创建的集群),需定期续签(通过 kubeadm certs renew 命令),避免因证书过期导致集群中断。
查看默认证书的有效期
证书默认有效期
/etc/kubernetes/pki/ca.crt #10年有效期 /etc/kubernetes/pki/apiserver.crt #1年有效期 /etc/kubernetes/pki/apiserver-etcd-client.crt #1年有效期 /etc/kubernetes/pki/front-proxy-ca.crt #10年有效期 /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年有效期
查看证书有效期
kubeadm certs check-expiration
该命令显示 /etc/kubernetes/pki 文件夹中的客户端证书以及 kubeadm(admin.conf、controller-manager.conf 和 scheduler.conf) 使用的 KUBECONFIG 文件中嵌入的客户端证书的到期时间/剩余时间。
#另外,kubeadm 会通知用户证书是否由外部管理; 在这种情况下,用户应该小心的手动/使用其他工具来管
理证书更新。
#注意: kubeadm 不能管理由外部 CA 签名的证书
#查看所有证书有效期
[root@master1 ~]# kubeadm certs check-expiration [check-expiration] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"... [check-expiration] Use 'kubeadm init phase upload-config kubeadm --config your-config-file' to re-upload it. CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf Jul 30, 2027 17:46 UTC 364d ca no apiserver Jul 30, 2027 17:46 UTC 364d ca no apiserver-etcd-client Jul 30, 2027 17:46 UTC 364d etcd-ca no apiserver-kubelet-client Jul 30, 2027 17:46 UTC 364d ca no controller-manager.conf Jul 30, 2027 17:46 UTC 364d ca no etcd-healthcheck-client Jul 30, 2027 17:46 UTC 364d etcd-ca no etcd-peer Jul 30, 2027 17:46 UTC 364d etcd-ca no etcd-server Jul 30, 2027 17:46 UTC 364d etcd-ca no front-proxy-client Jul 30, 2027 17:46 UTC 364d front-proxy-ca no scheduler.conf Jul 30, 2027 17:46 UTC 364d ca no super-admin.conf Jul 30, 2027 17:46 UTC 364d ca no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED ca Jul 27, 2036 17:46 UTC 9y no etcd-ca Jul 27, 2036 17:46 UTC 9y no front-proxy-ca Jul 27, 2036 17:46 UTC 9y no
Kubernetes 未过期的证书如何续期
官方文档:
https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
#查看证书有效期
kubeadm certs check-expiration
#更新/etc/kubernetes/pki下面的相关证书文件,并更新对应
/etc/kubernetes/admin.conf,controller-manager.conf,scheduler.conf的kubeconfig文件
kubeadm certs renew all #签发所有文件的证书
kubeadm certs renew admin.conf #只签发指定文件的证书
#注意: 如果运行了一个多节点高可用集群,这个命令需要在所有控制面板节点上执行。
#上面不会签发Kubelet证书,一般也无需手工续期,因为此证书文件具有自动续期功能,在到期前30-120天
会自动触发续期机制
#此命令可以自动更新/etc/kubernetes/kubelet.conf
kubeadm init --kubernetes-version=v1.22.2 phase kubeconfig all
范例:
#查看证书有效期,发现即将过期
kubeadm certs check-expiration
#在所有master节点上执行证书续期
kubeadm certs renew all
#在所有master节点上执行重启相关Pod
kubectl delete pod -n kube-system -l 'component in (etcd,kubeapiserver,kube-controller-manager,kube-scheduler)'
kubectl get pod -n kube-system -l 'component in (etcd,kubeapiserver,kube-controller-manager,kube-scheduler)'
#确认证书更新成功
kubeadm certs check-expiration
ls -l /etc/kubernetes/pki/etcd
#还需要手动更新授权文件
cp /etc/kubernetes/admin.conf .kube/config
Kubernetes 证书过期导致集群异常解决方案
上面不会签发Kubelet证书,一般也无需手工续期,因为此证书文件具有自动续期功能,在到期前30-
120天会自动触发续期机制
对集群的证书到期时间进行监控,只要确保Kubelet证书大于30天即可,如果小于30天,说明自动续期
机制出现问题,需要检查为什么自动续期失败,再手工续期
范例:基于kubeadm安装默认会自动对Kubelet证书续期
grep rotateCertificates /var/lib/kubelet/config.yaml
rotateCertificates: true
但是如果已经过期,需要手动解决此证书的过期问题
也可以删除此节点,重新加入节点,但此方式不建议
Kubelet 证书说明
https://kubernetes.io/zh-cn/docs/setup/productionenvironment/tools/kubeadm/troubleshooting-kubeadm/#kubelet-client-cert
默认情况下,kubeadm 使用 /etc/kubernetes/kubelet.conf 中指定的
/var/lib/kubelet/pki/kubelet-client-current.pem 符号链接来配置 kubelet 自动轮换客户端证
书。如果此轮换过程失败,你可能会在 kube-apiserver 日志中看到诸如 x509: certificate has
expired or is not yet valid 之类的错误。要解决此问题,你必须执行以下步骤:
1. 从故障节点备份和删除 /etc/kubernetes/kubelet.conf 和 /var/lib/kubelet/pki/kubeletclient* 。
2. 在集群中具有 /etc/kubernetes/pki/ca.key 的、正常工作的控制平面节点上 执行 kubeadm
kubeconfig user --org system:nodes --client-name system:node:$NODE >
kubelet.conf 。 $NODE 必须设置为集群中现有故障节点的名称。 手动修改生成的
kubelet.conf 以调整集群名称和服务器端点, 或传递 kubeconfig user --config (请参阅为
其他用户生成 kubeconfig 文件)。 如果你的集群没有 ca.key ,你必须在外部对 kubelet.conf
中的嵌入式证书进行签名。
kubeadm config print init-defaults > kubeadm-init.yaml
kubeadm kubeconfig user --org system:nodes --client-name system:node:master1.ming.org --config kubeadm-init.yaml
3. 将得到的 kubelet.conf 文件复制到故障节点上,作为 /etc/kubernetes/kubelet.conf 。
4. 在故障节点上重启 kubelet( systemctl restart kubelet ),等待
/var/lib/kubelet/pki/kubelet-client-current.pem 重新创建。
5. 手动编辑 kubelet.conf 指向轮换的 kubelet 客户端证书,方法是将 client-certificate-data和 client-key-data 替换为:
client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
client-key: /var/lib/kubelet/pki/kubelet-client-current.pem
6. 重新启动 kubelet。
7. 确保节点状况变为 Ready
范例:证书已经过期的情况,使用下面方法解决
#如果证书过期,出现下面提示错误
kubectl get nodes
#查看kube-apiserver的容器日志,可以看到证书过期
docker logs k8s_kube-apiserver_kube-apiserver-master1.ming.org_kube-system_fda209139dbd4aedcf2e79c2333d7121_390
#检查证书有效期
kubeadm certs check-expiration
#在所有master节点上执行下面操作更新证书有效期
kubeadm certs renew all
#确认证书有效期更新
kubeadm certs check-expiration
#自动更新证书文件内容和时间
ll /etc/kubernetes/pki/
#发现只有kubelet.conf文件没有更新
ll /etc/kubernetes/*.conf
#更新和覆盖kubeconfig文件
cp /etc/kubernetes/admin.conf $HOME/.kube/config
#在所有master节点上执行仍然失败
kubectl delete pod -n kube-system -l 'component in (etcd,kubeapiserver,kube-controller-manager,kube-scheduler)'
kubectl get pod -n kube-system | awk '/^(kube-apiserver|kubecontroller-manager|kube-scheduler|etcd)/{print $1}'|xargs kubectl -n kube-system delete pod --force --grace-period=0
#因为Kubelet 客户端证书轮换失败导致仍然失败
kubectl get nodes
#查看服务无法启动
systemctl status kubelet.service
#查看日志,提示证书过期
journalctl -u kubelet.service |grep expired
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
#更新kubelet的客户端证书
#生成初始化文件
cp /etc/kubernetes/kubelet.conf{,.bak}
#基于上面文件对应节点的生成证书信息
#方法1
kubeadm kubeconfig user --org system:nodes --client-name system:node:master1.ming.org > /etc/kubernetes/kubelet.conf
#方法2:
kubeadm kubeconfig user --org system:nodes --client-name system:node:master1.ming.org | tail -n 3 >> /etc/kubernetes/kubelet.conf
vim /etc/kubernetes/kubelet.conf
users:
- name: system:node:master1.wang.org
user: 将下面两行注释或删除
#client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
#client-key: /var/lib/kubelet/pki/kubelet-client-current.pem
client-certificate-data:
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLekNDQWhPZ0F3SUJBZ0l.....
client-key-data:
LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBcVJFZ0p......
#在所有节点重复上面过程,修改kubelet.conf文件
#方法1
kubeadm kubeconfig user --org system:nodes --client-name system:node:node1.ming.org > node1.conf
#复制到指定的所有节点
scp node1.conf node1:/etc/kubernetes/kubelet.conf
systemctl restart kubelet.service
Kubernetes 证书终极解决方案"永久有效"
方法1: 基于初始化集群的配置文件kubeadm-config 初始化集群时实现
此方式从k8s-1.31版本后才开始支持
#初始化环境,包括:内核优化,禁用swap,时间同步,安装container runtime,域名解析,安装相关包
kube等
kubeadm reset -f --cri-socket=unix:///run/cri-dockerd.sock
rm -rf /etc/cni/net.d/ ~/.kube /etc/kubernetes /opt/cni
#生成kubeadm-config配置文件
kubeadm config print init-defaults > kubeadm-init.yaml
[root@master1 ~]# cat kubeadm-init.yaml apiVersion: kubeadm.k8s.io/v1beta4 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.3.60 #1)修改此行,指向自已的IP bindPort: 6443 nodeRegistration: criSocket: unix:///var/run/cri-dockerd.sock #2)如果是基于docker,修改此行 imagePullPolicy: IfNotPresent imagePullSerial: true name: master1.org #3)修改此行,指向自已的主机名 taints: null timeouts: controlPlaneComponentHealthCheck: 4m0s discovery: 5m0s etcdAPICall: 2m0s kubeletHealthCheck: 4m0s kubernetesAPICall: 1m0s tlsBootstrap: 5m0s upgradeManifests: 5m0s --- apiServer: {} apiVersion: kubeadm.k8s.io/v1beta4 caCertificateValidityPeriod: 876000h0m0s #4)修改CA证书有效期,默认10年 certificateValidityPeriod: 87600h0m0s #5)修改证书有效期,默认1年 certificatesDir: /etc/kubernetes/pki controlPlaneEndpoint: kubeapi.org:6443 #6)添加此行,配置基于 VIP 的Endpoint,必须项 clusterName: kubernetes controllerManager: {} dns: {} encryptionAlgorithm: RSA-2048 etcd: local: dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers #7)修改此行镜像地址 kind: ClusterConfiguration kubernetesVersion: 1.35.3 #8)指定版本,默认值不用修改 networking: dnsDomain: cluster.local podSubnet: 10.244.0.0/16 #9)添加此行,指定Pod网段 serviceSubnet: 10.96.0.0/12 proxy: {} scheduler: {}
#检查文件格式
kubeadm config validate --config kubeadm-init.yaml
[root@master1 ~]# kubeadm config validate --config kubeadm-init.yaml W0802 18:51:36.106362 6833 validation.go:79] WARNING: certificateValidityPeriod: the value 87600h0m0s is more than the recommended default for certificate expiration: 8760h0m0s W0802 18:51:36.106481 6833 validation.go:79] WARNING: caCertificateValidityPeriod: the value 876000h0m0s is more than the recommended default for CA certificate expiration: 87600h0m0s ok
#利用上面生成的配置文件进行初始化集群
kubeadm init --config kubeadm-init.yaml --upload-certs
#确认证书有效期
kubeadm certs check-expiration
方法2: 基于源码编译 kubeadm 重新初始化 kubernetes 集群
此方式各种版本通用
#检查证书当前有效期
kubeadm certs check-expiration
dnf -y install git
#查看当前版本
kubeadm version
#下载指定版本的源码
#方法2: 只下载指定版本的分支,此方式下载更,推存使用
git clone --depth 1 --branch v1.35.7 https://github.com/kubernetes/kubernetes.git
#如果下载失败,可以用如下代理重新下载
git clone --depth 1 --branch v1.35.7 https://githubfast.com/kubernetes/kubernetes.git
#查看大小
du -sh kubernetes/
#修改源码中的证书有效期
#1)修改ca证书到200年,注意:1.32版本以前版本才需要修改此文件,1.32版本以后无需修改此文件
vim staging/src/k8s.io/client-go/util/cert/cert.go
..... DNSNames: []string{cfg.CommonName}, NotBefore: notBefore, //NotAfter: now.Add(duration365d * 10).UTC(), #注释此行 NotAfter: now.Add(duration365d * 200).UTC(), #修改为此行 KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, ......
#2)修改指定服务器的证书的有效期,1.32版本以后只需修改此文件
#把24*365 换成 24*365*100
cd kubernetes/
vim cmd/kubeadm/app/constants/constants.go
#1.30版之前 // CertificateValidity defines the validity for all the signed certificates generated by kubeadm CertificateValidity = time.Hour * 24 * 365 * 100 #1.30版之前修改此行 #1.32版之后 // CertificateValidityPeriod defines the validity period for all the signed certificates generated by kubeadm // CertificateValidityPeriod = time.Hour * 24 * 365 #原代码,修改为如下 CertificateValidityPeriod = time.Hour * 24 * 365 * 100 #修改此行,指定服务器的证书 的有效期,1.32版 // CACertificateValidityPeriod defines the validity period for all the signed CA certificates generated by kubeadm // CACertificateValidityPeriod = time.Hour * 24 * 365 * 10 #原代码,修改为如下 CACertificateValidityPeriod = time.Hour * 24 * 365 * 200 #修改此行,指定CA的证书 的有效期200年
#编译一两分钟
dnf -y install make go rsync
make all WHAT=cmd/kubeadm GOFLAGS=-v
#编译完成以后,获取对应的kubeadm二进制包。
ls -l _output/bin/kubeadm
_output/bin/kubeadm version
#查看当前版本的kubeadm路径
which kubeadm
ls -l /usr/bin/kubeadm
#在所有节点上覆盖当前版本的kubeadm命令
cp -b _output/bin/kubeadm /usr/bin/kubeadm
scp /usr/bin/kubeadm node1.org:/usr/bin/kubeadm
ls /usr/bin/kubeadm* -l
#更新CA和服务的证书,注意:只能重新安装k8s集群才能更新有效期生效,只执行kubeadm certs renew all是不生效的
#如果已经安装好的Kubernetes集群,需要先删除Kubernetes集群再重新创建和初始化Kubernetes集群
#方法1:手动执行命令
kubeadm reset -f --cri-socket unix:///run/cri-dockerd.sock
[root@nodeX ~]#kubeadm reset -f --cri-socket unix:///run/cri-dockerd.sock
#如果没有安装Kubernetes集群,利用新版本的kubeadm 创建集群
#方法1:手动执行命令
K8S_RELEASE_VERSION=1.35.3
kubeadm init --kubernetes-version=v${K8S_RELEASE_VERSION} --control-plane-endpoint kubeapi.org --pod-network-cidr 10.244.0.0/16 --service-cidr 10.96.0.0/12 --token-ttl=0 --image-repository registry.aliyuncs.com/google_containers --upload-certs --cri-socket=unix:///run/cri-dockerd.sock
kubeadm join kubeapi.org:6443 --token vhjuwi.oodt8f2b9yx7bkba \
--discovery-token-ca-cert-hash sha256:6b28f129bac602bf720b640693246cb2aaab6175fb5c097d2d9e9a31321958e9 \
--cri-socket unix:///run/cri-dockerd.sock
#验证和检查证书有效期已经永久
kubeadm certs check-expiration
#手动更新授权文件
cp /etc/kubernetes/admin.conf .kube/config
#检查证书
ll /etc/kubernetes/pki/
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -dates -noout
openssl x509 -in /etc/kubernetes/pki/ca.crt -dates -noout
root@master1 ~]# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -dates -noout notBefore=Aug 2 11:53:48 2026 GMT notAfter=Jul 9 11:58:48 2126 GMT [root@master1 ~]# [root@master1 ~]# openssl x509 -in /etc/kubernetes/pki/ca.crt -dates -noout notBefore=Aug 2 11:53:48 2026 GMT notAfter=Jun 15 11:58:48 2226 GMT
浙公网安备 33010602011771号