我正在尝试使用Go的Istio,并使用Kubernetes和Istio go-client代码。
我遇到的问题是我不能在我的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},
},
},
},
},
}
谁能指出我正确的方向?
啊 - 这是一个非常痛苦的观点:Istio需要Kubernetes CRD包装器元数据(主要是name
和namespace
字段),但这些字段不是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/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
包来实现同样的目的,但我还没有亲手完成它并且没有方便的示例。