How to Submit generic "runtime.Object" to Kubernetes API using client-go How to Submit generic "runtime.Object" to Kubernetes API using client-go kubernetes kubernetes

How to Submit generic "runtime.Object" to Kubernetes API using client-go


If you have a "generic" runtime.Object, you can use the dynamic client in client-go for this. The dynamic client deals with unstructured.Unstructured objects and all runtime.Objects can be converted to it. Here is an example:

// create the dynamic client from kubeconfigdynamicClient, err := dynamic.NewForConfig(kubeconfig)if err != nil {    return err}// convert the runtime.Object to unstructured.UnstructuredunstructuredObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)if err != nil {    return err}// create the object using the dynamic clientnodeResource := 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 Nodevar node *corev1.Nodeif err = runtime.DefaultUnstructuredConverter.FromUnstructured(createdUnstructuredObj, node); err != nil {    return err}


It's correct that you need the dynamic client for that but to keep things generic working with runtime.Object you need to use the DiscoveryRESTMapper which needs to use the typed client for discovery of available api versions:

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{})