【K8s】etcd 常用命令

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

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!


专栏订阅入口

Linux 专栏 | Docker 专栏 | Kubernetes 专栏


往期精彩文章

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)

【Docker】MySQL 源码构建 Docker 镜像(基于 ARM 64 架构)


目录

前提

一、查询命令

1、查询 etcd 集群成员信息

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

3、查询 etcd 集群健康状态

4、查询所有 key

5、查询某个 key 对应的 value

二、备份命令

三、恢复命令

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

2、方式二

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


前提

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

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

# 获取当前 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 集群成员信息
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等)
# 仅查询当前节点
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 集群健康状态
# 仅查询当前节点
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
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
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>"

二、备份命令
# 备份至 /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 仍然正常运行)
# 直接通过 /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、方式二
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、方式三(方式一、方式二均失败时使用)
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,且需要重启服务器)或者方式二的步骤进行操作

### Kubernetes 集群常用命令操作指南 #### 获取集群资源状态 为了获取集群中的节点信息,`kubectl get nodes` 是一个基本而重要的命令。此命令返回当前集群中所有节点的状态和其他细节[^1]。 ```bash kubectl get nodes ``` 对于查看特定命名空间内的Pods,可以使用 `kubectl get pods -n namespace-name` 来列出该命名空间下的所有Pod及其运行状况。 #### 查看详细信息 当需要更详细的描述关于某个资源的信息时,比如想要了解某一个pod的具体情况,则可采用如下方式: ```bash kubectl describe pod <pod_name> [-n <namespace>] ``` 这条指令不仅会给出Pod的基础属性,还会提供事件日志等有助于排查问题的数据。 #### 日志与调试 如果遇到应用程序内部错误或者容器启动失败的情况,可以通过读取容器的日志来进行初步诊断: ```bash kubectl logs <pod_name> ``` 对于多容器的Pod来说,还可以指定具体要查看哪个容器的日志: ```bash kubectl logs <pod_name> -c <container_name> ``` 此外,在某些情况下可能还需要执行进入正在运行的容器环境中进一步调查问题所在: ```bash kubectl exec -it <pod_name> -- /bin/sh ``` 这允许管理员直接在目标容器里运行shell命令以便更好地理解其环境设置和行为表现。 #### 资源管理 除了上述提到的操作外,还有许多其他实用的功能可以帮助管理和维护Kubernetes集群的有效运作。例如调整副本数量、滚动更新应用版本或是回滚到之前的稳定状态等等。这些都是通过一系列精心设计好的API调用来完成的,并且大部分都可以经由`kubectl scale`, `kubectl rollout status/deployments/<deployment_name>` 和 `kubectl rollout undo deployment/<deployment_name>` 这样的简便形式来触发相应的行为。 #### 应用部署和服务发现 最后但同样重要的一点是服务定义和服务之间的通信机制。创建无头Service(Headless Service)配合StatefulSet控制器可用于构建像Elasticsearch或Etcd这样的有状态应用实例集;而对于大多数Web类负载而言,默认的服务类型ClusterIP就足以满足需求了[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行者Sun1989

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值