我正在使用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
字段上实施不变性,那将是一种简单的处理方法。
答案 0 :(得分:0)
AFAIK尚不适用于CRD。我们的方法通常是使用对象名称作为被控制对象的默认名称(在这种情况下为虚拟主机名称),这样自然就可以了。
答案 1 :(得分:0)
可以使用ValidatingAdmissionWebhook进行此验证,并通过CRD的OpenAPI验证提供将来的支持。
https://github.com/operator-framework/operator-sdk/issues/1587 https://github.com/kubernetes/kubernetes/issues/65973