2

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

问题是,如何将运营商需要创建的 CR 链接到这个上游对象?我在哪里可以存储这种独特BSON ID的 K8S 方式,以便我可以使用它进行进一步查找。

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

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

当我kubectl apply -f对此 CRD 执行操作时,它会被创建。

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

然后我的操作员在协调循环中选择它,然后在我的服务器中创建这个对象。服务器生成一个 BSON ID。我需要使用此 BSON ID 进行进一步查找。

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

4

1 回答 1

0

如果每个自定义资源对象都与一个 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"`
}

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

于 2020-10-11T14:20:22.140 回答