证书管理
证书管理是 Kubernetes 集群安全的重要组成部分,用于确保集群内部组件和用户之间的通信安全。Kubernetes 使用 PKI(Public Key Infrastructure)系统来管理证书和密钥。
Kubernetes 证书架构
graph TB
subgraph "CA (证书颁发机构)"
ROOT[根 CA
kubernetes-ca]
end
subgraph "集群组件证书"
API[API Server
apiserver.crt]
ETCD[etcd
etcd-server.crt]
KUBELET[kubelet
kubelet.crt]
PROXY[kube-proxy
kube-proxy.crt]
end
subgraph "客户端证书"
ADMIN[管理员
admin.crt]
KUBE[系统组件
system:node:kubelet]
SERVICE[Service Account
sa.key/sa.pub]
end
ROOT --> API
ROOT --> ETCD
ROOT --> KUBELET
ROOT --> PROXY
ROOT --> ADMIN
ROOT --> KUBE
ROOT --> SERVICE
主要证书类型
集群组件证书
- CA 证书: kubernetes-ca.crt/key - 根证书颁发机构
- API Server: apiserver.crt/key - API 服务器身份验证
- etcd: etcd-server.crt/key - etcd 数据库通信
- Kubelet: kubelet.crt/key - 节点代理通信
客户端证书
- Admin 证书: admin.crt/key - 管理员身份
- Kubelet 证书: system:node:* - 节点身份
- Front Proxy: front-proxy.crt/key - 聚合 API
- Service Account: sa.key/sa.pub - 服务账户密钥
证书签发流程
sequenceDiagram
participant Admin as 管理员
participant CSR as CertificateSigningRequest
participant Controller as CSR Controller
participant CA as 证书颁发机构
Admin->>CSR: 创建 CSR 对象
CSR->>Controller: 等待批准
Controller->>CA: 验证并签名
CA->>CSR: 返回签发的证书
CSR-->>Admin: 证书签发完成
证书管理最佳实践
| 实践 | 说明 | 重要性 |
|---|---|---|
| 定期轮换 | 定期更新证书,避免过期 | 高 |
| 安全存储 | 私钥文件存储在安全位置,权限限制 | 高 |
| 最小权限 | 证书只包含必要的权限和范围 | 高 |
| 监控告警 | 监控证书有效期,设置过期告警 | 中 |
| 备份策略 | 定期备份 CA 证书和私钥 | 高 |
证书操作命令
# 查看集群证书文件
ls -la /etc/kubernetes/pki/
# 检查证书有效期
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text
# 使用 kubeadm 检查证书有效期
kubeadm certs check-expiration
# 为用户创建证书签名请求
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: user-csr
spec:
request: $(echo -n '{"CN":"username","O":["system:masters"]}' | base64 | tr -d '\n')
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
EOF
# 批准证书签名请求
kubectl certificate approve user-csr
Service Account 证书管理
Service Account 是 Kubernetes 中用于 Pod 身份验证的机制,每个命名空间都有默认的 Service Account。
# 查看 Service Account
kubectl get serviceaccount -A
# 查看 Service Account 详细信息
kubectl describe serviceaccount default -n default
# 创建自定义 Service Account
kubectl create serviceaccount my-sa -n my-namespace