kubelet.crt 是节点对外提供 HTTPS 服务的核心证书,若未开启自动轮转,证书过期需手动续签。本文介绍如何用 OpenSSL 基于集群 CA 重新签发并生效该证书,一起开看看吧!

1、分析现有 kubelet 证书

# 分析现有客户端证书
# 使用 kubeadm 部署,证书在 /var/lib/kubelet/pki 目录下,其他部署方式需要修改为实际目录
# ----
# 颁发者(Issuer): CN = ubuntu-ca@1775781855
# 使用者(Subject): CN = ubuntu@1775781855
# 当前有效期: 2026-04-09 到 2027-04-09 (只有1年)
# 主机名: DNS:ubuntu
# ----
openssl x509 -noout -text -in /var/lib/kubelet/pki/kubelet.crt

2、生成 kubelet 新证书

# 重新生成 kubelet 证书(当前为 15 年有效期,需要结合实际修改证书年限)

# 创建私钥
openssl genrsa -out kubelet.key 2048

# 创建CSR配置文件
cat > kubelet-csr.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[ dn ]
CN = system:node:$(hostname)
O = system:nodes

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=DNS:$(hostname),IP:127.0.0.1
EOF

# 生成证书签名请求
openssl req -new -key kubelet.key -out kubelet.csr -config kubelet-csr.conf

# 使用集群 CA 签署证书(15 年 = 365 * 15 = 5475 天)
openssl x509 -req -in kubelet.csr \
  -CA /etc/kubernetes/pki/ca.crt \
  -CAkey /etc/kubernetes/pki/ca.key \
  -CAcreateserial \
  -out kubelet.crt \
  -days 5475 \
  -extensions v3_ext \
  -extfile kubelet-csr.conf

# 验证生产新证书有效期为 15 年
openssl x509 -noout -text -in kubelet.crt grep Not

3、部署新证书

3.1、备份旧证书

# 备份原证书
mv /var/lib/kubelet/pki/kubelet.crt /var/lib/kubelet/pki/kubelet.crt.backup.$(date +%Y%m%d)
mv /var/lib/kubelet/pki/kubelet.key /var/lib/kubelet/pki/kubelet.key.backup.$(date +%Y%m%d)

3.2、部署新证书

# 部署新证书
cp kubelet.crt /var/lib/kubelet/pki/kubelet.crt
cp kubelet.key /var/lib/kubelet/pki/kubelet.key

# 设置正确的权限
chown root:root /var/lib/kubelet/pki/kubelet.crt /var/lib/kubelet/pki/kubelet.key
chmod 644 /var/lib/kubelet/pki/kubelet.crt
chmod 600 /var/lib/kubelet/pki/kubelet.key

4、验证新证书

# 验证证书是否被CA正确签名
openssl verify -CAfile /etc/kubernetes/pki/ca.crt /var/lib/kubelet/pki/kubelet.crt

# 输出应该显示:/var/lib/kubelet/kubelet.crt: OK

5、重启 kubelet 并检查

# 重启 kubelet 服务
systemctl restart kubelet

# 检查 kubelet 状态
systemctl status kubelet

# 查看 kubelet 日志,确认没有证书错误
journalctl -u kubelet --since "5 minutes ago" | grep -i cert

# 最简单的完整验证(在 master 节点执行)
kubectl get --raw /api/v1/nodes/$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')/proxy/healthz && echo " - kubelet 正常"

# 验证可正常部署 pod
kubectl get pod
kubectl apply -f /chen/test/nginx_test.yaml 
kubectl get pod

# 使用证书访问 node 资源
curl https://192.168.140.129:6443/api/v1/nodes --cacert /etc/kubernetes/pki/ca.crt  --cert /var/lib/kubelet/pki/kubelet.crt  --key /var/lib/kubelet/pki/kubelet.key

更多推荐