【client-goで遊ぶ】KubernetesリソースのYAMLデータを解析するGo関数の実装

目次

バックグラウンド

実用的

関数定義

関数の実装

 結論は


バックグラウンド

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 リソースの場合、この関数にはいくつかの制限や制限がある場合があり、特定の状況に応じて調整および変更する必要があります。

おすすめ

転載: blog.csdn.net/kingu_crimson/article/details/129924986