我们最近获悉,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: true
以extra_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