
1. 为什么需要扩容etcd集群节点在生产环境中etcd作为Kubernetes的核心数据存储组件其稳定性和高可用性直接关系到整个集群的可靠性。当集群规模扩大或负载增加时单节点或少量节点的etcd集群可能面临以下问题性能瓶颈随着Kubernetes集群中Pod、Service等资源数量的增加etcd的读写压力会显著上升可用性风险节点数过少时任何一个节点故障都可能导致集群不可用数据安全节点数不足会影响数据冗余和一致性保障将etcd从单节点扩容到双节点是最基础的HA方案虽然仍无法完全避免脑裂问题需要至少3节点才能形成多数派但相比单节点已经大幅提升了可用性。这种方案特别适合以下场景中小规模Kubernetes集群的初期部署开发测试环境向生产环境过渡阶段资源受限但需要基本高可用保障的场景提示虽然双节点etcd比单节点更可靠但生产环境建议至少使用3节点集群。双节点主要作为向三节点过渡的中间状态。2. 扩容前的准备工作2.1 环境检查与规划在开始扩容前需要确认以下信息现有etcd节点信息# 查看当前集群成员 etcdctl --endpointshttps://现有节点IP:2379 \ --cacert/path/to/ca.crt \ --cert/path/to/client.crt \ --key/path/to/client.key \ member list新节点规划IP地址192.168.100.101示例数据目录/var/lib/etcd建议与现有节点一致端口规划2379客户端、2380节点间通信证书准备确保新节点可以使用相同的CA证书为新节点生成专用的server证书2.2 证书生成与分发使用CFSSL工具生成新节点证书# 1. 准备CSR配置文件 cat server-csr.json EOF { CN: etcd, hosts: [ 现有节点IP, 新节点IP, localhost, 127.0.0.1 ], key: { algo: rsa, size: 2048 }, names: [ { C: CN, ST: Shanghai, L: Shanghai, O: etcd, OU: System } ] } EOF # 2. 生成证书 cfssl gencert -caca.pem -ca-keyca-key.pem \ -configca-config.json -profilewww \ server-csr.json | cfssljson -bare server将证书分发到新节点scp -r ca.pem server.pem server-key.pem root新节点IP:/etc/etcd/ssl/3. 配置新etcd节点3.1 安装etcd二进制文件在新节点上安装与现有集群相同版本的etcdETCD_VERv3.5.6 # 与现有集群版本保持一致 wget https://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz tar xvf etcd-${ETCD_VER}-linux-amd64.tar.gz mv etcd-${ETCD_VER}-linux-amd64/etcd* /usr/local/bin/3.2 创建systemd服务文件创建/etc/systemd/system/etcd.service文件[Unit] Descriptionetcd key-value store Documentationhttps://github.com/etcd-io/etcd Afternetwork.target [Service] Typenotify EnvironmentFile-/etc/etcd/etcd.conf ExecStart/usr/local/bin/etcd Restartalways RestartSec5s LimitNOFILE40000 [Install] WantedBymulti-user.target3.3 配置etcd启动参数创建/etc/etcd/etcd.conf配置文件ETCD_NAMEetcd2 # 节点名称必须唯一 ETCD_DATA_DIR/var/lib/etcd ETCD_LISTEN_PEER_URLShttps://新节点IP:2380 ETCD_LISTEN_CLIENT_URLShttps://新节点IP:2379,https://127.0.0.1:2379 ETCD_INITIAL_ADVERTISE_PEER_URLShttps://新节点IP:2380 ETCD_ADVERTISE_CLIENT_URLShttps://新节点IP:2379 ETCD_INITIAL_CLUSTERetcd1https://现有节点IP:2380,etcd2https://新节点IP:2380 ETCD_INITIAL_CLUSTER_TOKENetcd-cluster ETCD_INITIAL_CLUSTER_STATEexisting ETCD_CLIENT_CERT_AUTHtrue ETCD_PEER_CLIENT_CERT_AUTHtrue ETCD_CERT_FILE/etc/etcd/ssl/server.pem ETCD_KEY_FILE/etc/etcd/ssl/server-key.pem ETCD_TRUSTED_CA_FILE/etc/etcd/ssl/ca.pem ETCD_PEER_CERT_FILE/etc/etcd/ssl/server.pem ETCD_PEER_KEY_FILE/etc/etcd/ssl/server-key.pem ETCD_PEER_TRUSTED_CA_FILE/etc/etcd/ssl/ca.pem4. 执行节点扩容操作4.1 向现有集群添加新成员在现有节点上执行etcdctl --endpointshttps://现有节点IP:2379 \ --cacert/etc/etcd/ssl/ca.pem \ --cert/etc/etcd/ssl/server.pem \ --key/etc/etcd/ssl/server-key.pem \ member add etcd2 --peer-urlshttps://新节点IP:23804.2 启动新节点etcd服务在新节点上启动etcdsystemctl daemon-reload systemctl enable etcd systemctl start etcd4.3 验证集群状态检查集群健康状态etcdctl --endpointshttps://新节点IP:2379 \ --cacert/etc/etcd/ssl/ca.pem \ --cert/etc/etcd/ssl/server.pem \ --key/etc/etcd/ssl/server-key.pem \ endpoint health预期输出https://现有节点IP:2379 is healthy: successfully committed proposal: took 12.345678ms https://新节点IP:2379 is healthy: successfully committed proposal: took 11.234567ms5. 更新Kubernetes API Server配置5.1 修改API Server etcd连接配置编辑/etc/kubernetes/manifests/kube-apiserver.yaml更新--etcd-servers参数spec: containers: - command: - kube-apiserver - --etcd-servershttps://现有节点IP:2379,https://新节点IP:2379 - --etcd-cafile/etc/kubernetes/pki/etcd/ca.crt - --etcd-certfile/etc/kubernetes/pki/etcd/server.crt - --etcd-keyfile/etc/kubernetes/pki/etcd/server.key5.2 重启API Server由于API Server以静态Pod方式运行修改后会自动重启# 检查API Server状态 kubectl get pods -n kube-system | grep apiserver6. 扩容后的验证与优化6.1 数据同步验证写入测试数据并验证同步# 在现有节点写入数据 etcdctl --endpointshttps://现有节点IP:2379 put testkey testvalue # 在新节点读取数据 etcdctl --endpointshttps://新节点IP:2379 get testkey6.2 性能基准测试使用etcd自带的benchmark工具测试benchmark --endpointshttps://新节点IP:2379 \ --cacert/etc/etcd/ssl/ca.pem \ --cert/etc/etcd/ssl/server.pem \ --key/etc/etcd/ssl/server-key.pem \ --conns100 --clients1000 put6.3 监控配置建议添加对etcd集群的监控Prometheus配置示例- job_name: etcd scheme: https tls_config: ca_file: /path/to/ca.pem cert_file: /path/to/client.pem key_file: /path/to/client-key.pem static_configs: - targets: [现有节点IP:2379,新节点IP:2379]关键监控指标etcd_server_has_leaderetcd_server_leader_changes_seen_totaletcd_disk_wal_fsync_duration_seconds7. 常见问题与解决方案7.1 新节点无法加入集群可能原因及解决方法证书问题确保新节点使用相同的CA签发检查证书中的hosts字段包含新节点IP网络连接问题检查2380端口是否开放测试节点间网络连通性配置不一致确保ETCD_INITIAL_CLUSTER_TOKEN一致检查ETCD_INITIAL_CLUSTER_STATEexisting7.2 数据同步延迟优化建议调整etcd心跳参数ETCD_HEARTBEAT_INTERVAL100 # 默认100ms ETCD_ELECTION_TIMEOUT1000 # 默认1000ms网络优化确保节点间网络延迟5ms考虑使用专用网络接口7.3 证书自动续期方案使用cert-manager实现自动续期创建Issuer资源apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: etcd-ca-issuer namespace: kube-system spec: ca: secretName: etcd-ca-secret创建Certificate资源apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: etcd-server-cert namespace: kube-system spec: secretName: etcd-server-cert issuerRef: name: etcd-ca-issuer dnsNames: - 现有节点IP - 新节点IP - localhost8. 后续升级为三节点集群的建议虽然双节点提供了基本的HA能力但生产环境建议升级到三节点扩容步骤重复本文的2-4节步骤添加第三个节点更新ETCD_INITIAL_CLUSTER参数包含所有三个节点重启所有etcd实例配置调整# 建议参数 ETCD_HEARTBEAT_INTERVAL100 ETCD_ELECTION_TIMEOUT1000 ETCD_SNAPSHOT_COUNT10000客户端连接优化# kube-apiserver配置示例 - --etcd-servershttps://node1:2379,https://node2:2379,https://node3:2379 - --etcd-prefix/registry - --etcd-compaction-interval5m在实际操作中我发现etcd扩容过程中最容易出问题的环节是证书配置和网络连接。建议在正式操作前先在一个测试环境完整演练整个流程。另外虽然文档上看起来步骤很多但实际操作熟练后整个扩容过程可以在30分钟内完成。