使用go-client在Istio资源上设置ObjectMeta

时间:2019-03-15 16:29:10

标签: go kubernetes istio kubernetes-go-client

我正在尝试从Go中使用Istio,并且正在使用Kubernetes和Istio Go客户端代码。

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

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:4)

啊-这很痛苦:Istio需要Kubernetes CRD包装器元数据(主要是namenamespace字段),但是这些字段既不是API对象本身的一部分,也不表示它们在原始人中。 (随着用于配置组件的新MCP API的改变(Galley使用了does encode these fields as 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之前。您可以使用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包来实现相同的功能,但是我没有直接做,也没有方便的示例。

答案 1 :(得分:3)

Istio现在支持:

WORKSPACE

workspace(name = "my_workspace") 是一个istio对象。