【问题标题】:Enforcing immutability of Kubernetes custom resource spec fields强制 Kubernetes 自定义资源规范字段的不变性
【发布时间】:2019-06-24 16:38:28
【问题描述】:

我正在使用 Kubernetes golang operator sdk 来实现一个管理 RabbitMQ 队列的 operator。我想知道 k8s 是否有办法在我的自定义资源上强制执行特定规范字段的不变性。我有以下 golang 结构,它代表一个 rabbitMQ 队列和一些参数来让它绑定到 rabbitMQ 交换:

type RmqQueueSpec struct {
    VHost string `json:"vhost,required"`
    Exchange string `json:"exchange,required"`
    RoutingKey string `json:"routingKey"`
    SecretConfig map[string]string `json:"secretConfig"`
}

我之所以想要不变性,特别是对于VHost 字段,是因为它是用于在rabbitMQ 中命名队列的参数。如果对现有的已部署队列进行了更改,则 k8s 协调器将无法查询 rabbitMQ 的预期队列,因为它将使用不同的 vhost(实际上是不同的命名空间)进行查询,这可能会导致创建新队列或更新错误的队列。

我正在考虑一些替代方案,例如使用必需的 ObjectMeta.Name 字段来包含串联的虚拟主机和队列名称,以确保它们对于已部署的队列是不可变的。或者以某种方式在操作员中缓存旧规范(还没有弄清楚如何做到这一点)并在协调器中比较旧规范和当前规范,如果VHost 发生更改,则返回错误。然而,这些方法似乎都不理想。理想情况下,如果运营商框架可以在 VHost 字段上强制执行不变性,那将是一种处理此问题的简单方法。

【问题讨论】:

标签: kubernetes rabbitmq kubernetes-operator


【解决方案1】:

通过使用ValidatingAdmissionWebhook 可以进行此验证,未来将通过 CRD 的 OpenAPI 验证提供支持。

【讨论】:

  • 有具体的教程吗?
【解决方案2】:

AFAIK 这还不适用于 CRD。我们的方法通常是使用对象名称作为被控制对象的默认名称(在本例中为虚拟主机名称),这样就可以正常工作了。

【讨论】:

  • 这可以通过 CRD 实现,但您需要创建并注册一个 ValidatingAdmissionWebhook 来执行此操作,它不能仅通过规范强制执行。
  • 是的,我认为该功能在 1.17 中成为 GA。或者附近的某个地方。
猜你喜欢
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
相关资源
最近更新 更多