我正在使用Kubernetes golang operator sdk实现一个管理RabbitMQ队列的操作符。我想知道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 (实际上是不同的命名空间)进行查询,这可能会导致创建新队列或更新错误的队列。
我正在考虑一些替代方案,比如使用required ObjectMeta.Name字段来同时包含连接的vhost和队列名,以确保它们对于已部署的队列是不可变的。或者以某种方式在操作符中缓存旧的规范(还没有确切地知道如何做到这一点),并在协调器中比较旧的和当前的规范,如果VHost
更改,则返回错误。然而,这两种方法似乎都不理想。理想情况下,如果运算符框架可以在VHost
字段上强制实现不变性,这将是处理此问题的一种简单方法。
发布于 2019-06-25 00:41:16
AFAIK此功能尚未提供给CRD。我们的方法通常是使用对象名作为被控制对象的缺省名称(在本例中是vhost name ),所以它很自然地工作得很好。
https://stackoverflow.com/questions/56740758
复制相似问题