使用go客户端在Istio资源上设置ObjectMeta
我正在尝试使用来自Go的Istio,并且正在使用Kubernetes和Istio Go客户端代码 我遇到的问题是,我无法在我的Istio-使用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{ 返
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对象