1
client-goを使用して、単一のYAMLファイル内の複数のタイプでKubernetes APIに対して直接「kubectl apply」を実行する
私はhttps://github.com/kubernetes/client-goを使用しており、すべて正常に動作します。 公式のKubernetesダッシュボードのマニフェスト(YAML)があります:https : //raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml kubectl applyclient-goを使用して、Goコードでこのマニフェストを模倣したいと思います。 YAMLバイトをいくつかの(アン)マーシャリングして、パッケージで定義されている正しいAPIタイプに変換する必要があることを理解しています:https : //github.com/kubernetes/api Createクラスターに単一のAPIタイプを正常に編集しましたが、同じではないタイプのリストを含むマニフェストでこれを行うにはどうすればよいですか?kind: List*これらのさまざまなタイプをサポートするリソースはありますか? 現在の回避策はcsplit、区切り記号として---を使用してYAMLファイルを分割することです csplit /path/to/recommended.yaml /---/ '{*}' --prefix='dashboard.' --suffix-format='%03d.yaml' 次に、作成された新しい(14)パーツをループし、それらのバイトを読み取り、UniversalDeserializerのデコーダーによって返されたオブジェクトのタイプを切り替え、k8sクライアントセットを使用して正しいAPIメソッドを呼び出します。 これをプログラムで実行して、ダッシュボードの新しいバージョンをクラスターに更新します。また、Metrics Serverや他の多くのリソースに対してもこれを行う必要があります。代替の(おそらくより簡単な)メソッドは、コンテナーイメージにインストールされたkubectlを使用してコードを出荷し、直接呼び出すことkubectl apply -f -です。しかし、それは、kubectlがそれを使用できるように、kube構成をディスクに書き込むか、インラインで渡す必要があることも意味します。 この問題が役立つことがわかりました:https : //github.com/kubernetes/client-go/issues/193 デコーダーはここにあります:https : //github.com/kubernetes/apimachinery/tree/master/pkg/runtime/シリアライザ ここでclient-goに公開されています:https : //github.com/kubernetes/client-go/blob/master/kubernetes/scheme/register.go#L69 私はまた、kubectlで使用されているRunConvert方法を見て撮影した:https://github.com/kubernetes/kubernetes/blob/master/pkg/kubectl/cmd/convert/convert.go#L139をし、そのIを想定します独自のgenericclioptions.IOStreamsを提供して出力を取得できますか? RunConvertは廃止予定のパスにあるようです [client-go]とタグ付けされた他の質問も調べましたが、ほとんどの場合、古い例を使用するか、単一のkind定義が含まれているYAMLファイルを使用しています。その後、APIが変更されました。 編集:複数のクラスターに対してこれを行う必要があり、プログラムでクラスターを作成しているため(AWS EKS API + CloudFormation / eksctl)、ServiceAccount多くのAWSアカウントにわたって、多くのクラスターコンテキストにわたってsを作成するオーバーヘッドを最小限に抑えたいと思います。理想的には、クライアントセットの作成に関連する唯一の認証手順は、aws-iam-authenticatorを使用して、クラスターデータ(名前、地域、CA証明書など)を使用してトークンを取得することです。aws-iam-authenticatorはしばらくリリースされていませんが、その内容でmasterは、サードパーティの役割のクロスアカウントの役割と外部IDを使用して渡すことができます。IMO、これはServiceAccount(およびIRSA)アプリケーション(アドオンを作成してこれらのクラスターに適用するバックエンドAPI)が対話する必要がある他のAWSサービスがあるため。 編集:私は最近https://github.com/ericchiang/k8sを見つけました。高レベルでのclient-goよりも使い方は間違いなく簡単ですが、この動作はサポートされていません。