【问题标题】:Set ObjectMeta on Istio-resource with go-client使用 go-client 在 Istio-resource 上设置 ObjectMeta
【发布时间】:2019-08-06 18:55:30
【问题描述】:

我正在尝试从 Go 使用 Istio,并且正在使用 Kubernetes 和 Istio go-client 代码。

我遇到的问题是我无法在 Istio-ServiceRole 对象中指定 ObjectMetaTypeMeta。我只能指定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},
                },
            },
        },
    },
}

谁能指出我正确的方向?

【问题讨论】:

    标签: go kubernetes istio kubernetes-go-client


    【解决方案1】:

    啊 - 这是一个非常痛苦的点:Istio 需要 Kubernetes CRD 包装元数据(主要是 namenamespace 字段),但这些字段不是 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/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。最后,我想明确指出,因为它仅在示例中隐含:当您在 model.ConfigStore 上调用 Create 时,ConfigStore 依赖于用于创建它的 ProtoSchema 对象中的元数据。因此,请务必使用您将使用的所有类型的 ProtoSchema 对象初始化存储。


    您可以仅使用 K8s 客户端库和 istio.io/istio/pilot/pkg/config/kube/crd 包来实现相同的目的,但我没有亲身做过,也没有手头的示例。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2021-10-18
        • 2018-10-30
        • 2014-12-19
        • 2021-06-25
        • 2019-04-06
        • 1970-01-01
        • 2018-10-01
        • 2021-09-24
        相关资源
        最近更新 更多