#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.