【Kubernetes】手动续签 Kubelet 服务端证书
·
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




更多推荐
所有评论(0)