本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

kubeadm:使用 etcd Learner 安全地加入控制平面节点

kubeadm 工具现在支持 etcd learner 模式,它允许你利用 etcd 3.4 版本中引入的 learner 模式功能,来增强你的 Kubernetes 集群的弹性和稳定性。本指南将引导你使用 kubeadm 来使用 etcd learner 模式。默认情况下,kubeadm 在每个控制平面节点上运行一个本地 etcd 实例。

在 v1.27 中,kubeadm 引入了一个新的特性门控 EtcdLearnerMode。启用此特性门控后,在加入新的控制平面节点时,新的 etcd 成员将被创建为一个 learner,并且只有在 etcd 数据完全同步后才会被提升为投票成员。

使用 etcd learner 模式有什么好处?

etcd learner 模式提供了几个令人信服的理由,让我们在 Kubernetes 集群中考虑采用它。

  1. 增强弹性:etcd learner 节点是无投票权的成员,它们在完全投入运营前会先追赶 leader 的日志。这可以防止新的集群成员破坏法定人数或引发 leader 选举,从而使集群在成员变更期间更具弹性。
  2. 减少集群不可用时间:添加新成员的传统方法通常会导致集群出现不可用期,尤其是在基础设施缓慢或配置错误的情况下。etcd learner 模式可以最大限度地减少此类中断。
  3. 简化维护:learner 节点提供了一种更安全、可逆的方式来添加或替换集群成员。这降低了由于配置错误或添加成员期间的操作失误而导致意外集群中断的风险。
  4. 提高网络容忍度:在涉及网络分区的场景中,learner 模式可以实现更优雅的处理。根据新成员所处的网络分区,它可以无缝地与现有集群集成,而不会造成中断。

总之,etcd learner 模式在成员添加和变更期间提高了 Kubernetes 集群的可靠性和可管理性,使其成为集群运维人员的一项宝贵功能。

节点如何加入使用新模式的集群

创建一个由 etcd learner 模式支持的 Kubernetes 集群

有关使用 kubeadm 创建高可用性集群的一般说明,可以参考使用 kubeadm 创建高可用性集群

要使用 kubeadm 创建一个由 etcd learner 模式支持的 Kubernetes 集群,请遵循以下步骤:

# kubeadm init --feature-gates=EtcdLearnerMode=true ...
kubeadm init --config=kubeadm-config.yaml

kubeadm 配置文件如下所示:

apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
featureGates:
  EtcdLearnerMode: true

kubeadm 工具部署了一个单节点 Kubernetes 集群,并将 etcd 设置为使用 learner 模式。

将节点加入 Kubernetes 集群

在将控制平面节点加入新的 Kubernetes 集群之前,请确保现有的控制平面节点和所有 etcd 成员都是健康的。

使用 etcdctl 检查集群健康状况。如果 etcdctl 不可用,你可以在容器镜像内运行此工具。你应该直接通过你的容器运行时(例如使用 crictl run 等工具)来执行此操作,而不是通过 Kubernetes。

以下是一个使用安全通信来检查 etcd 集群健康状况的客户端命令示例:

ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  member list
...
dc543c4d307fadb9, started, node1, https://10.6.177.40:2380, https://10.6.177.40:2379, false

要检查 Kubernetes 控制平面是否健康,运行 kubectl get node -l node-role.kubernetes.io/control-plane= 并检查节点是否就绪。

在将工作节点加入新的 Kubernetes 集群之前,请确保控制平面节点是健康的。

接下来

  • EtcdLearnerMode 特性门控在 v1.27 中是 alpha 阶段,我们预计它将在 Kubernetes 的下一个次要版本(v1.29)中升级为 beta 阶段。
  • etcd 有一个开放的 issue 可能会使该过程更加自动化:支持将 learner 成员自动提升为投票成员
  • 了解更多关于 kubeadm 配置格式 的信息。

反馈

本指南对你有帮助吗?如果你有任何反馈或遇到任何问题,请告诉我们。我们随时欢迎你的反馈!欢迎参加每两周一次的 SIG Cluster Lifecycle 会议或每周的 kubeadm office hours。或者通过 Slack(频道 #kubeadm)或 SIG 的邮件列表与我们联系。