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、控制器及业务验收见运维与灾备。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