我正在尝试从Go中使用Istio,并且正在使用Kubernetes和Istio Go客户端代码。
我遇到的问题是我无法在Istio-ObjectMeta
对象中指定TypeMeta
或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},
},
},
},
},
}
有人能指出我正确的方向吗?
答案 0 :(得分:4)
啊-这很痛苦:Istio需要Kubernetes CRD包装器元数据(主要是name
和namespace
字段),但是这些字段既不是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/model
和istio.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对象。