etcd
是 一致且高可用的键值存储,用作 Kubernetes
所有集群数据的后台数据库。
-
etcd
是一个基于主节点(Leader-Based)的分布式系统。确保主节点定期向所有从节点发送心跳,以保持集群稳定。 - 运行的 etcd 集群成员个数应为奇数。
- 确保不发生资源不足。
集群的性能和稳定性对网络和磁盘 I/O 非常敏感。任何资源匮乏都会导致心跳超时, 从而导致集群的不稳定。不稳定的情况表明没有选出任何主节点。 在这种情况下,集群不能对其当前状态进行任何更改,这意味着不能调度新的 Pod。
https://etcd.io/docs/v3.6/op-guide/hardware/#example-hardware-configurations
- 使用堆叠(stacked)控制平面节点,其中
etcd
节点与控制平面节点共存 - 使用外部
etcd
节点,其中etcd
在与控制平面不同的节点上运行
默认情况下,kubeadm
在每个控制平面节点上运行一个本地 etcd
实例。也可以使用外部的 etcd
集群,并在不同的主机上提供 etcd
实例。
etcdctl 和 etcdutl
etcdctl
和 etcdutl
是用于与 etcd
集群交互的命令行工具,但它们有不同的用途:
-
etcdctl
:这是通过网络与etcd
交互的主要命令行客户端。 它用于日常操作,比如管理键值对、管理集群、检查健康状态等。 -
etcdutl
:这是一个被设计用来直接操作etcd
数据文件的管理工具, 包括跨etcd
版本迁移数据、数据库碎片整理、恢复快照和验证数据一致性等操作。 对于网络操作,你应使用etcdctl
。
启动 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:2379
、 http://$IP2:2379
、http://$IP3:2379
、http://$IP4:2379
和 http://$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.key
和 peer.cert
来保护 etcd 成员之间的通信, 而 client.key
和 client.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 |
+----------+----------+------------+------------+
卷快照
定期备份 etcd
。kubeadm
配置的 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/
网友评论