尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ETCD集群证书体系与安全实践详解

ETCD集群证书体系与安全实践详解 1. ETCD集群证书体系深度解析在Kubernetes集群中ETCD作为分布式键值存储数据库承担着整个集群状态存储的核心角色。而证书体系则是保障ETCD集群通信安全的关键机制。我们先来全面拆解ETCD的证书架构。1.1 证书类型与作用详解ETCD集群涉及四种核心证书每种都有其特定的安全职责CA证书ca.crt/ca.key证书体系的信任锚点所有其他证书的合法性都基于CA证书验证。私钥必须严格保护一旦泄露将导致整个证书体系崩溃。Peer证书peer.crt/peer.key用于节点间的相互认证。当ETCD节点之间进行数据同步、leader选举等内部通信时双方会通过peer证书验证对方身份。Server证书server.crt/server.key用于客户端到ETCD的服务认证。当kube-apiserver等客户端连接ETCD时ETCD会出示此证书证明自己的合法身份。Healthcheck证书healthcheck-client.crt/.key专门用于健康检查操作的客户端证书。etcdctl等工具使用此证书进行存活状态检查权限通常仅限于健康检查API。关键安全原则不同用途的证书应该严格分离。peer证书不应被用于客户端认证反之亦然。这种职责分离能有效限制凭证泄露的影响范围。1.2 证书内容深度检查CA证书验证实操验证CA证书的自签名特性是确认证书完整性的第一步openssl verify -CAfile /etc/kubernetes/pki/etcd/ca.crt /etc/kubernetes/pki/etcd/ca.crt预期应返回OK表示证书能通过自身验证。如果失败说明证书可能被篡改或损坏。查看CA证书详细内容时需要特别关注openssl x509 -in /etc/kubernetes/pki/etcd/ca.crt -noout -text重点关注Validity时间段Not Before/After确保证书在有效期内X509v3扩展项必须包含CA:TRUE标记和Certificate Sign用途公钥算法与长度现代标准应使用RSA 2048位或ECDSA P-256Peer/Server证书关键检查点对于peer和server证书除了常规的CA链验证外必须检查Subject Alternative Name(SAN)openssl x509 -in peer.crt -text -noout | grep -A1 Subject Alternative Name输出应包含该节点的所有合法DNS名称如节点主机名、localhost等所有使用IP地址包括IPv4和IPv6 缺少必要的SAN会导致TLS握手失败这是证书配置中最常见的错误之一。2. 证书生成方案全攻略2.1 手动生成证书流程CA证书准备CA证书必须在所有节点保持一致。建议从正常节点拷贝scp roothealthy-node:/etc/kubernetes/pki/etcd/{ca.crt,ca.key} /etc/kubernetes/pki/etcd/完成后务必验证文件一致性# 在各节点执行以下命令输出的MD5应该相同 openssl x509 -noout -modulus -in /etc/kubernetes/pki/etcd/ca.crt | openssl md5 openssl rsa -noout -modulus -in /etc/kubernetes/pki/etcd/ca.key | openssl md5生成节点证书创建证书签名请求(CSR)配置文件cat /etc/kubernetes/csr.conf EOF [req] req_extensions v3_req distinguished_name req_distinguished_name [req_distinguished_name] [v3_req] basicConstraints CA:FALSE keyUsage digitalSignature, keyEncipherment extendedKeyUsage serverAuth, clientAuth subjectAltName alt_names [alt_names] DNS.1 ${HOSTNAME} DNS.2 localhost IP.1 ${NODE_IP} IP.2 127.0.0.1 IP.3 ::1 EOF生成peer证书openssl genrsa -out /etc/kubernetes/pki/etcd/peer.key 2048 openssl req -new -key peer.key \ -out /etc/kubernetes/pki/etcd/peer.csr \ -subj /CN${HOSTNAME} \ -config /etc/kubernetes/csr.conf openssl x509 -req -in peer.csr \ -CA /etc/kubernetes/pki/etcd/ca.crt \ -CAkey /etc/kubernetes/pki/etcd/ca.key \ -CAcreateserial \ -out /etc/kubernetes/pki/etcd/peer.crt \ -days 3650 \ -extensions v3_req \ -extfile /etc/kubernetes/csr.conf设置严格的文件权限chmod 600 /etc/kubernetes/pki/etcd/*.key chown root:root /etc/kubernetes/pki/etcd/*.{crt,key}2.2 kubeadm自动生成方案kubeadm提供了更便捷的证书管理方式适合标准Kubernetes部署准备kubeadm配置文件apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration etcd: local: serverCertSANs: - ${NODE_IP} - ${HOSTNAME} peerCertSANs: - ${NODE_IP} - ${HOSTNAME}一键生成所有证书kubeadm init phase certs etcd-server --config/etc/kubernetes/kubeadm-config.yaml kubeadm init phase certs etcd-peer --config/etc/kubernetes/kubeadm-config.yaml kubeadm init phase certs etcd-healthcheck-client --config/etc/kubernetes/kubeadm-config.yaml经验之谈生产环境中建议将证书有效期设置为1年365天并建立定期轮换机制。虽然示例中使用3650天10年方便演示但长期不更换证书会带来安全风险。3. ETCD节点重建实战手册3.1 安全移除故障节点首先检查集群状态ETCDCTL_API3 etcdctl \ --endpointshttps://${HEALTHY_NODE_IP}:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/healthcheck-client.crt \ --key/etc/kubernetes/pki/etcd/healthcheck-client.key \ endpoint health获取节点IDETCDCTL_API3 etcdctl \ --endpointshttps://${HEALTHY_NODE_IP}:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/healthcheck-client.crt \ --key/etc/kubernetes/pki/etcd/healthcheck-client.key \ member list -w simple移除故障节点以节点ID 669b91f5ce3f1e81为例ETCDCTL_API3 etcdctl \ --endpointshttps://${HEALTHY_NODE_IP}:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/peer.crt \ --key/etc/kubernetes/pki/etcd/peer.key \ member remove 669b91f5ce3f1e81关键细节移除成员操作必须在健康节点上执行使用peer证书而非healthcheck证书因为这是集群管理操作。3.2 节点数据清理在待重建节点上执行systemctl stop kubelet rm -rf /var/lib/etcd/member/注意必须停止kubelet否则etcd容器可能自动重启删除member目录而非整个etcd目录保留wal日志等可能有助于故障诊断3.3 重新加入集群在健康节点上执行添加操作ETCDCTL_API3 etcdctl \ --endpointshttps://${HEALTHY_NODE_IP}:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/peer.crt \ --key/etc/kubernetes/pki/etcd/peer.key \ member add ${NEW_NODE_NAME} \ --peer-urlshttps://${NEW_NODE_IP}:2380记录输出的初始集群配置形如ETCD_INITIAL_CLUSTERcrust-m01https://10.10.239.201:2380,crust-m02https://10.10.239.202:2380,crust-m03https://10.10.239.203:2380在待加入节点上配置etcd启动参数通常在/etc/kubernetes/manifests/etcd.yamlspec: containers: - command: - etcd - --initial-cluster${ETCD_INITIAL_CLUSTER} - --initial-cluster-stateexisting启动etcd服务systemctl start kubelet排错技巧如果节点无法加入检查防火墙是否放行了2380端口peer通信和2379端口client通信。使用tcpdump可以验证网络连通性tcpdump -i any port 2380 -nnvvv4. 证书轮换最佳实践4.1 安全更换证书流程备份现有证书cp -a /etc/kubernetes/pki/etcd /etc/kubernetes/pki/etcd.bak.$(date %Y%m%d)生成新证书建议使用新文件名openssl genrsa -out /etc/kubernetes/pki/etcd/peer-new.key 2048 openssl req -new -key peer-new.key \ -out /etc/kubernetes/pki/etcd/peer-new.csr \ -subj /CN${HOSTNAME} openssl x509 -req -in peer-new.csr \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -out /etc/kubernetes/pki/etcd/peer-new.crt \ -days 365 -extensions v3_req \ -extfile (printf [v3_req]\nsubjectAltNameDNS:${HOSTNAME},IP:${NODE_IP})原子替换证书mv -f /etc/kubernetes/pki/etcd/peer-new.crt /etc/kubernetes/pki/etcd/peer.crt mv -f /etc/kubernetes/pki/etcd/peer-new.key /etc/kubernetes/pki/etcd/peer.key触发etcd重新加载证书# 优雅重启etcd容器 mv /etc/kubernetes/manifests/etcd.yaml /tmp/ sleep 10 mv /tmp/etcd.yaml /etc/kubernetes/manifests/4.2 多节点证书轮换策略对于生产环境建议采用分阶段轮换先更换一个follower节点的证书验证无误间隔24小时后更换第二个节点最后更换leader节点可通过etcdctl endpoint status确认leader重要提示在证书轮换期间确保至少(N/2)1个节点保持健康对于3节点集群至少2个否则集群将无法达成共识。5. 故障排查与应急方案5.1 常见错误与解决方案问题1etcd日志报transport: authentication handshake failed可能原因证书SAN不匹配节点实际信息证书已过期CA证书不一致解决方案# 检查证书有效期 openssl x509 -in /etc/kubernetes/pki/etcd/peer.crt -noout -dates # 验证证书链 openssl verify -CAfile /etc/kubernetes/pki/etcd/ca.crt /etc/kubernetes/pki/etcd/peer.crt # 检查SAN配置 openssl x509 -in /etc/kubernetes/pki/etcd/peer.crt -text | grep -A1 Subject Alternative Name问题2etcd节点无法加入集群报cluster ID mismatch可能原因未清除旧的member数据使用了错误的initial-cluster配置解决方案# 彻底清除旧数据 rm -rf /var/lib/etcd/member/ # 获取最新的cluster配置 ETCDCTL_API3 etcdctl \ --endpointshttps://${HEALTHY_NODE_IP}:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/healthcheck-client.crt \ --key/etc/kubernetes/pki/etcd/healthcheck-client.key \ member list -w simple5.2 灾难恢复预案当大多数节点故障时可采用以下步骤恢复选择数据最新的幸存节点在该节点上执行etcd --force-new-cluster \ --data-dir/var/lib/etcd \ --name${NODE_NAME} \ --initial-advertise-peer-urlshttps://${NODE_IP}:2380 \ --listen-peer-urlshttps://${NODE_IP}:2380 \ --listen-client-urlshttps://${NODE_IP}:2379,https://127.0.0.1:2379 \ --advertise-client-urlshttps://${NODE_IP}:2379基于此节点重建集群最后提醒任何对etcd的操作都可能影响整个Kubernetes集群的稳定性。建议在维护窗口期进行操作并确保有完整的备份方案。可以使用etcdctl snapshot save创建定期备份这是保障数据安全的最重要措施。
返回列表