Как отправить универсальный "runtime.Object" в API Kubernetes, используя client-go

Я использую EKS AWS, который является Kubernetes v1.10, и я использую client-go v7.0.0.

Я пытаюсь проанализировать файл.yml с несколькими определениями ресурсов Kubernetes в файле и отправить эти ресурсы в API Kubernetes. Я могу успешно разобрать файлы, используя этот код scheme.Codecs.UniversalDeserializer().Decodeи я вернусь массив runtime.Object,

Я знаю, что все ресурсы Kubernetes соответствуют runtime.Object интерфейс, но я не могу найти способ передать общий интерфейс в API. Большинство методов, которые я видел, используют методы для конкретных типов, таких как Deployment, Pod и т. Д.

Я видел некоторый код вокруг общего RESTClient, как это clientset.RESTClient().Put().Body(obj).Do(), но это не работает, и я не могу понять это.

Я знаю, что мой клиентский набор настроен правильно, потому что я могу успешно перечислить все модули.

1 ответ

Если у вас есть "универсальный" runtime.Object, вы можете использовать динамический клиент в client-go для этого. Динамический клиент имеет дело с 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
}

Правильно, что для этого вам нужен динамический клиент, но для обеспечения общей работы со средой выполнения. Объект должен использовать 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{})
Другие вопросы по тегам