Установить ObjectMeta на Istio-ресурс с помощью go-клиента

#go #kubernetes #istio #kubernetes-go-client

#Вперед #kubernetes #istio #kubernetes-go-client

Вопрос:

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

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

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

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


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

Что я хотел бы сделать, так это заставить этот код работать:

 func getDefaultServiceRole(app *nais.Application) *v1alpha1.ServiceRole {
    return amp;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:

Ах, это довольно болезненный момент: Istio требует метаданных оболочки Kubernetes CRD (в первую очередь полей 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 amp;v1alpha1.ServiceRole{
        Rules: []*v1alpha1.AccessRule{
            {
                Ports: []int32{2},
            },
        },
    }
}

func toConfig(app *nais.Application, role *v1alpha1.ServiceRole) model.Config {
    return amp;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 с пилотными библиотеками. Вот заклинание для создания экземпляра model.Хранилище конфигурации для использования при создании объектов. Наконец, я хочу вызвать явно, поскольку это неявно только в примере: когда вы вызываете Create через model.ConfigStore , ConfigStore он полагается на метаданные в ProtoSchema объектах, использованных для его создания. Поэтому обязательно инициализируйте хранилище с ProtoSchema объектами для всех типов, с которыми вы будете работать.


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

Ответ №2:

Istio теперь поддерживает:

 import (
    istiov1alpha3 "istio.io/api/networking/v1alpha3"
    istiogov1alpha3 "istio.io/client-go/pkg/apis/networking/v1alpha3"
)

VirtualService := istiogov1alpha3.VirtualService{
        TypeMeta:   metav1.TypeMeta{
            Kind: "VirtualService",
            APIVersion: "networking.istio.io/v1alpha3",
        },
        ObjectMeta: metav1.ObjectMeta{
            Name: "my-name",
        },
        Spec:       istiov1alpha3.VirtualService{},
}
  

Где istiov1alpha3.VirtualService{} — объект istio.