探索亚马逊 EKS 中的 etcd 碎片整理

简介

亚马逊弹性 Kubernetes 服务 ( Amazon EKS ) 作为一项托管 Kubernetes 服务广受欢迎,它为运行容器化应用程序提供了一个可扩展且可靠的平台。在幕后,Amazon EKS 使用分布式键值存储 etcd 来存储集群配置、状态和元数据。在这篇文章中,我们深入探讨了 etcd 中的碎片整理功能,并讨论了该过程的复杂性以及最大限度地减少其对 Amazon EKS 组件影响的策略。

在亚马逊 EKS 中了解 etcd

Etcd 用作 Amazon EKS 中的主要数据存储,用于存储集群配置、状态和元数据。它维护 一致 的分布式存储系统 ,以确保 Amazon EKS 控制平面的高可用性和可靠性。

etcd 的主要功能之一是将 Kubernetes API 的数据存储和组织为键值对。它跟踪集群中对象和配置的当前状态,确保实际状态与集群管理员、应用程序开发人员或 控制器 指定的所需状态一致。

多版本并发控制

Etcd 是一个持久的键值存储。它采用多版本并发控制 (MVCC) 机制来确保数据一致性,同时还允许并行读取和写入操作。每个键值对都与一个不断增加的版本号相关联。当为密钥写入新值时,它会收到比前一个更高的版本号。版本是独一无二的,严格按顺序排列。保留了先前的版本,允许对更改进行历史跟踪。存储的这种仅限追加的性质导致数据库大小无限增长。

数据碎片

随着时间的推移,数据会被更新和删除,这可能会导致数据库 内部出现 碎片 。碎片化意味着主机文件系统的数据库中可能存在不连续的间隙或未使用的空间。随着时间的推移,碎片的积累可能会导致存储空间消耗增加和由于块不连续而增加 I/O 负载,这最终会影响 Kubernetes API 服务器的响应能力。如果无人值守,碎片化还可能导致可用存储容量耗尽。为了应对这些挑战,etcd 提供了内置的碎片整理机制,用于识别和回收分散的存储区域中的空间。

解决方案概述

etcd 中碎片整理的工作原理

压实

etcd 中的压缩侧重于识别和删除过时的数据,以避免最终耗尽存储空间。etcd 中的每个键值对都分配了一个唯一的索引号,称为修订号。压缩基于这些版本号来识别不再需要或已过期的数据。保留政策决定要保留的数据的修订范围。在压缩过程中,超出此范围的数据被视为符合移除条件。删除后,该数据先前占用的存储空间将被释放,可用于新数据。API 服务器每 5 分钟触发一次压缩操作。

碎片整理

碎片整理包括将数据重写成连续的文件,从而有效地消除碎片化并增强数据局部性。Etcd 分析数据存储以确定碎片级别和有利于数据重组的领域。在分析过程中,etcd 会识别可以将相关数据移动到的连续存储空间。然后,Etcd 移动数据以合并相关的键值对。分散的数据将重新安置到这些连续的存储位置。未使用的空间被释放回文件系统。

对 API 可用性的影响

值得注意的是,碎片整理是一种阻塞操作,这意味着在该过程进行时,它会阻止任何读取或写入操作的发生。这可能会影响 API 服务器与 etcd 的通信,以向客户端提供读写请求。碎片整理所花费的时间取决于需要复制到新数据库文件中的压缩数据量。平均而言,重组每千兆字节的数据最多可能需要 10 秒。我们建议监控 etcd 数据库大小并删除不需要的对象,以最大限度地减少对 API 服务器的性能影响。在 Amazon EKS 集群上 管理 etcd 数据库大小 一 文中详细介绍了该主题。

在较大的 etcd 数据库上,通常会在碎片整理过程中看到 API 服务器返回以下错误消息:

[leaderelection.go:367] Failed to update lock: etcdserver: request timed out

Amazon EKS 开发团队正在积极进行改进,以最大限度地减少碎片整理对 API 可用性的影响。一些示例包括向 etcd 客户端引入 gRPC 远程过程调用 (gRPC) 运行 状况检查

处理 API 超时

在碎片整理期间,预计 API 服务器会间歇性超时。因此,最佳做法是设计客户端应用程序以优雅地处理这些情况。通过构建强大的错误处理机制和纳入重试策略,客户端应用程序可以减轻间歇性超时的影响并保持可靠性。发生超时时,您的应用程序应包含 重试逻辑 ,最好是使用指数退避和抖动,以防止 API 服务器过载。此外,可以考虑采用 断 路器模式 ,以便在连续出现故障时暂时停止重试。

草率排练

在亚马逊 EKS 中管理碎片整理

