web-dev-qa-db-ja.com

client-goを使用して一般的な「runtime.Object」をKubernetes APIに送信する方法

私はKubernetes v1.10であるAWSのEKSを使用しており、client-go v7.0.0を使用しています。

私がやろうとしていることは、ファイル内の複数のKubernetesリソース定義を含む.ymlファイルを解析し、それらのリソースをKubernetes APIに送信することです。このコードscheme.Codecs.UniversalDeserializer().Decodeを使用してファイルを正常に解析でき、_runtime.Object_の配列が返されます。

すべてのKubernetesリソースが_runtime.Object_インターフェースに準拠していることは知っていますが、APIに汎用インターフェースを送信する方法が見つかりません。私が見たほとんどのメソッドは、Deployment、Podなどの具象型のメソッドを使用しています。

このclientset.RESTClient().Put().Body(obj).Do()のような一般的なRESTClientの周りのコードをいくつか見ましたが、それは機能せず、理解できません。

すべてのポッドを正常に一覧表示できるため、クライアントセットが正しく構成されていることがわかります。

10
aloisbarreras

「ジェネリック」がある場合runtime.Object、これにはclient-goで dynamic client を使用できます。動的クライアントはunstructured.Unstructuredオブジェクトとすべてのruntime.Objectsに変換できます。次に例を示します。

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

それには動的クライアントが必要ですが、runtime.Objectで一般的な作業を継続するには、型指定されたクライアントを使用して利用可能なAPIバージョンを検出する必要があるDiscoveryRESTMapperを使用する必要があります。

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