k8s的证书机制 证书有效期的续期和过期故障 解决

 

 

Kubernetes 证书有效期的续期和过期故障解决

Kubernetes 证书机制
Kubernetes 集群中,各个组件间通信需要以安全加密的方式通信, 而证书是保障组件间安全通信的关键
基础设施。
Kubernetes 是基于 PKI 证书实现基于 TLS 的身份验证和安全通信

 

Kubernetes 证书分类

https://kubernetes.io/zh-cn/docs/setup/best-practices/certificates/

 

 

image

 

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颁发的所有相关的证书

image

 

路径 默认 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

 

posted @ 2026-08-02 20:07  minger_lcm  阅读(11)  评论(0)    收藏  举报