在容器编排领域,证书体系如同城市的地下管网——平时看不见却支撑着整个系统的安全运转。我曾在生产环境中因为证书配置不当导致整个集群瘫痪8小时,这段经历让我深刻认识到理解Kubernetes证书机制的重要性。本文将拆解Kubernetes中所有核心证书的作用域、生成原理和运维要点,这些知识不仅能帮你避免身份验证故障,还能在集群审计时快速定位安全问题。
证书在Kubernetes中主要承担三类职责:
Kubernetes采用分层CA架构,默认包含:
code复制root-ca
├── front-proxy-ca
└── kubernetes-ca
├── etcd-ca
└── kubelet-ca
这种设计实现了证书隔离,比如etcd证书泄露不会影响kube-apiserver的验证。我曾见过某企业将所有服务共用根CA,结果etcd被攻破后整个集群沦陷。
| 证书用途 | 默认路径 | 关键参数 | 有效期 |
|---|---|---|---|
| apiserver服务端证书 | /etc/kubernetes/pki/apiserver.crt | SAN包含所有API Server地址 | 1年 |
| etcd对等通信证书 | /etc/kubernetes/pki/etcd/peer.crt | 必须包含所有etcd节点主机名 | 1年 |
| kubelet客户端证书 | /var/lib/kubelet/pki/kubelet.crt | CN需匹配Node API对象名称 | 90天 |
| front-proxy客户端证书 | /etc/kubernetes/pki/front-proxy.crt | 用于聚合API的扩展认证 | 1年 |
特别注意:kubeadm 1.22+版本开始,kubelet证书默认采用CSR动态签发模式,不再使用静态证书
使用openssl创建根CA(生产环境建议使用Hashicorp Vault等专业工具):
bash复制openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key \
-subj "/CN=kubernetes-ca" -days 3650 -out ca.crt
关键参数说明:
-subj中的CN值必须与kubeconfig中cluster的certificate-authority-data匹配创建证书签名请求(CSR):
bash复制cat > apiserver.csr <<EOF
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[v3_req]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
IP.1 = 10.96.0.1
IP.2 = 192.168.1.100
EOF
签发时务必包含所有访问apiserver可能使用的DNS和IP,否则会出现TLS握手失败。
查看证书过期时间:
bash复制kubeadm certs check-expiration
手动更新所有证书:
bash复制kubeadm certs renew all
更新后需要重启控制平面组件:
bash复制docker restart $(docker ps -q -f "name=k8s_kube-apiserver")
在kubelet配置中添加:
yaml复制rotateCertificates: true
serverTLSBootstrap: true
当证书剩余有效期小于80%时会自动发起CSR请求,controller-manager自动批准:
bash复制kubectl get csr -w | grep 'Pending' | \
xargs kubectl certificate approve
x509: certificate has expired or is not yet valid
检查系统时间是否同步,我曾遇到NTP服务异常导致证书验证失败
x509: certificate signed by unknown authority
确认kubeconfig中的certificate-authority-data与CA证书一致
tls: bad certificate
通常是因为SAN配置不全,特别是使用LoadBalancer地址时
bash复制kubectl get --raw /metrics | grep certificate_expiration
在kubeadm配置中指定外部CA:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
rootCA:
cert: /opt/pki/root-ca.crt
key: /opt/pki/root-ca.key
使用openssl检查证书链完整性:
bash复制openssl verify -CAfile ca.crt -untrusted intermediate.crt server.crt
在大型集群中,我曾通过证书链分析发现某中间CA私钥泄露,及时阻止了潜在的安全事故。证书管理看似枯燥,实则是集群安全的基石。建议每季度进行一次完整的证书审计,包括检查: