Cozystack 项目引入了重新设计的 etcd-operator 和新的 API。

用于在 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 的大部分路线图目标。路线图目标的现状如下:

  • 实现了创建一个新的 etcd 集群,例如 3 个或 5 个节点,并指定 etcd 版本。
  • 集群健康状态检测 - 已实现。
  • 已实现连接TLS加密,包括证书续期。
  • 在补丁版本内或通过一个次版本进行更新的功能已部分实现:spec.version 值仅应用于新节点。
  • 实现了双向扩展,例如从 1 个节点扩展到 3 个节点,再扩展到 5 个节点,以及反向扩展。
  • 通过标志或环境变量配置 etcd 参数被实现为一组封闭类型的参数。
  • 如果保持法定人数,则恢复故障的集群成员的功能已部分实现:目前还没有自动替换 PVC 损坏的成员的功能。
  • 尚未实现从多个集群成员故障和法定人数丧失中恢复,相关工作已列入计划。
  • 已实现按需集群备份创建。
  • 定期集群备份被特意移出操作员的范围:建议使用标准 CronJob 运行定期快照。

    此外,v1alpha2 还提供了一些官方运营商开发计划中未包含的功能:

    • 停止集群直到副本数为零,暂停并恢复集群,同时保持集群和节点的身份;
    • 内存存储(tmpfs),由操作员自动替换节点;
    • 通过 CEL 在 apiserver 端进行验证,无需 webhook 和依赖证书;
    • 投票节点的自动 PodDisruptionBudget;
    • /scale 子资源,并填充 status.selector,以便 kubectl scale 和 VerticalPodAutoscaler.targetRef 可以直接工作;
    • 转发亲和性和拓扑传播约束规划参数,以及合并运算符创建的所有对象中的附加元数据;
    • 用于在不停止集群的情况下从先前操作符迁移的工具;
    • kubectl-etcd 插件,用于执行操作任务。

    来源: opennet.ru

  • 为具有 DDoS 保护、VPS VDS 服务器的站点购买可靠的主机 🔥 购买具备 DDoS 防护的可靠网站托管服务,包括 VPS 和 VDS 服务器 | ProHoster