3

我正在尝试使用 Go 中的 Istio,并且正在使用 Kubernetes 和 Istio go-client 代码。

我遇到的问题是我无法指定ObjectMetaTypeMeta在我的 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},
                },
            },
        },
    },
}

谁能指出我正确的方向?

4

2 回答 2

4

啊 - 这是一个非常痛苦的点:Istio 需要 Kubernetes CRD 包装元数据(主要是nameandnamespace字段),但这些字段不是 API 对象本身的一部分,也不是在 protos 中表示的。(这随着用于配置组件的新 MCP API 的变化——Galley 使用——确实将这些字段编码为 protobufs,但这对您的用例没有帮助。)相反,您应该使用istio.io/istio/pilot/pkg/config/kube/crd实现 K8s CRD 接口的 中的类型.

在 golang 中使用 Istio 对象的最简单方法是使用 Pilot 的库,尤其是istio.io/istio/pilot/pkg/modelistio.io/istio/pilot/pkg/config/kube/crd包以及model.Config结构。你可以传递完整的model.Config(不是很好,因为spec有类型proto.Message,所以你需要类型断言来提取你关心的数据),或者传递内部对象,model.Config在你推送它之前将它包装在 a 中。您可以使用该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 算子。这是使用 Pilot 库将配置推送到 K8s 的核心。这是创建用于创建对象的 model.ConfigStore 实例的咒语。最后,我想明确指出,因为它仅在示例中隐含:当您调用Createmodel.ConfigStoreConfigStore依赖于ProtoSchema用于创建它的对象中的元数据。因此,请务必使用ProtoSchema您将使用的所有类型的对象初始化存储。


您可以只使用 K8s 客户端库和istio.io/istio/pilot/pkg/config/kube/crd包来实现相同的目的,但我没有亲身做过,也没有方便的示例。

于 2019-03-15T19:46:40.420 回答
4

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 对象在哪里。

于 2020-09-23T20:41:34.957 回答