Kubernetes crd не удалось создать с использованием интерфейса go-client

Toby Xu спросил: 28 апреля 2018 в 08:47 в: kubernetes

Я создал Kubernetes CRD по примеру https://github.com/kubernetes/sample-controller.

Мой контроллер отлично работает, и я могу прослушивать события create / update / delete моего CRD. Пока я не попытался создать объект, используя интерфейс go-client.

Это мой CRD.

type MyEndpoint struct {
    metav1.TypeMeta   `json:",inline"`    // Standard object's metadata.
    // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
    // +optional
    metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
}

Я могу создать определение CRD и создать объект с помощью kubectl без проблем. Но я получил сбой, когда использовал следующий код для создания объекта.

myepDeploy := &crdv1.MyEndpoint{
    TypeMeta: metav1.TypeMeta{
        Kind:       "MyEndpoint",
        APIVersion: "mydom.k8s.io/v1",
    },
    ObjectMeta: metav1.ObjectMeta{
        Name: podName,
        Labels: map[string]string{
            "serviceName": serviceName,
            "nodeIP": nodeName,
            "port": "5000"
        },
    },
}
epClient := myclientset.MycontrollerV1().MyEndpoints("default")
epClient.Create(myepDeploy)

Но у меня получилась следующая ошибка:

object *v1.MyEndpoint does not implement the protobuf marshalling interface and cannot be encoded to a protobuf message

Я принимаю посмотрите на другие стандартные типы, я не вижу, реализовали ли они такой интерфейс. Я искал в Google, но не получаю удачи.

Любые идеи? Пожалуйста помоги. Кстати, я бегу на minikube.

1 ответ

VAS ответил: 29 апреля 2018 в 06:29

Для большинства распространенных типов и простых типов сортировка выполняется из коробки. В случае более сложной структуры вам может потребоваться реализовать интерфейс маршаллинга вручную.

Вы можете попытаться прокомментировать часть структуры MyEndpoint, чтобы узнать, что именно вызвало проблему.