问题描述
我正在开发一个新的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"`
}
请注意//+optional
和omitempty
关键字,并将此状态字段标记为可选。这样,K8s api用户可以创建资源而无需指定文档ID。然后,您的操作员可以在协调请求上与MongoDB进行交互,并在知道ID后更新/修补status.documentID
。