Etcd ¶
备份 etcd ¶
Kubernetes 依赖 etcd 来存储状态。有关用法的更多详细信息,请参阅 这里 和 这里.
备份要求 ¶
使用 kOps 部署的 Kubernetes 集群将 etcd 状态存储在每个主节点的两个不同的 AWS EBS 卷中。一个卷用于存储 Kubernetes 主数据,另一个卷用于存储事件。对于具有三个节点的 HA 主节点,这将导致六个卷用于 etcd 数据(每个可用区一个)。EBS 卷的设计旨在具有 故障率 为每年 0.1%-0.2%。
执行备份 ¶
备份定期执行,并且在使用 etcd-manager(在 kOps 1.12 中引入)进行集群修改之前执行。main
和 events
etcd 集群的备份与集群配置一起存储在对象存储(如 S3)中。
默认情况下,每 15 分钟执行一次备份。每小时备份保留 1 周,每天备份保留 90 天(或在 kOps 1.27 之前保留 2 年),然后自动删除。备份的保留时间 可以调整 以满足其他需求。
恢复备份 ¶
如果发生 etcd 灾难性情况(数据丢失、集群问题等),可以使用 etcd-manager-ctl
恢复 etcd 集群。您可以从 etcd-manager 存储库 下载 etcd-manager-ctl
二进制文件。只要您有权访问集群状态存储(如 S3),则无需在集群中运行 etcd-manager-ctl
。
请注意,此过程会使您的主节点(以及 API 服务器)停机。恢复操作无法撤销(除非再次恢复),您可能会丢失备份后创建的 Pod、事件和其他资源。
在此示例中,我们假设我们在名为 my.clusters
的 S3 存储桶中有一个名为 test.my.clusters
的集群。
列出存储在您的状态存储中的备份(请注意,备份文件对于 main
和 events
集群是不同的)
etcd-manager-ctl --backup-store=s3://my.clusters/test.my.clusters/backups/etcd/main list-backups
etcd-manager-ctl --backup-store=s3://my.clusters/test.my.clusters/backups/etcd/events list-backups
为两个集群添加恢复命令
etcd-manager-ctl --backup-store=s3://my.clusters/test.my.clusters/backups/etcd/main restore-backup [main backup dir]
etcd-manager-ctl --backup-store=s3://my.clusters/test.my.clusters/backups/etcd/events restore-backup [events backup dir]
请注意,这不会立即开始恢复;您需要重新启动所有主节点上的 etcd。您可以使用主节点上的 etcd-manager 容器执行 docker stop
或 kill
操作(容器名称以 k8s_etcd-manager_etcd-manager
开头)。etcd-manager 容器应自动重新启动,并接收恢复命令。您也可以快速滚动您的主节点,但建议重新启动容器。
将创建一个新的 etcd 集群,并将备份恢复到此新集群。请注意,此过程可能需要一段时间,具体取决于集群的大小。
您可以通过读取主节点(该主节点是集群的领导者)上的 etcd 日志(/var/log/etcd(-events).log
)来跟踪进度(您可以通过检查所有主节点上的 etcd 日志来找出领导者)。请注意,main
和 events
集群的领导者可能不同。
验证主节点租约一致性 ¶
此错误会导致旧的 apiserver 租约卡住。为了从这种情况中恢复,您需要直接从 etcd 中删除这些租约。
要验证您是否受到此错误的影响,请检查 kubernetes apiserver 的端点资源,如下所示
kubectl get endpoints/kubernetes -o yaml
如果您看到的主机地址多于主节点,则需要在 etcd 集群中手动删除这些地址。
请参阅 etcd 管理,了解如何访问 etcd 集群。
获得一个可用的 etcd 客户端后,运行以下命令
etcdctl get --prefix --keys-only /registry/masterleases
您也可以一次删除所有租约...
etcdctl del --prefix /registry/masterleases/
其余 API 服务器将立即重新创建自己的租约。再次检查上述端点以验证问题是否已解决。
由于每个节点上的状态可能与 etcd 中的状态不同,因此最好对整个集群进行滚动更新
kops rolling-update cluster --force --yes
有关更多信息和故障排除,请参阅 etcd-manager 文档.
Etcd 卷加密 ¶
您必须在启动集群之前配置 etcd 卷加密。您无法将 etcd 卷加密添加到已运行的集群中。
使用默认 AWS KMS 密钥加密 Etcd 卷 ¶
编辑您的集群,将 encryptedVolume: true
添加到每个 etcd 卷中
kops edit cluster ${CLUSTER_NAME}
...
etcdClusters:
- etcdMembers:
- instanceGroup: master-us-east-1a
name: a
encryptedVolume: true
name: main
- etcdMembers:
- instanceGroup: master-us-east-1a
name: a
encryptedVolume: true
name: events
...
更新您的集群
kops update cluster ${CLUSTER_NAME}
# Review changes before applying
kops update cluster ${CLUSTER_NAME} --yes
使用自定义 AWS KMS 密钥加密 Etcd 卷 ¶
编辑您的集群,将 encryptedVolume: true
添加到每个 etcd 卷中
kops edit cluster ${CLUSTER_NAME}
...
etcdClusters:
- etcdMembers:
- instanceGroup: master-us-east-1a
name: a
encryptedVolume: true
kmsKeyId: <full-arn-of-your-kms-key>
name: main
- etcdMembers:
- instanceGroup: master-us-east-1a
name: a
encryptedVolume: true
kmsKeyId: <full-arn-of-your-kms-key>
name: events
...
更新您的集群
kops update cluster ${CLUSTER_NAME}
# Review changes before applying
kops update cluster ${CLUSTER_NAME} --yes