【问题标题】:How to get schema.GroupVersionResource for given k8s resource's json如何获取给定 k8s 资源的 json 的 schema.GroupVersionResource
【发布时间】:2021-07-08 06:03:23
【问题描述】:
  • client-go v0.19.2
  • golang 1.13

我正在构建一个从 json 创建 k8s 资源的工具(就像 kubectl create -f 一样)。

我发现动态客户端可以做这样的事情,但是当我将它与下面的代码一起使用时,我发现很难找到给定资源的 json 的 schema.GroupVersionResource。我错过了什么或者获取资源的唯一方法是通过恢复映射器?

container := &unstructured.Unstructured{}
if err := container.UnmarshalJSON([]byte(jsonstring); err != nil {
    return err
}

_, err := k8sclient.Dynamic.Resource(?).Create(ctx, container, metav1.CreateOptions{})
if err != nil {
    return err
}

我知道一种解决方法是编写如下代码,但我确信这不是最佳实践,除了 crds 之外还有太多。

var kindResourceMap = map[string]schema.GroupVersionResource{
    "Deployment": {
        Group:    "apps",
        Version:  "v1",
        Resource: "deployments",
    },
    "ConfigMap": {
        Group:    "apps",
        Version:  "v1",
        Resource: "configmaps",
    },
    "Job": {
        Group:    "batch",
        Version:  "v1",
        Resource: "jobs",
    },
    "Secret": {
        Group:    "api",
        Version:  "v1",
        Resource: "secrets",
    },
    "Service": {
        Group:    "api",
        Version:  "v1",
        Resource: "services",
    },
    "StatefulSet": {
        Group:    "apps",
        Version:  "v1",
        Resource: "statefulsets",
    },
    "PersistentVolume": {
        Group:    "api",
        Version:  "v1",
        Resource: "persistentvolumes",
    },
    "CustomResourceDefinition": {
        Group:    "apiextensions.k8s.io",
        Version:  "v1beta1",
        Resource: "customresourcedefinitions",
    },
}

【问题讨论】:

    标签: go kubernetes client-go


    【解决方案1】:

    您可以使用restmapper,使用discovery 客户端直接从metav1 查询定义。

    import (
        "k8s.io/client-go/rest"
        "k8s.io/client-go/discovery"
        "k8s.io/client-go/restmapper"
        "k8s.io/apimachinery/pkg/runtime/schema"
    )
    
     ...
    
    c := discovery.NewDiscoveryClientForConfigOrDie(&rest.Config{})
    
    groupResources, err := restmapper.GetAPIGroupResources(c)
    mapper := restmapper.NewDiscoveryRESTMapper(groupResources)
    
    mapping, err := mapper.RESTMapping(schema.ParseGroupKind("apps.Deployment"))
    fmt.Println(mapping.Resource)
    

    这是在sigs.k8s.io/controller-runtime/pkg/client做的

    mapping, err := c.RESTMapper().RESTMapping(schema.ParseGroupKind("apps.Deployment"))
    fmt.Println(mapping.Resource)
    

    查看这里是如何完成的: https://github.com/kubernetes-sigs/controller-runtime/blob/master/pkg/client/apiutil/dynamicrestmapper.go#L77

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 2019-08-15
      • 1970-01-01
      • 2021-07-07
      • 2020-02-10
      • 2022-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多