用于在 Kubernetes 中部署和维护 etcd 集群的 etcd-operator 工具包已迁移至 Cozystack 项目。与此同时,一个全新的 etcd-operator 实现也已发布,该实现完全从零开始编写,并使用 etcd-operator.cozystack.io/v1alpha2 的 API,而非之前的 etcd.aenix.io/v1alpha1。新实现由 Timofey Larkin 编写,他也是之前代码库的维护者之一。旧版本保留在 v1alpha1 分支中。代码使用 Go 语言编写,并以 Apache 2.0 许可证发布。Cozystack 是非营利组织 CNCF 的一个沙箱项目。
新版 etcd-operator 的主要变化在于移除了用于节点管理的 StatefulSet。现在,该 operator 直接访问 etcd 的原生 Membership API(MemberAdd、MemberPromote 和 MemberRemove),自动添加成员、将学习节点提升为投票节点以及从仲裁中移除节点,从而使 operator 能够完全控制集群成员关系。
与此同时,etcd 项目开发者正在从零开始开发他们自己的官方 etcd-operator。就功能而言,官方 operator 目前不如 Cozystack 项目的 etcd-operator。由于之前的 etcd-operator 实现已经在生产环境中运行,并且被 Cozystack 和 Kamaji 使用,因此它的开发工作与官方 etcd 项目的实现工作是分开进行的。
Cozystack 项目的 Operator 通过两个资源管理 etcd 集群。EtcdCluster 描述了集群的期望状态:副本数、etcd 版本、存储参数、TLS、身份验证和 etcd 设置。每个集群节点都会创建一个 etcdMember,该成员拥有其 Pod 和 PVC。与典型的解决方案不同,该 Operator 不使用 StatefulSet,而是独立管理每个节点的 Pod 和 PVC。集群成员关系通过 etcd Membership API 进行更改:Operator 添加新节点作为学习者 (MemberAdd),然后将其提升为投票成员 (MemberPromote)。删除操作通过 MemberRemove 执行,并从仲裁中正确移除节点。集群暂停时,节点将保留其身份。
主要特点:
- 集群部署和扩展可以双向进行,一次一个节点:新节点以学习者模式启动,删除它们会正确地将它们从仲裁中移除;
- 停止集群而不丢失数据(spec.replicas: 0),并使用相同的集群和节点 ID 恢复操作;
- 数据默认存储在 PVC 中,如果数据可以恢复,则存储在 tmpfs 中;如果 Pod 丢失,操作员会自动使用内存存储重新创建节点;
- 客户端和节点间连接采用不同的 TLS 配置:您可以连接自己的 Secret,或者指示操作员通过 cert-manager 颁发和续订证书;
- 使用单个 root 用户进行身份验证;其凭据通过 Secret 设置;
- 在首次部署期间,通过 EtcdSnapshot 资源在 S3 或 PVC 中创建快照,并从快照恢复集群;
- 自动 PodDisruptionBudget,防止排水操作扰乱法定人数;
- 通过 CRD 中的 CEL 表达式,利用 apiserver 对规范进行验证,无需 webhook 和对 cert-manager 的依赖;
- /scale 子资源,用于 kubectl scale 和 VerticalPodAutoscaler,指标端口 2381,亲和性和拓扑传播约束转发;
- kubectl-etcd 插件用于集群部署后的第二天运维。
与旧版本(v1alpha1)相比,有以下变化:
- API 组已从 etcd.aenix.io 更改为 etcd-operator.cozystack.io;
- 该操作符不使用 StatefulSet,而是为每个节点使用单独的 EtcdMember 资源;
- 任意的 spec.options 字典已被一组类型化的参数所取代:quota-backend-bytes、autocompactification mode 和 interval、snapshot-count;一个自由映射允许传递与运算符逻辑冲突的标志;
- EtcdBackup 资源已重命名为 EtcdSnapshot,语义保持不变;
- CRD 中的验证已从 webhook 移至 CEL 规则;
- 集群服务已切换到无头模式,以便节点拥有稳定的 DNS 名称。
迁移使用 etcd-migrate 工具进行原地迁移。该工具无需数据迁移、Pod 重启或仲裁丢失,即可适配旧 Operator 正在运行的集群。它仅更改对象的所有者、标签和注解。之后,新的 Operator 将接管控制权。通过 DNS 访问集群的客户端将继续正常运行,无需任何更改。
Cozystack 的 etcd-operator 实现解决了 etcd 项目官方 etcd operator 的大部分路线图目标。路线图目标的现状如下:
此外,v1alpha2 还提供了一些官方运营商开发计划中未包含的功能:
- 停止集群直到副本数为零,暂停并恢复集群,同时保持集群和节点的身份;
- 内存存储(tmpfs),由操作员自动替换节点;
- 通过 CEL 在 apiserver 端进行验证,无需 webhook 和依赖证书;
- 投票节点的自动 PodDisruptionBudget;
- /scale 子资源,并填充 status.selector,以便 kubectl scale 和 VerticalPodAutoscaler.targetRef 可以直接工作;
- 转发亲和性和拓扑传播约束规划参数,以及合并运算符创建的所有对象中的附加元数据;
- 用于在不停止集群的情况下从先前操作符迁移的工具;
- kubectl-etcd 插件,用于执行操作任务。
来源: opennet.ru
