ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Kubernetes高可用集群中ETCD PKI证书体系构建指南

Kubernetes高可用集群中ETCD PKI证书体系构建指南

1. 项目概述:Kubernetes高可用二进制部署中的ETCD PKI体系构建

在Kubernetes高可用集群的二进制部署方案中,ETCD作为集群的分布式键值存储系统,其安全性直接关系到整个集群的稳定运行。PKI(Public Key Infrastructure)体系为ETCD集群提供了基于证书的身份验证和加密通信保障。本文将详细拆解ETCD PKI证书体系的构建过程,这是搭建生产级Kubernetes集群的关键前置步骤。

2. ETCD PKI体系核心组件解析

2.1 证书类型与作用

  • CA证书:根证书,用于签发其他所有证书
  • Server证书:用于ETCD节点间的TLS通信验证
  • Peer证书:用于ETCD节点间的对等通信
  • Client证书:用于客户端与ETCD的交互认证

2.2 证书关键字段说明

每个证书必须包含以下关键字段:

  • CN (Common Name):标识证书主体
  • O (Organization):定义所属组织
  • SANs (Subject Alternative Names):指定证书适用的所有域名和IP

3. 证书生成实操流程

3.1 准备工作环境

mkdir -p /etc/kubernetes/pki/etcd cd /etc/kubernetes/pki/etcd

3.2 生成CA证书

# 生成CA私钥 openssl genrsa -out ca.key 2048 # 生成CA证书 openssl req -x509 -new -nodes -key ca.key \ -subj "/CN=etcd-ca" \ -days 3650 -out ca.crt

3.3 生成Server证书

# 创建证书签名请求配置文件 cat > server-csr.json <<EOF { "CN": "kube-etcd", "hosts": [ "127.0.0.1", "192.168.1.101", "192.168.1.102", "192.168.1.103", "etcd.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "O": "system:etcd" } ] } EOF # 生成证书 cfssl gencert -ca=ca.crt -ca-key=ca.key \ -config=ca-config.json \ -profile=server server-csr.json | cfssljson -bare server

4. 多节点ETCD集群证书配置

4.1 节点差异化配置

每个ETCD节点需要:

  1. 唯一的peer证书
  2. 包含本节点IP的server证书
  3. 相同的CA证书

4.2 典型三节点配置示例

# 节点1证书生成 cfssl gencert -ca=ca.crt -ca-key=ca.key \ -config=ca-config.json \ -hostname="192.168.1.101,etcd1.local" \ -profile=peer peer-csr.json | cfssljson -bare peer-node1 # 节点2证书生成 cfssl gencert -ca=ca.crt -ca-key=ca.key \ -config=ca-config.json \ -hostname="192.168.1.102,etcd2.local" \ -profile=peer peer-csr.json | cfssljson -bare peer-node2

5. 证书部署与验证

5.1 证书目录结构

/etc/kubernetes/pki/etcd/ ├── ca.crt ├── ca.key ├── server.crt ├── server.key ├── peer.crt └── peer.key

5.2 ETCD服务配置示例

# /etc/etcd/etcd.conf ETCD_LISTEN_PEER_URLS=https://192.168.1.101:2380 ETCD_LISTEN_CLIENT_URLS=https://192.168.1.101:2379 ETCD_PEER_CERT_FILE=/etc/kubernetes/pki/etcd/peer.crt ETCD_PEER_KEY_FILE=/etc/kubernetes/pki/etcd/peer.key ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/pki/etcd/ca.crt

6. 常见问题排查指南

6.1 证书验证失败

openssl verify -CAfile ca.crt server.crt

6.2 证书信息查看

openssl x509 -in server.crt -text -noout

6.3 ETCD日志分析

journalctl -u etcd -f

7. 安全最佳实践

  1. 私钥保护:设置400权限

    chmod 400 *.key
  2. 证书轮换:建议每年更新证书

  3. 网络隔离:ETCD集群应部署在内网环境

  4. 备份策略:定期备份CA证书和私钥

重要提示:CA私钥一旦泄露,整个集群安全体系将崩溃,必须严格保管

8. 性能优化建议

  1. 证书算法选择:生产环境建议使用ECDSA算法
  2. 密钥长度:RSA建议2048位以上
  3. 证书有效期:不宜过长(1-2年为宜)

9. 与Kubernetes其他组件的证书集成

当部署完ETCD集群后,需要为以下组件配置ETCD客户端证书:

  • kube-apiserver
  • etcdctl管理工具
  • 监控系统(如Prometheus)
