目录

kubernetes组件-核心组件etcd基础使用

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 中的资源信息。