1.2 ETCD for beginners 1. 下载与安装(Linux/macOS 示例) 1 2 3 4 5 6 7 8 9 wget https://mirrors.aliyun.com/etcd/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz tar -xvf etcd-v3.5.0-linux-amd64.tar.gz cd etcd-v3.5.0-linux-amd64./etcd --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://localhost:2379 &
关键参数 :
--listen-client-urls:监听客户端连接的地址。
--advertise-client-urls:对外宣告的客户端访问地址。
2. 基础键值操作 1 2 3 4 5 6 7 8 9 ./etcdctl put /message "Hello ETCD" ./etcdctl get /message ./etcdctl --help
注意 :ETCD v3 需显式指定 API 版本(默认 v3):
1.3 ETCD in K8S ETCD 是 Kubernetes 的“唯一真相源”,存储所有集群状态数据,包括:
集群资源 :Pods、Deployments、Services 等对象的定义和状态。
配置信息 :ConfigMaps、Secrets。
节点状态 :Node 注册信息、资源容量。
调度决策 :Scheduler 的 Predicates/Priorities 结果缓存。
与 Kubernetes 组件的关系
1 2 3 4 5 graph LR A[Kube-APIServer] -->|唯一读写| B[ETCD] C[Controller Manager] -->|监听资源变化| A D[Scheduler] -->|获取未调度 Pod| A E[Kubelet] -->|上报状态| A
APIServer 是唯一入口 :所有组件必须通过 APIServer 访问 ETCD,确保数据一致性和安全审计。
数据格式 :以 Key-Value 形式存储,Key 按资源类型分层(如 /registry/pods/default/nginx)。
数据生效流程示例(以创建 Pod 为例)
用户请求 :kubectl create -f pod.yaml 发送到 APIServer。
写入 ETCD :APIServer 验证请求后,将 Pod 定义写入 ETCD(如 /registry/pods/default/nginx)。
事件触发 :
Controller Manager 监听 Pod 变化,确保副本数符合预期。
Scheduler 发现未调度的 Pod,选择 Node 并更新 Pod 的 nodeName 字段(再次写入 ETCD)。
执行创建 :目标 Node 的 Kubelet 监听到分配给它的 Pod,调用容器运行时启动容器。
Manual和使用Kuberadm部署ETCD 1.3.1 ETCD 手动安装步骤(Linux 示例) 1. 下载 ETCD 二进制文件 1 2 3 4 5 6 7 8 ETCD_VERSION="v3.5.0" wget https://mirrors.aliyun.com/etcd/${ETCD_VERSION} /etcd-${ETCD_VERSION} -linux-amd64.tar.gz tar -xvf etcd-${ETCD_VERSION} -linux-amd64.tar.gz cd etcd-${ETCD_VERSION} -linux-amd64sudo mv etcd etcdctl /usr/local/bin/
2. 创建 ETCD 数据和配置目录 1 2 sudo mkdir -p /var/lib/etcd /etc/etcdsudo chown -R $USER :$USER /var/lib/etcd /etc/etcd
ETCD 服务文件详解(etcd.service)
1. 创建 Systemd 服务文件
编辑 /etc/systemd/system/etcd.service,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [Unit] Description =etcd key-value storeDocumentation =https://etcd.io/docsAfter =network.target[Service] Type =notifyUser =rootEnvironmentFile =-/etc/etcd/etcd.confExecStart =/usr/local/bin/etcd \ --name ${ETCD_NAME} \ --data-dir ${ETCD_DATA_DIR} \ --listen-client-urls ${ETCD_LISTEN_CLIENT_URLS} \ --advertise-client-urls ${ETCD_ADVERTISE_CLIENT_URLS} \ --listen-peer-urls ${ETCD_LISTEN_PEER_URLS} \ --initial-advertise-peer-urls ${ETCD_INITIAL_ADVERTISE_PEER_URLS} \ --initial-cluster ${ETCD_INITIAL_CLUSTER} \ --initial-cluster-token ${ETCD_INITIAL_CLUSTER_TOKEN} \ --initial-cluster-state ${ETCD_INITIAL_CLUSTER_STATE} Restart =alwaysRestartSec =5 sLimitNOFILE =40000 [Install] WantedBy =multi-user.target
2. 关键参数解析
参数
作用
示例值
--name
当前节点名称(集群内唯一)
etcd-node1
--data-dir
数据存储目录
/var/lib/etcd
--listen-client-urls
监听客户端请求的 URL(需包含 http://0.0.0.0:2379 以允许所有 IP)
http://0.0.0.0:2379,http://localhost:2379
--advertise-client-urls
对外宣告的客户端访问地址(需为外部可访问 IP)
http://192.168.1.100:2379
--listen-peer-urls
监听其他 ETCD 节点通信的 URL(集群模式必需)
http://0.0.0.0:2380
--initial-cluster
初始集群成员列表(格式:name1=http://ip1:2380,name2=http://ip2:2380)
etcd-node1=http://192.168.1.100:2380
--initial-cluster-token
集群唯一标识符(防止不同集群意外合并)
my-etcd-cluster
--initial-cluster-state
集群初始状态(new 或 existing)
new
3. 环境变量文件 /etc/etcd/etcd.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ETCD_NAME="etcd-node1" ETCD_DATA_DIR="/var/lib/etcd" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.100:2379" ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.100:2380" ETCD_INITIAL_CLUSTER="etcd-node1=http://192.168.1.100:2380,etcd-node2=http://192.168.1.101:2380" ETCD_INITIAL_CLUSTER_TOKEN="my-etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new"
三、启动 ETCD 并验证
1. 启动服务
1 2 3 4 5 6 7 8 9 10 11 sudo systemctl daemon-reloadsudo systemctl start etcdsudo systemctl enable etcdsudo systemctl status etcd
2. 验证 ETCD 功能
1 2 3 4 5 6 7 8 ETCDCTL_API=3 etcdctl --endpoints=http://192.168.1.100:2379 put /testkey "hello" ETCDCTL_API=3 etcdctl --endpoints=http://192.168.1.100:2379 get /testkey ETCDCTL_API=3 etcdctl --endpoints=http://192.168.1.100:2379 member list
四、与 Kubernetes 集成
1. 配置 kube-apiserver 连接 ETCD
编辑 kube-apiserver 启动参数(通常在 /etc/kubernetes/manifests/kube-apiserver.yaml):
1 2 3 4 5 6 7 8 spec: containers: - command: - kube-apiserver - --etcd-servers=http://192.168.1.100:2379 - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt - --etcd-certfile=/etc/kubernetes/pki/etcd/server.crt - --etcd-keyfile=/etc/kubernetes/pki/etcd/server.key
2. TLS 加密配置(生产环境必需)
1 2 3 4 5 6 7 8 9 10 cfssl gencert -initca ca-csr.json | cfssljson -bare ca cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server etcd-csr.json | cfssljson -bare etcd --listen-client-urls=https://0.0.0.0:2379 \ --advertise-client-urls=https://192.168.1.100:2379 \ --cert-file=/etc/etcd/etcd.pem \ --key-file=/etc/etcd/etcd-key.pem \ --trusted-ca-file=/etc/etcd/ca.pem
五、常见问题排查
1. 服务启动失败
日志查看 :
常见错误 :
端口冲突:确保 2379(客户端)和 2380(节点间通信)未被占用。
证书权限:TLS 证书需对 ETCD 进程用户可读。
2. 集群节点无法加入
检查网络 :确保防火墙放行 2379/tcp 和 2380/tcp。
一致性校验 :所有节点的 --initial-cluster 列表必须一致。
手动部署优势 :完全控制配置,适合生产环境定制化需求。
核心要点 :
正确配置 etcd.service 的启动参数(尤其是网络和集群参数)。
生产环境必须启用 TLS 加密。
通过 etcdctl 和 journalctl 快速诊断问题。
通过以上步骤,可以搭建一个高可用的 ETCD 集群,并为 Kubernetes 提供稳定的数据存储服务。
1.3.1 使用Kubeadm部署ETCD服务器 1. 部署方式对比
对比项
kubeadm 部署 ETCD
手动部署 ETCD
安装复杂度
全自动,通过 kubeadm init 一键完成
需手动下载二进制、配置证书、编写 systemd 服务文件
配置文件生成
自动生成 /etc/kubernetes/manifests/etcd.yaml
需手动编写 /etc/systemd/system/etcd.service
证书管理
自动生成(有效期 1 年),支持 kubeadm certs renew
需手动用 cfssl 或 openssl 生成并管理
集群模式
默认集成在 Kubernetes 控制平面,高需需额外配置
需手动配置 --initial-cluster 参数实现高可用
网络插件依赖
依赖 kubeadm 的 --pod-network-cidr 配置
完全独立,需手动配置网络规则
升级维护
通过 kubeadm upgrade 统一升级
需逐个替换二进制文件并重启服务
2. kubeadm 部署 ETCD 的核心特点
3. 如何选择?
场景
推荐方式
理由
快速搭建测试/生产集群
kubeadm
避免手动配置错误,内置最佳实践(如证书轮换、高可用方案)
学习 ETCD 原理或定制开发
手动部署
深入理解参数含义(如 --heartbeat-interval、--election-timeout)
需要与 Kubernetes 解耦
手动部署独立集群
避免 Kubernetes 控制平面故障影响 ETCD
大规模生产环境
kubeadm + 外部 ETCD
将 ETCD 集群与 Kubernetes 分离,提升稳定性和可扩展性
4. 性能与稳定性注意事项
kubeadm 默认限制 :
ETCD 默认未配置资源限制(需手动添加 resources 到 etcd.yaml)。
数据目录未自动挂载独立磁盘(生产环境建议手动挂载 SSD)。
手动部署优势 :
可调优参数(如 --snapshot-count、--max-request-bytes)。
灵活选择存储引擎(默认 boltdb,可测试 etcd v3.5+ 的 --backend 选项)。
5. 故障恢复对比
操作
kubeadm
手动部署
数据备份
etcdctl snapshot save (需进入容器)
直接操作主机上的 etcdctl
数据恢复
通过 etcd.yaml 挂载备份卷恢复
手动替换数据目录并重启服务
节点故障替换
kubeadm reset + 重新加入节点
手动修改 --initial-cluster 参数