kubernetes - 强制 Kubernetes 自定义资源规范字段的不变性

标签 kubernetes rabbitmq kubernetes-operator

我正在使用 Kubernetes golang 运算符 sdk 来实现一个管理 RabbitMQ 队列的运算符。我想知道 k8s 是否有办法在我的自定义资源上强制执行特定规范字段的不变性。我有以下 golang 结构,它代表一个 rabbitMQ 队列和一些参数来让它绑定(bind)到 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 则返回错误变化。然而,这些方法似乎都不理想。理想情况下,如果运算符(operator)框架可以在 VHost 上强制执行不变性字段,这将是处理此问题的简单方法。

最佳答案

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

  • https://github.com/operator-framework/operator-sdk/issues/1587
  • https://github.com/kubernetes/kubernetes/issues/65973
  • 关于kubernetes - 强制 Kubernetes 自定义资源规范字段的不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56740758/

    相关文章:

    kubernetes - 为什么我不能在 kubernetes 运算符中更改 cr 的值

    go - 如何使用 Status 字段创建 Kubernetes 对象?

    Kubernetes 不允许将文件挂载到容器

    amazon-web-services - 如何在外部公开 NATS 服务器

    Azure CLI 无法连接到 Docker 守护程序

    rabbitmq - 鼠兔 + RabbitMQ : setting basic_qos to prefetch=1 still appears to consume all messages in the queue

    node.js - 使用 amqplib npm 模块的 RabbitMQ 中的连接被拒绝错误

    docker - 在Kubernetes中自动生成Pod

    ruby-on-rails - Ruby on Rails log4r 和rabbitMQ 自定义输出器

    java - 在集群中运行时,SharedIndexInformer(Fabric8 kubernetes-client)仅监视其自身 namespace 的pod