【K8S】etcd 常用命令

2024-09-02 11:58:11 浏览数 (3)

以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~

前提

使用 kubeadm 安装的 kubernetes 集群中,etcd 以静态 pod 的方式运行。

本文基于 kubernetes 集群介绍 etcd 相关命令,先通过以下命令获取相关信息作为变量:

代码语言:javascript复制
# 获取当前 Master 节点主机名称
host=$(hostname)
 
# 获取 etcd 节点 pod 名称
etcd=$(kubectl get pod -n kube-system | grep 'Running' | grep etcd | head -n 1 | awk '{print $1}')
 
# 获取 etcd 目录
cert_dir="/etc/kubernetes/pki/etcd"
 
# 以上信息也可以从 /etc/kubernetes/manifests/etcd.yaml 中获取

查询命令

1、查询 etcd 集群成员信息

代码语言:javascript复制
kubectl -n kube-system exec ${etcd} -- 
sh -c "ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cert=${cert_dir}/server.crt --key=${cert_dir}/server.key --cacert=${cert_dir}/ca.crt member list -w table"

2、查询 etcd 集群状态信息(version、leader等)

代码语言:javascript复制
# 仅查询当前节点
kubectl -n kube-system exec ${etcd} -- 
sh -c "ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cert=${cert_dir}/server.crt --key=${cert_dir}/server.key --cacert=${cert_dir}/ca.crt endpoint status -w table"
 
# 查询所有节点
kubectl -n kube-system exec ${etcd} -- 
sh -c "ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cert=${cert_dir}/server.crt --key=${cert_dir}/server.key --cacert=${cert_dir}/ca.crt endpoint status --cluster -w table"

3、查询 etcd 集群健康状态

代码语言:javascript复制
# 仅查询当前节点
kubectl -n kube-system exec ${etcd} -- 
sh -c "ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cert=${cert_dir}/server.crt --key=${cert_dir}/server.key --cacert=${cert_dir}/ca.crt endpoint health -w table"
 
# 查询所有节点
kubectl -n kube-system exec ${etcd} -- 
sh -c "ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cert=${cert_dir}/server.crt --key=${cert_dir}/server.key --cacert=${cert_dir}/ca.crt endpoint health --cluster -w table"

4、查询所有 key

代码语言:javascript复制
kubectl -n kube-system exec ${etcd} -- 
sh -c "ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cert=${cert_dir}/server.crt --key=${cert_dir}/server.key --cacert=${cert_dir}/ca.crt get / --prefix --keys-only" | grep -v ^$

5、查询某个 key 对应的 value

代码语言:javascript复制
kubectl -n kube-system exec ${etcd} -- 
sh -c "ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cert=${cert_dir}/server.crt --key=${cert_dir}/server.key --cacert=${cert_dir}/ca.crt get <keyname>"

备份命令

代码语言:javascript复制
# 备份至 /data/etcd/backup 目录
kubectl -n kube-system exec ${etcd} -- 
sh -c "ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cert=${cert_dir}/server.crt --key=${cert_dir}/server.key --cacert=${cert_dir}/ca.crt snapshot save /data/etcd/backup/snap.db"

恢复命令

1、方式一(前提:etcd 的 pod 仍然正常运行)

代码语言:javascript复制
# 直接通过 /data/etcd/backup 目录下的备份文件恢复,并指定新的数据目录
kubectl -n kube-system exec ${etcd} -- 
sh -c "ETCDCTL_API=3 etcdctl --name ${host} --initial-cluster=${host}=https://127.0.0.1:2380 --endpoints=https://127.0.0.1:2379 --cert=${cert_dir}/server.crt --key=${cert_dir}/server.key --cacert=${cert_dir}/ca.crt --initial-advertise-peer-urls=https://127.0.0.1:2380 snapshot restore /data/etcd/backup/snap.db --data-dir=/data/etcd/restore"
 
vi /etc/kubernetes/manifests/etcd.yaml,修改 data-dir 为 /data/etcd/restore,保存后 etcd 自动重启

2、方式二

代码语言:javascript复制
cd /etc/kubernetes/manifests
 
# 停止服务
mv etcd.yaml etcd.yaml-b && mv kube-apiserver.yaml kube-apiserver.yaml-b
 
将 snap.db 拷贝至 /data/etcd/member/snap/db
 
# 启动服务
mv etcd.yaml-b etcd.yaml && mv kube-apiserver.yaml-b kube-apiserver.yaml
 
docker container prune -f(可能需要)

3、方式三(方式一、方式二均失败时使用)

代码语言:javascript复制
cd /etc/kubernetes/manifests
 
# 停止服务
mv etcd.yaml etcd.yaml-b && mv kube-apiserver.yaml kube-apiserver.yaml-b
 
# 清除 etcd 数据
mv /data/etcd/member /tmp
 
# 启动服务
mv etcd.yaml-b etcd.yaml && mv kube-apiserver.yaml-b kube-apiserver.yaml
 
待etcd服务启动后,按照方式一(需要直接操作docker,且需要重启服务器)或者方式二的步骤进行操作

1 人点赞