底层 etcd 集群及其碎片整理过程由 Amazon EKS 控制平面透明地处理。

Amazon EKS 采用自动维护流程来确保 etcd 的健康和稳定性。亚马逊云科技 负责为您预置、扩展和管理 etcd 实例。这种主动的方法可以保证 etcd 集群节点保持健康,并且任何与碎片相关的潜在问题在影响 Amazon EKS 集群的整体性能之前得到缓解。

最大限度地减少碎片整理的影响

数据库的大小是影响 etcd 中碎片整理时间的关键因素。随着 etcd 数据库变得越来越大,由于需要重组和压缩的数据量增加,碎片整理过程变得更加耗时。为了最大限度地减少碎片整理的影响,请考虑以下做法:

1。移除未使用或孤立的对象

定期审核您的集群,以识别和移除未使用或孤立的对象。这些对象可能包括旧部署、副本集或不再使用的服务。删除不必要的对象会减少 etcd 中的存储占用空间并最大限度地减少碎片的影响。诸如 popeye 之 类的工具 可以帮助识别未使用的资源。

2。避免使用配置映射和密钥

避免在配置映射和密钥中存储大量数据。谨慎使用这些资源,使它们保持简洁有序,以减少存储在 etcd 中的大型对象的数量。或者,可以考虑使用 亚马逊云科技 Secrets Manager 或 亚马逊云科技 Systems Manager 参数存储来存储大型数据集。

3。避开大型 Pod 规格

包含大量嵌入式元数据 (512 K+) 的 Pod 规格可以迅速膨胀 etcd 数据库。在部署进入崩溃循环并随后使用无限版本的 Pod 消耗所有可用的 etcd 存储空间的情况下,这尤其成问题。

4。实施对象生命周期管理

定义和实施对象生命周期管理策略。为生命周期有限的对象设置到期日期或实施保留策略。自动删除过期对象,以防止 etcd 中不必要的数据积累。

通过指定.spec.ttlSecondsAfterFinished 字段自动清理已完成的作业,如下所述。

apiVersion: batch/v1
kind: Job
...
spec:
  ttlSecondsAfterFinished: 100
...

限制 部署修订 历史记录的数量。默认情况下,它是 10。较低的值会减少 etcd 中保留的先前 ReplicaSet 的数量。请注意,将该值设置为 0 会禁用回滚功能。

apiVersion: apps/v1
kind: Deployment
...
spec:
  revisionHistoryLimit: 0
...

5。定期监控 etcd 存储空间使用情况

监控 etcd 存储使用情况,深入了解资源利用率并识别异常增长模式。这可以帮助您主动解决与存储相关的问题,并在需要时采取纠正措施,例如优化对象使用。有关更多详细信息,请参阅 控制平面监控 最佳实践指南。

  • Amazon CloudWatch :亚马逊 EKS 与亚马逊 CloudWatch 集成,允许您监控各种集群指标,包括 etcd 磁盘使用情况。你可以使用 CloudWatch Insights 来编写自定义查询并提取相关的 etcd 指标。
fields @timestamp, @message, @logStream
| filter @logStream like /kube-apiserver-audit/
| filter verb in ['create','update','patch','delete']
| limit 10
  • kubectl :你可以使用 kubectl 命令行工具直接获取 etcd 指标。例如,要在亚马逊 EKS v1.26+ 中获取 etcd 指标,你可以运行:
$ kubectl get --raw /metrics | grep apiserver_storage_db_total_size_in_bytes
apiserver_storage_db_total_size_in_bytes{endpoint="http://10.0.160.16:2379"} 1.210830848e+09
apiserver_storage_db_total_size_in_bytes{endpoint="http://10.0.32.16:2379"} 1.207840768e+09
apiserver_storage_db_total_size_in_bytes{endpoint="http://10.0.96.16:2379"} 1.20885248e+09
  • Prometheus Grafana :适用于 OpenTelemetry 的 亚马逊云科技 发行版 (ADOT) 内置了对 EKS API 服务器监控的支持。要了解有关 ADOT 的更多信息,请参阅 监控亚马逊 EKS API 服务器

结论

在这篇文章中,我们向您展示了碎片整理作为 etcd 中的一项关键功能,如何在优化 Amazon EKS 性能和确保集群稳定性方面发挥至关重要的作用。通过主动重组数据和优化存储,碎片整理提高了群集的整体效率并提高了资源利用率。随着 Amazon EKS 继续为组织提供可扩展和弹性的 Kubernetes 部署,我们了解 etcd 成为管理员发挥 Amazon EKS 集群全部潜力的必备工具的细微差别。

要了解更多内容,请查看以下有关在 Amazon EKS 集群 上 管理 etcd 数据库大小的 文章。