kubernetes 核心组件 etcd 的一些基础和常用的操作.
动机
平时维护 kubernetes 集群,或多或少会需要到跟 etcd 打交道,etcd 有个比较烦人的点就是需要指定证书,然后命令也比较容易忘记,所以我把日常经常用到的命令整理了一下,防止以后要用又要到网上一顿查找。
常用命令
在开始使用 etcdctl 之前,我们先设置一下基础环境,免得老是要执行一长串命令。
ETCDCTL_ENDPOINTS
替换为自己环境的 etcd 节点 ip 。
1
2
3
4
5
|
export ETCDCTL_API=3
export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt
export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key
export ETCDCTL_ENDPOINTS=https://172.20.7.165:2379,https://172.20.7.166:2379,https://172.20.7.230:2379
|
查看状态
检查集群节点状态
etcdctl endpoint status --write-out=table
检查集群节点健康
etcdctl endpoint health
删除成员
列出集群节点成员
etcdctl member list
移除集群节点成员
etcdctl member remove xxxx
备份
etcdctl snapshot save /path/to/backup.db
恢复
每个节点执行一次,注意修改节点名称和 ip 。
1
2
3
4
5
6
7
8
9
|
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-master-212-snapshot.db \
--data-dir=/var/lib/etcd \
--name=etcd-master-212 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key \
--initial-cluster-token=etcd-cluster-0 \
--initial-cluster=etcd-master-212=https://10.20.176.212:2380,etcd-master-213=https://10.20.176.213:2380,etcd-master-214=https://10.20.176.214:2380 \
--initial-advertise-peer-urls=https://10.20.176.212:2380
|
查看数据
1
2
3
|
# --keys-only 表示只看 key,相对应的 --print-value-only 表示只看 value
etcdctl get --prefix / --keys-only|head -10
|
查看所有 pod
etcdctl get --prefix /registry/pods --keys-only|head -10
查看某个命名空间的 pod
etcdctl get --prefix /registry/pods/kube-system --keys-only|head -10
查看某个 key 具体的值,pod 等资源的 value 是以 protobuf 格式存储的,因此我们无法直接使用 etcdctl 命令去查询,会出现乱码现象。我们可以通过 OpenShift 提供的一个工具 “etcdhelper” 来解码 proto 格式的内容。
下载下来后编译。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
etcdhelper -cacert /etc/kubernetes/pki/etcd/ca.crt -cert /etc/kubernetes/pki/etcd/server.crt -key /etc/kubernetes/pki/etcd/server.key get /registry/pods/kube-system/etcd-172.20.7.165
/v1, Kind=Pod
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "etcd-172.20.7.165",
"namespace": "kube-system",
"uid": "7d415149-d379-4c6f-880b-8b762a2a40a6",
"creationTimestamp": "2024-01-05T09:02:48Z",
"labels": {
"component": "etcd",
"tier": "control-plane"
},
"annotations": {
"kubeadm.kubernetes.io/etcd.advertise-client-urls": "https://172.20.7.165:2379",
"kubernetes.io/config.hash": "eb5fa33c2cfc8c18aa2aca4f2295eeb6",
"kubernetes.io/config.mirror": "eb5fa33c2cfc8c18aa2aca4f2295eeb6",
"kubernetes.io/config.seen": "2024-01-05T17:02:48.934117687+08:00",
"kubernetes.io/config.source": "file",
"seccomp.security.alpha.kubernetes.io/pod": "runtime/default"
},
"ownerReferences": [
{
"apiVersion": "v1",
"kind": "Node",
"name": "172.20.7.165",
"uid": "de21e10c-c54e-4d5d-8e07-194db93c993d",
"controller": true
}
],
......
|
这样我们就可以查看 kubernetes 存储在 etcd 中的资源信息。