在Kubernetes集群中,证书体系是保障集群通信安全的核心机制。作为一位在容器化领域深耕多年的工程师,我见过太多因为证书配置不当导致的集群故障。今天我们就来彻底拆解Kubernetes证书的运作原理和最佳实践。
Kubernetes使用TLS证书实现以下核心功能:
典型的证书问题包括:
API Server证书:
关键点:必须包含所有可能的访问地址,否则会报"x509: certificate relies on legacy Common Name field"错误
etcd证书:
kubelet证书:
admin证书:
这是我最推荐的证书生成方案:
bash复制# 安装cfssl工具
wget -q --show-progress --https-only --timestamping \
https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 \
https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64
sudo mv cfssl_linux-amd64 /usr/local/bin/cfssl
sudo mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
典型CA配置模板(ca-config.json):
json复制{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}
查看证书过期时间:
bash复制kubeadm certs check-expiration
手动更新证书:
bash复制kubeadm certs renew all
重要提示:更新后需要重启控制平面组件(apiserver、controller-manager、scheduler)
对于生产环境,我建议采用以下架构:
code复制 根CA
|
+----------+----------+
| | |
中间CA-1 中间CA-2 中间CA-3
(k8s组件) (etcd) (应用服务)
优势:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| x509: certificate has expired or is not yet valid | 证书过期或系统时间错误 | 1. 检查证书有效期 2. 同步集群时间 |
| tls: bad certificate | 证书不匹配 | 1. 确认SAN包含目标主机名 2. 检查CA一致性 |
| connection refused | 证书配置错误导致组件崩溃 | 查看组件日志定位具体错误 |
检查证书详细信息:
bash复制openssl x509 -in /path/to/cert.crt -text -noout
验证证书链:
bash复制openssl verify -CAfile /etc/kubernetes/pki/ca.crt /path/to/cert.crt
测试API Server连通性:
bash复制curl --cacert /etc/kubernetes/pki/ca.crt \
--cert /etc/kubernetes/pki/admin.crt \
--key /etc/kubernetes/pki/admin.key \
https://<API-SERVER-IP>:6443/version
Kubelet客户端证书自动轮换条件:
配置示例(kubelet参数):
bash复制--feature-gates=RotateKubeletClientCertificate=true \
--rotate-certificates=true \
--cert-dir=/var/lib/kubelet/pki
安装cert-manager:
bash复制kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml
示例ClusterIssuer配置:
yaml复制apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
我推荐采用层级式CA架构:
code复制 根CA
|
+---------------+---------------+
| | |
区域CA-1 区域CA-2 区域CA-3
(us-west) (us-east) (eu-central)
每个区域集群使用自己的中间CA,根CA离线保存。这样既保证了跨集群互信,又实现了安全隔离。
经过多年实战总结,这些经验值得特别注意:
证书有效期管理:
私钥保护措施:
bash复制# 设置严格的文件权限
chmod 600 /etc/kubernetes/pki/*.key
chown root:root /etc/kubernetes/pki/*.key
备份策略:
证书吊销方案:
审计日志配置:
yaml复制apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: "certificates.k8s.io"
resources: ["certificatesigningrequests"]
在大型集群中,我通常会部署专门的证书管理服务,集成到现有的CI/CD流程中。一个典型的证书签发流程包括:
对于有严格合规要求的场景,还需要考虑:
证书管理看似简单,实则暗藏诸多细节。记得有一次,我们集群突然出现间歇性API调用失败,经过两天排查才发现是一个工作节点的时间漂移导致了证书验证失败。这个教训让我养成了在所有节点部署NTP服务的习惯。