上游 etcd v3.5.0-v3.5.2 数据丢失问题

我们最近获悉,etcd 维护人员建议不要将 etcd 3.5 用于生产环境,因为最近发现的一个错误可能会在 etcd 在高负载下被杀死时导致数据丢失。该公告 ( https://groups.google.com/a/kubernetes.io/g/dev/c/B7gJs88XtQc/m/rSgNOzV2BwAJ ) 于 3 月 29 日星期二发布。上游问题(https://github.com/etcd-io/etcd/issues/13766)尚未解决,没有可用的修复程序。

K3s/RKE2

K3s 和 RKE2 的所有 1.22 和 1.23 版本都嵌入了 etcd 3.5。出于这个原因,我们建议用户避免在这些版本上使用嵌入式 etcd 部署新的生产 Kubernetes 集群,直到问题在上游得到修复,并且我们发布了包含该修复的版本。

使用默认 sqlite 数据存储或在具有外部 SQL 数据存储的 HA 配置中不影响 K3s。

如果您有使用受影响版本的现有 K3s 或 RKE2 集群,您可以采取以下步骤来确保您不会遇到数据丢失:

  • 避免向 k3s/rke2 进程和 RKE2 上的 etcd 进程发送 SIGKILL。
  • 避免使用 killall 脚本 (k3s-killall.sh/rke2-killall.sh)在托管生产工作负载的服务器上停止 K3s 或 RKE2。
    killall 脚本旨在在卸载或重新配置之前清理主机,不应用作正确封锁/排空节点和停止服务的替代品。
  • 确保服务器没有承受很大的内存压力,以至于 Linux OOM 收割者可能会杀死 etcd。
  • 确保使用 --etcd-arg=experimental-initial-corrupt-check=true 标志启动服务器,或者如果使用 config.yaml 时配置 etcd-arg: ["experimental-initial-corrupt-check=true"] 。只要服务完全停止,重新启动现有节点以进行此更改是安全的。
  • 避免托管 etcd 的服务器发生任何其他意外终止。这包括强制终止虚拟机、断电等。

自定义 etcd 参数

确保您使用的是 K3s/RKE2 1.22 或 1.23 的最新可用版本。旧版本不支持自定义 etcd 配置。这些步骤只能在server节点上完成,agent不运行 etcd。

  • K3s:
    • 创建或编辑配置文件 /etc/rancher/k3s/config.yaml,将以下行添加到文件末尾:

      etcd-arg: ["experimental-initial-corrupt-check=true"]

    • 保存文件后,运行 systemctl restart k3s 以应用更改。

  • RKE2:
    • 创建或编辑配置文件 /etc/rancher/rke2/config.yaml ,将以下行添加到文件末尾:

      etcd-arg: ["experimental-initial-corrupt-check=true"]

    • 保存文件后,运行 systemctl restart rke2-server 以应用更改。

从 Rancher UI 自定义 etcd 参数

对于从 Rancher 配置的 RKE2 或 K3S 集群(非导入的集群),您可以通过将集群编辑为 YAML 来添加必要的 etcd 参数。

  • 在 “集群管理” 页面中,单击要编辑的集群右侧的垂直三点。
  • 从菜单中选择 “编辑 YAML”
  • 编辑 YAML 的 spec.rkeConfig.machineGlobalConfig 部分以添加 etcd-arg 部分,如下所示(注意您的 YAML 可能与以下示例略有不同):
spec:
  cloudCredentialSecretName: cattle-global-data:cc-xxxxx
  kubernetesVersion: v1.22.7+rke2r2
  localClusterAuthEndpoint: {}
  rkeConfig:
    chartValues:
      rke2-calico: {}
    etcd:
      snapshotRetention: 5
      snapshotScheduleCron: 0 */5 * * *
    machineGlobalConfig:
      cni: calico
      etcd-arg: ["experimental-initial-corrupt-check=true"]
  • 点击底部的“保存”

Rancher 将对下游集群的配置进行必要的更新并重启必要的服务。

RKE

RKE1 的所有 1.22 和 1.23 版本都嵌入了 etcd v3.5.x。
出于这个原因,我们建议用户避免使用这些版本部署新的生产 Kubernetes 集群,直到问题在上游得到修复,并且我们发布了包含该修复的版本。

请注意,RKE1 v1.3.8 默认使用 v1.22.x 创建集群,因此我们建议kubernetes_version cluster.yml.

如果您已经有一个使用受影响版本的现有 RKE1 集群,

  • 您可以设置etcd experimental-initial-corrupt-check: trueextra_args 检查数据损坏。请注意,此标志并不总是有效(https://github.com/etcd-io/etcd/issues/13766#issuecomment-1083033017),但它是目前上游唯一可用的自动化方式。
  • 避免在没有正确 cordoning/draining node,并进行备份的情况下,临时停止/杀死 etcd 容器。
  • 确保节点没有受到很大的内存压力或没有意外终止,包括强制终止虚拟机、断电等。

Rancher

最新的 Rancher v2.6.4 在 single docker 安装模式下,会受此问题影响,因为内置了 k3s v1.22,其中使用了 etcd v3.5.1。

Rancher HA 安装模式下,避免使用有问题的 etcd 版本,则 Local 集群并不会受影响。

需要注意,下游集群使用的 K8s 1.22 也使用了受影响的etcd版本。

请关注此issue的进展:Change k8s default to v1.21 · Issue #37162 · rancher/rancher · GitHub

3 个赞