Как отправить общий "runtime.Object" в API Kubernetes, используя client-go - PullRequest
0 голосов
/ 16 ноября 2018

Я использую AWS EKS, который является 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(), но это не работает, и я не могу понять это.

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

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

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

Если у вас есть «универсальный» runtime.Object, вы можете использовать динамический клиент в client-go для этого.Динамический клиент имеет дело с unstructured.Unstructured объектами, и все runtime.Object s могут быть преобразованы в него.Вот пример:

// 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
}
...