跳至主要内容

高可用嵌入式 etcd

警告

嵌入式 etcd (HA) 在较慢的磁盘上(例如运行 SD 卡的树莓派)可能会出现性能问题。

为什么是奇数个服务器节点?

HA 嵌入式 etcd 集群必须包含奇数个服务器节点,以便 etcd 保持仲裁。对于一个有 n 个服务器的集群,仲裁为 (n/2)+1。对于任何奇数大小的集群,添加一个节点将始终增加保持仲裁所需的节点数。虽然向奇数大小的集群添加节点看起来更好,因为有更多的机器,但容错性更差,因为可以容忍相同数量的节点故障而不会失去仲裁,但可以故障的节点更多。

具有嵌入式 etcd 的 HA K3s 集群由以下部分组成:

  • 三个或更多个**服务器节点**,它们将提供 Kubernetes API 服务并运行其他控制平面服务,以及托管嵌入式 etcd 数据存储。
  • 可选:零个或更多个**代理节点**,这些节点被指定来运行您的应用程序和服务
  • 可选:一个**固定注册地址**,代理节点用于向集群注册
注意

要快速部署大型 HA 集群,请参阅相关项目

要开始,首先使用cluster-init标志启动一个服务器节点,以启用集群和一个将用作共享密钥的令牌,用于将其他服务器加入集群。

curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - server \
--cluster-init \
--tls-san=<FIXED_IP> # Optional, needed if using a fixed registration address

启动第一个服务器后,使用共享密钥将第二个和第三个服务器加入集群

curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - server \
--server https://<ip or hostname of server1>:6443 \
--tls-san=<FIXED_IP> # Optional, needed if using a fixed registration address

检查第二个和第三个服务器是否已加入集群

$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
server1 Ready control-plane,etcd,master 28m vX.Y.Z
server2 Ready control-plane,etcd,master 13m vX.Y.Z
server3 Ready control-plane,etcd,master 10m vX.Y.Z

现在,您拥有一个高可用的控制平面。任何成功集群化的服务器都可以在--server参数中使用,用于将其他服务器和代理节点加入集群。将其他代理节点加入集群的过程与服务器相同

curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - agent --server https://<ip or hostname of server>:6443

有一些配置标志必须在所有服务器节点中保持一致

  • 网络相关标志:--cluster-dns--cluster-domain--cluster-cidr--service-cidr
  • 控制某些组件部署的标志:--disable-helm-controller--disable-kube-proxy--disable-network-policy,以及传递给--disable的任何组件
  • 功能相关标志:--secrets-encryption

现有单节点集群

版本门

v1.22.2+k3s1开始可用

如果您有一个使用默认嵌入式 SQLite 数据库的现有集群,只需重新启动您的 K3s 服务器并使用--cluster-init标志即可将其转换为 etcd。完成此操作后,您将能够按照上述方法添加其他实例。

如果在磁盘上找到 etcd 数据存储,无论是该节点已初始化或已加入集群,则数据存储参数(--cluster-init--server--datastore-endpoint等)将被忽略。