etcd基础命令

查看集群所有成员状态

# export NODE_IPS="10.211.55.80 10.211.55.81 10.211.55.82"
# for ip in ${NODE_IPS}; do  ETCDCTL_API=3 /usr/local/bin/etcdctl  \
--endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem  \
--cert=/etc/kubernetes/ssl/etcd.pem  --key=/etc/kubernetes/ssl/etcd-key.pem  endpoint health; done

以表格的方式显示更详细的信息

for ip in ${NODE_IPS}; do
  ETCDCTL_API=3 /usr/local/bin/etcdctl \
    --endpoints=https://${ip}:2379 \
    --cacert=/etc/kubernetes/ssl/ca.pem \
    --cert=/etc/kubernetes/ssl/etcd.pem \
    --key=/etc/kubernetes/ssl/etcd-key.pem \
    endpoint status --write-out=table
done

 

查看 etcd 中所有的 key

etcdctl get / --prefix --keys-only

查看 key 内容是乱码需要安装 auger工具

etcdctl get /registry/pods/default/net-test
etcdctl get /registry/pods/default/net-test | auger decode

 添加数据

etcdctl put /name "yzy"

查询数据

etcdctl get /name

改动数据 直接覆盖

etcdctl put /name "lss"

验证

etcdctl get /name

删除数据

etcdctl del /name 

检测数据变化

etcdctl watch /data

备份 etcd

root@10:/etc/kubeasz# etcdctl snapshot save /tmp/etcd.db
{"level":"info","ts":"2025-04-09T07:53:18.484303Z","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"/tmp/etcd.db.part"}
{"level":"info","ts":"2025-04-09T07:53:18.496481Z","logger":"client","caller":"v3@v3.5.20/maintenance.go:212","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2025-04-09T07:53:18.499099Z","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"127.0.0.1:2379"}
{"level":"info","ts":"2025-04-09T07:53:18.634888Z","logger":"client","caller":"v3@v3.5.20/maintenance.go:220","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2025-04-09T07:53:18.673859Z","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"127.0.0.1:2379","size":"4.3 MB","took":"now"}
{"level":"info","ts":"2025-04-09T07:53:18.674047Z","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"/tmp/etcd.db"}
Snapshot saved at /tmp/etcd.db

member 是恢复出来的所有数据

root@10:/etc/kubeasz# etcdctl snapshot restore /tmp/etcd.db --data-dir=/opt/etcd-testdir
Deprecated: Use `etcdutl snapshot restore` instead.

2025-04-09T07:56:32Z	info	snapshot/v3_snapshot.go:265	restoring snapshot	{"path": "/tmp/etcd.db", "wal-dir": "/opt/etcd-testdir/member/wal", "data-dir": "/opt/etcd-testdir", "snap-dir": "/opt/etcd-testdir/member/snap", "initial-memory-map-size": 0}
2025-04-09T07:56:32Z	info	membership/store.go:138	Trimming membership information from the backend...
2025-04-09T07:56:32Z	info	membership/cluster.go:421	added member	{"cluster-id": "cdf818194e3a8c32", "local-member-id": "0", "added-peer-id": "8e9e05c52164694d", "added-peer-peer-urls": ["http://localhost:2380"], "added-peer-is-learner": false}
2025-04-09T07:56:32Z	info	snapshot/v3_snapshot.go:293	restored snapshot	{"path": "/tmp/etcd.db", "wal-dir": "/opt/etcd-testdir/member/wal", "data-dir": "/opt/etcd-testdir", "snap-dir": "/opt/etcd-testdir/member/snap", "initial-memory-map-size": 0}
root@10:/etc/kubeasz# ll /opt/etcd-testdir/
total 12
drwx------ 3 root root 4096 Apr  9 07:56 ./
drwxr-xr-x 6 root root 4096 Apr  9 07:56 ../
drwx------ 4 root root 4096 Apr  9 07:56 member/

备份脚本

#!/bin/bash
source /etc/profile
DATE=`date +%Y-%m-%d_%H-%M-%S`
TCDCTL_API=3 /usr/local/bin/etcdctl snapshot save /data/etcd-backup-dir/etcd-snapshot-${DATE}.db

限于 k8s 是 kubeasz 部署的备份方法

./ezctl backup k8s-cluster-yzy

恢复

第一种方法:修改db_to_restore: "snapshot.db"为要恢复的文件

vim /etc/kubeasz/roles/cluster-restore/defaults/main.yml

第二种方法:

cd /etc/kubeasz/clusters/k8s-cluster-yzy/backup
cp snapshot_202504090854.db snapshot.db

kubeasz恢复

./ezctl restore k8s-cluster-yzy

单独的恢复命令 

"cd /etcd_backup && \
        ETCDCTL_API=3 {{ bin_dir }}/etcdctl snapshot restore snapshot.db \
        --name etcd-{{ inventory_hostname }} \
        --initial-cluster {{ ETCD_NODES }} \
        --initial-cluster-token etcd-cluster-0 \
        --initial-advertise-peer-urls https://{{ inventory_hostname }}:2380"

 

当 ETCD集群宕机数量超过集群总节点数一半以上的时候(如总数为三台宕机两台),就会导致整个集群宕机,后期需要重新恢复数据

流程如下:

  1. 恢复服务器系统
  2. 重新部署 ETCD 集群
  3. 停止 kube-apiserver/controller-manager/scheduler/kubelet/kube-proxy
  4. 停止 ETCD 集群
  5. 各 ETCD 节点恢复同一份备份数据
  6. 启动各节点并验证 ETCD 集群
  7. 启动 kube-apiserver/controller-manager/scheduler/kubelet/kube-proxy
  8. 验证 k8s-master 状态及 pod 数据
posted @ 2025-04-09 17:19  Maniana  阅读(162)  评论(0)    收藏  举报