如何获取架构。给定 k8s 资源的 json 的组版本资源


  • client-go v0.19.2
  • 戈朗 1.13

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

我发现动态客户端可以做这样的事情,但是当我用下面的代码使用它时,我发现很难找到模式。给定资源的 json 的组版本资源。我是否错过了什么,或者获取资源的唯一方法是通过 restmapper?

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
}

我知道一个解决方法是编写一些像 bellow 这样的代码,但我确信这不是最佳实践,除了 crd 之外,还有太多的代码。

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",
},
}

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

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

相关内容

最新更新