如何使用client-go将泛型“runtime.Object”提交到Kubernetes API

mqxuamgl  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(2)|浏览(118)

我使用AWS的EKS,即Kubernetes v1.10,我使用的是client-go v7.0.0。
我尝试做的是解析一个.yml文件,其中包含多个Kubernetes资源定义,并将这些资源提交给Kubernetes API。我可以使用以下代码scheme.Codecs.UniversalDeserializer().Decode成功解析文件,并返回一个runtime.Object数组。
我知道所有Kubernetes资源都符合runtime.Object接口,但我找不到将通用接口提交给API的方法。我见过的大多数方法都使用具体类型上的方法,如Deployment,Pod等。
我已经看到了一些围绕通用RESTClient的代码,比如clientset.RESTClient().Put().Body(obj).Do(),但这不起作用,我无法弄清楚。
我知道我的clientset配置正确,因为我可以成功列出所有Pod。

4ktjp1zp

4ktjp1zp1#

如果你有一个“通用”runtime.Object,你可以在client-go中使用dynamic client来实现这个目标。动态客户端处理unstructured.Unstructured对象,所有runtime.Object都可以转换为它。下面是一个示例:

// create the dynamic client from kubeconfig
dynamicClient, err := dynamic.NewForConfig(kubeconfig)
if err != nil {
    return err
}
    
// convert the runtime.Object to unstructured.Unstructured
unstructuredObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
if err != nil {
    return err
}
    
// create the object using the dynamic client
nodeResource := schema.GroupVersionResource{Version: "v1", Resource: "Node"}
createdUnstructuredObj, err := dynamicClient.Resource(nodeResource).Namespace(ns).Create(unstructuredObj)
if err != nil {
    return err
}

// convert unstructured.Unstructured to a Node
var node *corev1.Node
if err = runtime.DefaultUnstructuredConverter.FromUnstructured(createdUnstructuredObj, node); err != nil {
    return err
}

字符串

idfiyjo8

idfiyjo82#

这是正确的,你需要动态客户端,但要保持运行时的通用性。对象,你需要使用DiscoveryRESTMapper,它需要使用类型化的客户端来发现可用的API版本:

dynClient, err := dynamic.NewForConfig(config)
...
clientset, err := kubernetes.NewForConfig(config)
...
gvk := obj.GroupVersionKind()
gk := schema.GroupKind{Group: gvk.Group, Kind: gvk.Kind}
groupResources, err := restmapper.GetAPIGroupResources(clientset.Discovery())
...
rm := restmapper.NewDiscoveryRESTMapper(groupResources)
mapping, err := rm.RESTMapping(gk, gvk.Version)
...
dynClient.Resource(mapping.Resource).Namespace("default").Create(obj, metav1.CreateOptions{})

字符串

相关问题