# kube-apiserver配置示例 --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/etcd/client.crt --etcd-keyfile=/etc/kubernetes/pki/etcd/client.key

10. 证书自动化管理方案

对于大规模集群,建议采用:

  1. Vault PKI:集中式证书管理
  2. cert-manager:Kubernetes原生证书管理
  3. 自定义Operator:根据业务需求开发
# 使用cert-manager签发ETCD证书示例 apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: etcd-peer spec: secretName: etcd-peer-tls duration: 8760h renewBefore: 720h issuerRef: name: vault-issuer kind: ClusterIssuer commonName: etcd-peer dnsNames: - etcd.cluster.local ipAddresses: - 192.168.1.101 - 192.168.1.102 - 192.168.1.103 usages: - server auth - client auth

11. 证书过期监控方案

  1. Prometheus监控:使用ssl_exporter
  2. Kubernetes Job:定期检查证书有效期
  3. 自定义脚本:结合告警系统
# 检查证书过期时间示例 openssl x509 -enddate -noout -in server.crt

12. 灾备恢复方案

  1. CA备份:加密存储在多位置

  2. 证书恢复流程:

    • 使用备份的CA重新签发证书
    • 滚动更新所有节点证书
    • 验证集群状态
  3. ETCD数据迁移:当证书体系变更时,需要特别注意数据迁移的安全性

13. 性能影响实测数据

在不同证书配置下的性能对比:

配置项请求延迟(ms)吞吐量(QPS)
RSA 204812.38500
ECDSA P2568.712000
禁用TLS5.215000

注意:生产环境绝不能禁用TLS,性能差异可通过硬件加速缓解

14. 硬件加速方案

  1. Intel QAT:卸载加密计算
  2. OpenSSL引擎:利用硬件加速
  3. 配置方法:
export ETCD_SSL_ENGINE="qat" export ETCD_SSL_ENGINE_PATH="/usr/lib64/engines-1.1/qat.so"

15. 多集群证书管理策略

对于管理多个Kubernetes集群的情况:

  1. 独立CA:每个集群使用独立的CA
  2. 层级CA:根CA→中间CA→集群CA
  3. 命名规范:包含集群标识的CN命名
# 层级CA示例 openssl req -new -newkey rsa:2048 -nodes \ -subj "/CN=cluster01-etcd-ca/OU=kubernetes/O=company" \ -keyout cluster01-etcd-ca.key -out cluster01-etcd-ca.csr

16. 证书吊销处理流程

当私钥泄露时需执行:

  1. 生成CRL(证书吊销列表)
  2. 配置ETCD使用CRL
  3. 重新签发所有受影响证书
# 生成CRL示例 openssl ca -gencrl \ -keyfile ca.key \ -cert ca.crt \ -out etcd-crl.pem

17. 审计日志配置

为ETCD配置证书相关的审计日志:

# /etc/etcd/etcd.conf ETCD_AUDIT_LOG_PATH=/var/log/etcd/audit.log ETCD_AUDIT_LOG_MODE=blocking ETCD_AUDIT_POLICY_FILE=/etc/etcd/audit-policy.yaml

18. 网络策略加固

结合NetworkPolicy限制ETCD端口访问:

apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: etcd-allow spec: podSelector: matchLabels: component: etcd policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: component: kube-apiserver ports: - protocol: TCP port: 2379 - protocol: TCP port: 2380

19. 版本升级注意事项

ETCD版本升级时需检查:

  1. 支持的TLS版本(1.2/1.3)
  2. 证书签名算法兼容性
  3. 新版本的加密套件要求
# 查看ETCD支持的TLS版本 etcd --version | grep -i tls

20. 最终验证清单

部署完成后必须验证:

  1. 集群成员健康状态
  2. 证书有效期
  3. 跨节点通信加密
  4. 客户端访问控制
# 验证ETCD集群状态 ETCDCTL_API=3 etcdctl \ --endpoints=https://192.168.1.101:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/client.crt \ --key=/etc/kubernetes/pki/etcd/client.key \ endpoint health

在实际生产环境中,我们通常会遇到证书过期导致集群不可用的情况。我的经验是提前3个月设置监控告警,并在非业务高峰时段执行证书轮换操作。曾经有一次因为SANs配置不全导致节点间通信失败,后来我们建立了证书模板检查机制,确保每个新生成的证书都包含所有必要的IP和域名信息。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进