使用go-client在Istio-resource上设置ObjectMeta

问题描述 投票:2回答:1

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

我遇到的问题是我不能在我的Istio-ObjectMeta对象中指定TypeMetaServiceRole。我只能指定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},
                },
            },
        },
    },
}

谁能指出我正确的方向?

go kubernetes istio kubernetes-go-client
1个回答
4
投票

啊 - 这是一个非常痛苦的观点:Istio需要Kubernetes CRD包装器元数据(主要是namenamespace字段),但这些字段不是API对象本身的一部分,也不是它们在protos中表示。 (这正在改变新的MCP API用于配置组件--Galley使用 - does encode these fields as protobufs但这对您的用例没有帮助。)相反,您应该使用实现K8s CRD接口的istio.io/istio/pilot/pkg/config/kube/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中。您可以使用model.ProtoSchema类型来帮助转换YAML和JSON。 Pilot only defines ProtoSchema objects for the networking 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运算符。 Here's the core of it that pushes config to K8s with Pilot libraries.这是the incantation to create an instance of model.ConfigStore to use to create objects。最后,我想明确地调出来,因为它只是隐含在示例中:当你在Create上调用model.ConfigStore时,ConfigStore依赖于用于创建它的ProtoSchema对象中的元数据。因此,请务必使用ProtoSchema对象为您正在使用的所有类型初始化商店。


你可以使用K8s客户端库和istio.io/istio/pilot/pkg/config/kube/crd包来实现同样的目的,但我还没有亲手完成它并且没有方便的示例。

© www.soinside.com 2019 - 2024. All rights reserved.