Установить ObjectMeta на Istio-ресурс с помощью go-client - PullRequest
2 голосов
/ 15 марта 2019

Я пытаюсь работать с Istio из Go и использую код go-клиента Kubernetes и Istio.

Проблема в том, что я не могу указать ObjectMeta или TypeMeta в моем объекте Istio- ServiceRole. Я могу указать только rules, которые находятся внутри spec.

Ниже вы можете увидеть, что у меня получилось:

import (
    v1alpha1 "istio.io/api/rbac/v1alpha1"
)


func getDefaultServiceRole(app nais.Application) *v1alpha1.ServiceRole {
    return &v1alpha1.ServiceRole{
        Rules: []*v1alpha1.AccessRule{
            {
                Ports: []int32{2},
            },
        },
    }
}

Я хотел бы, чтобы этот код работал:

func getDefaultServiceRole(app *nais.Application) *v1alpha1.ServiceRole {
    return &v1alpha1.ServiceRole{
        TypeMeta: metav1.TypeMeta{
            Kind:       "ServiceRole",
            APIVersion: "v1alpha1",
        },
        ObjectMeta: metav1.ObjectMeta{
            Name:      app.Name,
            Namespace: app.Namespace,
        },
        Spec: v1alpha1.ServiceRole{
            Rules: []*v1alpha1.AccessRule{
                {
                    Ports: []int32{2},
                },
            },
        },
    },
}

Кто-нибудь может указать мне правильное направление?

1 Ответ

4 голосов
/ 15 марта 2019

Ах - это довольно болезненный момент: Istio требует метаданные оболочки CRD Kubernetes (прежде всего поля name и namespace), но эти поля не являются частью самих объектов API и не представлены в протосах.(Это меняется с новым MCP API для настройки компонентов - который использует Galley - кодирует эти поля как protobufs , но это не помогает в вашем случае использования.) Вместо этого вы должны использовать типы в istio.io/istio/pilot/pkg/config/kube/crd, которые реализуют интерфейс CRD K8s.

Самый простой способ работы с объектами Istio в golang - это использовать библиотеки Pilot, в частности, istio.io/istio/pilot/pkg/modelи istio.io/istio/pilot/pkg/config/kube/crd пакетов, а также структура model.Config.Вы можете либо передать полный model.Config (не очень хорошо, потому что spec имеет тип proto.Message, поэтому вам нужны утверждения типа для извлечения данных, которые вам нужны), либо передать внутренний объект, обернув его в model.Config перед тем, какВы нажимаете это.Вы можете использовать тип model.ProtoSchema, чтобы помочь с преобразованием в YAML и JSON. Pilot определяет только ProtoSchema объекты для сетевого API , тип является общедоступным, и вы можете создавать их для произвольных типов.

Итак, используя ваш пример кода, я мог бы попробовать что-то вроде:

import (
    v1alpha1 "istio.io/api/rbac/v1alpha1"
   "istio.io/istio/pilot/pkg/model"
)


func getDefaultServiceRole() *v1alpha1.ServiceRole {
    return &v1alpha1.ServiceRole{
        Rules: []*v1alpha1.AccessRule{
            {
                Ports: []int32{2},
            },
        },
    }
}

func toConfig(app *nais.Application, role *v1alpha1.ServiceRole) model.Config {
    return &model.Config{
        ConfigMeta: model.ConfigMeta{
            Name:      app.Name,
            Namespace: app.Namespace,
        },
        Spec: app,
    }
}

type Client model.ConfigStore
func (c Client) CreateRoleFor(app nais.Application, role *v1alpha1.ServiceRole) error {
    cfg := toConfig(app, role)
    _, err := c.Create(cfg)
    return err
}

В качестве более полного примера мы построили оператор Istio CloudMap в этом стиле. Вот его ядро, которое передает конфигурацию на K8s с библиотеками Pilot. Вот заклинание для создания экземпляра model.ConfigStore для использования при создании объектов .Наконец, я хочу вызвать явно, поскольку это неявно только в примере: когда вы вызываете Create для model.ConfigStore, ConfigStore опирается на метаданные в ProtoSchema объектах, использованных для его создания.Поэтому обязательно инициализируйте хранилище с ProtoSchema объектами для всех типов, с которыми вы будете работать.


Вы можете добиться того же, используя только клиентские библиотеки K8s и пакет istio.io/istio/pilot/pkg/config/kube/crd, но я не сделал это на собственном опыте, и у меня нет под рукой примеров.

...