Как выполнить CRUD на стороннем пользовательском ресурсе, для которого недоступен go api

Я работаю над Opersator-SDK. В моем контроллере оператора я хочу выполнить операцию CRUD на настраиваемом ресурсе (например, ExampleCR), для которого недоступен модуль go api

Предположим, в ExampleCR нет go api (у меня есть доступ к определению crd в yaml). Я наблюдаю за объектом Deployment и всякий раз, когда объект Deployment создается или обновляется. Я хочу выполнить следующую операцию над ExampleCR в моем коде контроллера.

  1. kubectl создать на ExampleCR
  2. Обновление kubectl на ExampleCR
  3. kubectl получить на ExampleCR

person suraj.tripathi    schedule 30.11.2020    source источник
comment
Есть ли Как отправить общий «runtime.Object» для Kubernetes API с использованием client-go покрывает этот случай за вас?   -  person David Maze    schedule 30.11.2020
comment
@DavidMaze да, я думаю, что могу использовать объект unstructured.Unstructured для решения моей проблемы. как только у меня будет рабочее решение. я опубликую это здесь   -  person suraj.tripathi    schedule 01.12.2020


Ответы (1)


Я смог решить эту проблему, используя неструктурированный. Неструктурированный тип.

Используя следующий пример, вы можете наблюдать CR (ExampleCR) в контроллере (Ref).

// You can also watch unstructured objects
u := &unstructured.Unstructured{}
u.SetGroupVersionKind(schema.GroupVersionKind{
    Kind:    "ExampleCR",
    Group:   "",
    Version: "version", // set version here
})
//watch for primary resource
err = c.Watch(&source.Kind{Type: u}, &handler.EnqueueRequestForObject{})
//watch for secondary resource
err = c.Watch(&source.Kind{Type: u}, &handler.EnqueueRequestForOwner{
    IsController: true,
    OwnerType:    &ownerVersion.OwnerType{}})

Как только вы это сделаете, контроллер получит запрос на согласование.

Работа CRUD останется такой же, как и для других типов (например, Pod).

создание объекта может быть выполнено с помощью следующих

func newExampleCR() (*unstructured.Unstructured)
    &unstructured.Unstructured{
        Object: map[string]interface{}{
            "apiVersion": "version", //set version here
            "kind":       "ExampleCR", // set CR name here
            "metadata": map[string]interface{}{
                "name": "demo-deployment",
            },
            "spec": map[string]interface{}{
                //spec goes here
            },
        },
    }
}

Полный пример можно найти здесь для объекта развертывания

ПРИМЕЧАНИЕ. Перед запуском менеджера необходимо убедиться, что CRD зарегистрирован в схеме.

person suraj.tripathi    schedule 23.12.2020