使用go客户端在Istio资源上设置ObjectMeta

使用go客户端在Istio资源上设置ObjectMeta,go,kubernetes,istio,kubernetes-go-client,Go,Kubernetes,Istio,Kubernetes Go Client,我正在尝试使用来自Go的Istio,并且正在使用Kubernetes和Istio Go客户端代码 我遇到的问题是,我无法在我的Istio-ServiceRole对象中指定ObjectMeta或TypeMeta。我只能指定规则,这些规则在规范中 下面你可以看到我的工作: 导入( v1alpha1“istio.io/api/rbac/v1alpha1” ) func getDefaultServiceRole(应用程序nais.Application)*v1alpha1.ServiceRole{ 返

我正在尝试使用来自Go的Istio,并且正在使用Kubernetes和Istio Go客户端代码

我遇到的问题是,我无法在我的Istio-
ServiceRole
对象中指定
ObjectMeta
TypeMeta
。我只能指定
规则
,这些规则在
规范

下面你可以看到我的工作:

导入(
v1alpha1“istio.io/api/rbac/v1alpha1”
)
func getDefaultServiceRole(应用程序nais.Application)*v1alpha1.ServiceRole{
返回&v1alpha1.ServiceRole{
规则:[]*v1alpha1.AccessRule{
{
端口:[]int32{2},
},
},
}
}
我想做的是让这个代码工作:

func getDefaultServiceRole(app*nais.Application)*v1alpha1.ServiceRole{
返回&v1alpha1.ServiceRole{
TypeMeta:metav1.TypeMeta{
种类:“服务角色”,
APIVersion:“v1alpha1”,
},
ObjectMeta:metav1.ObjectMeta{
名称:app.Name,
名称空间:app.Namespace,
},
规格:v1alpha1.ServiceRole{
规则:[]*v1alpha1.AccessRule{
{
端口:[]int32{2},
},
},
},
},
}

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

啊-这是一个非常痛苦的问题:Istio需要Kubernetes CRD包装元数据(主要是
名称
命名空间
字段),但这些字段本身不是API对象的一部分,也不在protos中表示。(这随着Galley使用的用于配置组件的新MCP API而改变,但这对您的用例没有帮助。)相反,您应该使用中的类型,它实现了K8s CRD接口

使用golang中的Istio对象最简单的方法是使用Pilot的库,特别是和包,以及结构。您可以传递完整的
model.Config
(不太好,因为
spec
具有类型
proto.Message
,因此需要类型断言来提取所关心的数据),或者在推送内部对象之前,将其包装在
model.Config
中。您可以使用该类型帮助进行YAML和JSON之间的转换,该类型是公共类型,您可以为任意类型创建它们

因此,使用您的示例代码,我可能会尝试以下操作:

导入(
v1alpha1“istio.io/api/rbac/v1alpha1”
“istio.io/istio/pilot/pkg/model”
)
func getDefaultServiceRole()*v1alpha1.ServiceRole{
返回&v1alpha1.ServiceRole{
规则:[]*v1alpha1.AccessRule{
{
端口:[]int32{2},
},
},
}
}
func-toConfig(app*nais.Application,role*v1alpha1.ServiceRole)model.Config{
return&model.Config{
ConfigMeta:model.ConfigMeta{
名称:app.Name,
名称空间:app.Namespace,
},
规格:app,
}
}
输入Client model.ConfigStore
func(c客户端)CreateRoleFor(应用程序nais.Application,角色*v1alpha1.ServiceRole)错误{
cfg:=toConfig(应用程序、角色)
_,err:=c.Create(cfg)
返回错误
}
作为一个更完整的示例,我们以这种风格构建了Istio CloudMap操作符。给你。最后,我想明确地调用它,因为它只是在示例中隐含的:当您在
model.ConfigStore
上调用
Create
时,
ConfigStore
依赖于用于创建它的
ProtoSchema
对象中的元数据。因此,对于您将要使用的所有类型,请确保使用
ProtoSchema
对象初始化存储


您可以使用K8s客户端库和
istio.io/istio/pilot/pkg/config/kube/crd
包实现同样的功能,但我还没有亲自完成,也没有现成的示例。

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对象