etcd Hands-on
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| TLS | Transport Layer Security | 传输层安全协议 |
本实验在本机启动独立单节点 etcd,不连接 Kubernetes。只监听回环地址,使用非默认端口;无 TLS 配置仅适用于此实验。
1. 准备工具#
从 etcd 3.6.5 Release 下载对应系统和架构的压缩包,对照 SHA256SUMS 校验,解压后将 etcd、etcdctl、etcdutl 所在目录加入 PATH。
etcd --version
etcdctl version
etcdutl version以下命令在同一个 Bash 会话顺序执行,需安装 jq,并确保 12379、12380 未被占用。实验目录保留供检查,退出时清理后台进程。
2. 启动与健康检查#
set -euo pipefail
export LAB_DIR="$(mktemp -d)"
export ETCDCTL_ENDPOINTS=http://127.0.0.1:12379
# 清除当前 shell 中可能继承的生产连接配置。
unset ETCDCTL_CACERT ETCDCTL_CERT ETCDCTL_KEY ETCDCTL_USER
umask 077
etcd --name lab --data-dir "$LAB_DIR/original" --listen-client-urls http://127.0.0.1:12379 --advertise-client-urls http://127.0.0.1:12379 --listen-peer-urls http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster lab=http://127.0.0.1:12380 >"$LAB_DIR/etcd.log" 2>&1 &
ETCD_PID=$!
trap 'kill "$ETCD_PID" 2>/dev/null || true' EXIT
for attempt in {1..30}; do
etcdctl endpoint health >/dev/null 2>&1 && break
sleep 1
done
etcdctl endpoint health
etcdctl endpoint status --write-out=table
etcdctl member list --write-out=table单节点应显示一个 Leader,健康检查成功。
3. 读写与 Watch#
etcdctl put /lab/app/version v1
etcdctl get /lab/app/ --prefix
# 从下一条修改开始观察;输出写入实验文件。
WATCH_REV=$(etcdctl endpoint status -w json | jq '.[0].Status.header.revision + 1')
etcdctl watch /lab/app/ --prefix --rev="$WATCH_REV" >"$LAB_DIR/watch.log" &
WATCH_PID=$!
etcdctl put /lab/app/version v2
sleep 1
kill "$WATCH_PID"
wait "$WATCH_PID" 2>/dev/null || true
cat "$LAB_DIR/watch.log"预期读到 v1,Watch 捕获 PUT /lab/app/version v2。指定 Revision 可避免 Watch 建立前的修改被遗漏。
4. Lease:临时键#
LEASE_ID=$(etcdctl lease grant 60 | awk '{print $2}')
etcdctl put /lab/worker/one ready --lease="$LEASE_ID"
etcdctl lease timetolive "$LEASE_ID" --keys
etcdctl lease revoke "$LEASE_ID"
etcdctl get /lab/worker/one撤销后最后一条命令不返回键值。实际服务注册需持续 KeepAlive,否则租约到期后键会被删除。
5. 备份、误删与恢复#
etcdctl snapshot save "$LAB_DIR/snapshot.db"
etcdutl snapshot status "$LAB_DIR/snapshot.db" --write-out=table
etcdctl del /lab/app/ --prefix
test -z "$(etcdctl get /lab/app/version --print-value-only)"
kill "$ETCD_PID"
wait "$ETCD_PID" 2>/dev/null || true
etcdutl snapshot restore "$LAB_DIR/snapshot.db" --name lab --data-dir "$LAB_DIR/restored" --initial-cluster lab=http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token lab-restored --bump-revision 1000000000 --mark-compacted
etcd --name lab --data-dir "$LAB_DIR/restored" --listen-client-urls http://127.0.0.1:12379 --advertise-client-urls http://127.0.0.1:12379 --listen-peer-urls http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster lab=http://127.0.0.1:12380 --initial-cluster-token lab-restored >"$LAB_DIR/restored.log" 2>&1 &
ETCD_PID=$!
for attempt in {1..30}; do
etcdctl endpoint health >/dev/null 2>&1 && break
sleep 1
done
etcdctl endpoint health
test "$(etcdctl get /lab/app/version --print-value-only)" = v2
etcdctl endpoint status --write-out=table验收:误删的数据恢复为 v2,Revision 已增加。Revision bump 与标记压缩用于避免 Kubernetes 等 Watch 客户端继续使用恢复前的缓存;生产取值须覆盖快照以来可能发生的修改。恢复原理见官方灾备说明。
6. 停止实验#
kill "$ETCD_PID"
wait "$ETCD_PID" 2>/dev/null || true
trap - EXIT
printf '实验文件保留在:%s\n' "$LAB_DIR"
unset ETCDCTL_ENDPOINTS本实验验证存储恢复;Kubernetes 的证书、静态 Pod、控制器及业务验收见运维与灾备。