私は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の周りのコードをいくつか見ましたが、それは機能せず、理解できません。
すべてのポッドを正常に一覧表示できるため、クライアントセットが正しく構成されていることがわかります。
「ジェネリック」がある場合runtime.Object
、これにはclient-goで dynamic client を使用できます。動的クライアントは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
}
それには動的クライアントが必要ですが、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{})