加强Kubernetes自定义资源规范字段的不变性

时间:2019-06-24 16:38:28

标签: kubernetes rabbitmq kubernetes-operator

我正在使用Kubernetes golang运算符sdk来实现管理RabbitMQ队列的运算符。我想知道k8是否可以在我的自定义资源上强制特定规范字段保持不变性。我有以下代表了RabbitMQ队列的golang结构,以及一些参数使其绑定到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的预期队列,因为它将使用不同的虚拟主机(实际上是不同的名称空间)进行查询,这可能导致创建新队列或更新错误的队列。

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

2 个答案:

答案 0 :(得分:0)

AFAIK尚不适用于CRD。我们的方法通常是使用对象名称作为被控制对象的默认名称(在这种情况下为虚拟主机名称),这样自然就可以了。

答案 1 :(得分:0)