Ах - это довольно болезненный момент: 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
, но я не сделал это на собственном опыте, и у меня нет под рукой примеров.