在k8s运算符中,如何将CRD规范中的唯一metadata.name链接到服务器生成的唯一对象ID

问题描述

我正在开发一个新的Operator来管理我的业务逻辑对象的CRD。我的业务对象存储在Mongo中,因此,我们需要此BSON ID(12个字母长的GUID)来对该对象进行后续更改。

问题是,如何将操作员需要创建的CR链接到该上游对象?我可以在哪里以K8S方式存储这种独特的BSON ID,以便可以将其用于进一步的查找。

示例,这是我的上游对象之一的CRD:

apiVersion: my.custom.object/v1alpha1
kind: ApiDefinition
metadata:
  name: httpbin
spec:
  description: my first api
  use_keyless: true
  protocol: http

当我对此CRD做kubectl apply -f时,它就被创建了。

kubectl apply -f "the_above_yaml.yaml"
ApiDefinition created!

然后,我的操作员在协调循环中将其拾取,然后在该循​​环中在我的服务器中创建此对象。服务器生成一个BSON ID。我需要使用此BSON ID进行进一步的查找。

我该如何存储服务器特定的BSON ID,以便开发人员只需要在规范中使用唯一的metadata名称,而我的操作员则将两者联系起来?

解决方法

如果每个自定义资源对象都与一个MongoDB文档相关,则可以将文档ID作为字符串存储在自定义资源的状态字段中。

// +kubebuilder:subresource:status
type MyOwnCR struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty"`

    Spec   MyOwnCRSpec   `json:"spec,omitempty"`
    Status MyOwnCRStatus `json:"status,omitempty"`
}

// MyOwnCRStatus defines the observed state of MyOwnCR
type MyOwnCRStatus struct {
    //+optional
    DocumentID string `json:"documentID,omitempty"`
}

请注意//+optionalomitempty关键字,并将此状态字段标记为可选。这样,K8s api用户可以创建资源而无需指定文档ID。然后,您的操作员可以在协调请求上与MongoDB进行交互,并在知道ID后更新/修补status.documentID

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...