- 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