操作 Kubernetes 中的 etcd 集群

2024-08-15  本文已影响0人  87d6dc4b11a7

etcd 是 一致且高可用的键值存储,用作 Kubernetes 所有集群数据的后台数据库。

集群的性能和稳定性对网络和磁盘 I/O 非常敏感。任何资源匮乏都会导致心跳超时, 从而导致集群的不稳定。不稳定的情况表明没有选出任何主节点。 在这种情况下,集群不能对其当前状态进行任何更改,这意味着不能调度新的 Pod。
https://etcd.io/docs/v3.6/op-guide/hardware/#example-hardware-configurations

默认情况下,kubeadm 在每个控制平面节点上运行一个本地 etcd 实例。也可以使用外部的 etcd 集群,并在不同的主机上提供 etcd 实例。

etcdctl 和 etcdutl

etcdctletcdutl 是用于与 etcd 集群交互的命令行工具,但它们有不同的用途:

启动 etcd 集群

单节点 etcd 集群

只为测试目的使用单节点 etcd 集群。
1、运行以下命令:

etcd --listen-client-urls=http://$PRIVATE_IP:2379 \
   --advertise-client-urls=http://$PRIVATE_IP:2379

2、使用参数 --etcd-servers=$PRIVATE_IP:2379 启动 Kubernetes API 服务器。

# /etc/kubernetes/manifests/kube-apiserver.yaml

spec:
  containers:
  - command:
    - kube-apiserver
    - --etcd-cafile=/etc/ssl/etcd/ssl/ca.pem
    - --etcd-certfile=/etc/ssl/etcd/ssl/node-shawn-virtual-machine.pem
    - --etcd-keyfile=/etc/ssl/etcd/ssl/node-shawn-virtual-machine-key.pem
    - --etcd-servers=https://192.168.17.18:2379

多节点 etcd 集群

出于耐用性和高可用性考量,在生产环境中应以多节点集群的方式运行 etcd,并且定期备份。 建议在生产环境中使用五个成员的集群。
考虑运行以下客户端 URL 的五个成员的 etcd 集群:http://$IP1:2379http://$IP2:2379http://$IP3:2379http://$IP4:2379http://$IP5:2379。 要启动 Kubernetes API 服务器:
1、运行以下命令:

etcd --listen-client-urls=http://$IP1:2379,http://$IP2:2379,http://$IP3:2379,http://$IP4:2379,http://$IP5:2379 --advertise-client-urls=http://$IP1:2379,http://$IP2:2379,http://$IP3:2379,http://$IP4:2379,http://$IP5:2379

2、使用参数 --etcd-servers=$IP1:2379,$IP2:2379,$IP3:2379,$IP4:2379,$IP5:2379 启动 Kubernetes API 服务器。

加固 etcd 集群

通过生成密钥和证书对来建立安全的通信通道。 例如,使用密钥对 peer.keypeer.cert 来保护 etcd 成员之间的通信, 而 client.keyclient.cert 用于保护 etcd 与其客户端之间的通信。

安全通信

要使用安全客户端通信对 etcd 进行配置,请指定参数 --key-file=k8sclient.key--cert-file=k8sclient.cert,并使用 HTTPS 作为 URL 模式。 使用安全通信的客户端命令的示例:

ETCDCTL_API=3 etcdctl --endpoints 192.168.17.18:2379 \
  --cert=/etc/ssl/etcd/ssl/node-shawn-virtual-machine.pem \
  --key=/etc/ssl/etcd/ssl/node-shawn-virtual-machine-key.pem \
  --cacert=/etc/ssl/etcd/ssl/ca.pem \
  member list
image.png

替换失败的 etcd 成员

etcd 集群通过容忍少数成员故障实现高可用性。 但是,要改善集群的整体健康状况,请立即替换失败的成员。当多个成员失败时,逐个替换它们。 替换失败成员需要两个步骤:删除失败成员和添加新成员。

备份 etcd 集群

所有 Kubernetes 对象都存储在 etcd 中。
备份 etcd 集群可以通过两种方式完成:etcd 内置快照和卷快照。

内置快照

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> \
  snapshot save <backup-file-location>

ETCDCTL_API=3 etcdctl --endpoints 192.168.17.18:2379 \
  --cert=/etc/ssl/etcd/ssl/node-shawn-virtual-machine.pem \
  --key=/etc/ssl/etcd/ssl/node-shawn-virtual-machine-key.pem \
  --cacert=/etc/ssl/etcd/ssl/ca.pem \
  snapshot save /root/tmp/snapshot.db

使用 etcdutl 工具来验证快照:

etcdutl --write-out=table snapshot status snapshot.db

此命令应该生成类似于下例的输出:

+----------+----------+------------+------------+
|   HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| c5a93cce |    12534 |        978 |     3.8 MB |
+----------+----------+------------+------------+

卷快照

定期备份 etcdkubeadm 配置的 etcd 数据目录位于控制平面节点上的 /var/lib/etcd 中。

恢复 etcd 集群

在使用 etcdutl 恢复集群时,使用 --data-dir 选项来指定集群应被恢复到哪个文件夹。

etcdutl --data-dir <data-dir-location> snapshot restore snapshot.db

如果 <data-dir-location> 与之前的文件夹相同,请先删除此文件夹并停止 etcd 进程,再恢复集群。 否则,需要在恢复后更改 etcd 配置并重新启动 etcd 进程才能使用新的数据目录。

https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/

上一篇下一篇

猜你喜欢

热点阅读