Как отправить универсальный "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{})