证书管理

证书管理是 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