В операторах k8s, как связать уникальное имя metadata.name в спецификации CRD с уникальным идентификатором объекта, который генерирует мой сервер

Я разрабатываю нового оператора для управления CRD объектов моей бизнес-логики. Мои бизнес-объекты хранятся в Mongo, и поэтому нам нужен этот BSON ID (GUID длиной 12 букв), чтобы вносить в этот объект последующие изменения.

Вопрос в том, как связать 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. Мне нужно использовать этот идентификатор BSON для дальнейших поисков.

Как я могу сохранить BSON ID, специфичный для сервера, чтобы разработчикам просто нужно было использовать уникальное metadata имя в спецификации, в то время как под капотом мой оператор позаботится о связывании этих двух?


person Sedkis    schedule 08.10.2020    source источник


Ответы (1)


Если каждый настраиваемый объект ресурса коррелирует с одним документом MongoDB, вы можете сохранить идентификатор документа в виде строки в поле статуса вашего настраиваемого ресурса.

// +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, отметив это поле статуса как необязательное. Таким образом, пользователь API K8s может создавать ресурсы без указания идентификатора документа. После этого ваш оператор может взаимодействовать с вашей MongoDB по запросам согласования и обновлять / исправлять status.documentID, как только станет известен идентификатор.

person Dominik    schedule 11.10.2020