目次
バックグラウンド
Kubernetes は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化する人気のコンテナ オーケストレーション システムです。Kubernetes では、すべてのリソースは YAML ファイルの形式で定義および構成されます。場合によっては、後で使用するために、作成された Kubernetes リソースの YAML データを抽出する必要があります。
このブログ投稿では、Go プログラミング言語を使用して、Kubernetes API を通じて指定されたリソースの YAML データを取得する関数を作成する方法を説明します。
実用的
関数定義
func GetResourceYaml(cf *genericclioptions.ConfigFlags, typ, name string) ([]byte, error)
関数のパラメータはKubernetesのクライアント構成情報cf
であり、それぞれtyp
取得するリソースの種類と名前を表します。name
この関数は、リソースの YAML データと考えられるエラーのバイト配列を返します。
関数の実装
この関数では、まず Kubernetes クライアント構成情報を使用して現在の名前空間cf
を取得しますns
。
ns, _, _ := cf.ToRawKubeConfigLoader().Namespace()
次に、Kubernetes の API を使用して、指定されたリソースのオブジェクトを取得します。このプロセスでは、リソースの種類と名前を指定してステートレス リソース ジェネレーターを作成し、Do()
メソッド。
obj, err := resource.NewBuilder(cf).
DefaultNamespace().
NamespaceParam(ns).
SingleResourceType().
ResourceNames(typ, name).
Unstructured().
Do().
Object()
if err != nil {
return nil, fmt.Errorf("get object: %w", err)
}
次に、リソース オブジェクトからメタデータ オブジェクトを取得しmetaObj
、メタデータ オブジェクト内の管理フィールドを削除するSetManagedFields(nil)
メソッド。
metaObj, err := meta.Accessor(obj)
if err != nil {
return nil, fmt.Errorf("access object: %w", err)
} else {
metaObj.SetManagedFields(nil)
}
最後に、YAML 形式を使用してメタデータ オブジェクトをバイト配列にmetaObj
シリアル化しますb
。
b, err := yaml.Marshal(metaObj)
if err != nil {
return nil, fmt.Errorf("marshal object: %w", err)
}
関数の完全なコード実装は次のとおりです。
func GetResourceYaml(cf *genericclioptions.ConfigFlags, typ, name string) ([]byte, error) {
ns, _, _ := cf.ToRawKubeConfigLoader().Namespace()
obj, err := resource.NewBuilder(cf).
DefaultNamespace().
NamespaceParam(ns).
SingleResourceType().
ResourceNames(typ, name).
Unstructured().
Do().
Object()
if err != nil {
return nil, fmt.Errorf("get object: %w", err)
}
metaObj, err := meta.Accessor(obj)
if err != nil {
return nil, fmt.Errorf("access object: %w", err)
} else {
metaObj.SetManagedFields(nil)
}
b, err := yaml.Marshal(metaObj)
if err != nil {
return nil, fmt.Errorf("marshal object: %w", err)
}
return b, nil
}
結論は
このブログ投稿では、Kubernetes API を使用して、Go プログラミング言語を通じて指定されたリソースの YAML データを取得します。まずクライアント構成情報と現在の名前空間を取得し、次にリソース ジェネレーターを使用して指定されたリソースのオブジェクトを取得します。次に、リソース オブジェクトからメタデータ オブジェクトを取得し、その中の管理フィールドを削除します。最後に、関数の戻り値として YAML 形式を使用して、メタデータ オブジェクトをバイト配列にシリアル化します。
この機能は幅広いシナリオで使用されており、たとえば、Kubernetes リソースをバックアップまたは移行する必要がある場合、リソースの YAML データを抽出する必要があります。また、作成したリソースを素早くコピーする必要がある場合は、この機能を使用してリソースの YAML データを取得し、kubectl apply コマンドを使用してクイック コピーを実行することもできます。
なお、実際に利用する際には、Kubernetes APIに正しくアクセスできるように、この機能をKubernetesクライアントの設定情報と併用する必要があります。さらに、CustomResourceDefinition などの一部の高度な Kubernetes リソースの場合、この関数にはいくつかの制限や制限がある場合があり、特定の状況に応じて調整および変更する必要があります。