Kustomize と Helm で Config Sync を使用する

このチュートリアルでは、Helm チャートを参照する Kustomize の構成をリポジトリに追加し、Config Sync を使用してクラスタをリポジトリと同期します。

Config Sync を使用すると、Git リポジトリに配置した Kustomize 構成と Helm チャートが自動的にレンダリングされます。自動レンダリングには、次の利点があります。

  • 外部ハイドレーション パイプラインが不要になります。自動レンダリングを使用しない場合は、ワークステーションで Kustomize と Helm を使用して構成を手動でレンダリングするか、CI システムでハイドレーション プロセスをトリガーするステップを設定する必要があります。自動レンダリングでは、Config Sync がこの実行を処理します。

  • メンテナンス費用が削減されます。自動レンダリングを使用しない場合は、元の Kustomize 構成と Helm チャートを格納した Git リポジトリと、外部ハイドレーションによって生成された出力を格納した Git リポジトリを各一つ維持する必要があります。次に、レンダリングされた出力を格納した Git リポジトリから同期するように Config Sync を構成する必要があります。自動レンダリングを使用する場合は、元の構成ファイルを含むリポジトリを一つ維持するだけで済みます。

  • 開発ワークフローが簡易化されます。自動レンダリングを使用しない場合、元の構成ファイルに変更を加えると、マージする前に 2 回確認する必要があります。1 回目は元のリポジトリで、2 回目はレンダリングされたリポジトリで確認が必要です。自動レンダリングを使用する場合は、レンダリングされた構成ファイルは Config Sync によって生成されるため、元の構成ファイルに加えられた変更を確認するだけで済みます。

リポジトリを構成する

次のタスクでは、Kustomize 構成と Helm チャートを組み合わせた構成ファイルを使用して、Git リポジトリを準備する方法を示します。

  1. Git リポジトリを作成するか、Git リポジトリにアクセスできることを確認します。リポジトリでは Kustomize と Helm を使用しているため、これは非構造化リポジトリである必要があります。

  2. Git リポジトリのルートで、kustomization.yaml という名前のファイルを作成して次のコードを貼り付けます。

    # ./kustomization.yaml
    resources:
    - base
    
    patches:
    - path: ignore-deployment-mutation-patch.yaml
      target:
        kind: Deployment
    

    このファイルは Kustomize ベースを指す Kustomize オーバーレイです。このオーバーレイには、すべての Deployment オブジェクトに client.lifecycle.config.k8s.io/mutation: ignore アノテーションを追加する、Helm チャートのベースに対するパッチが含まれています。アノテーションが作成されると、Config Sync はクラスタ内のオブジェクトに対して競合する変更を無視するようになります。

  3. Git リポジトリに base という名前のディレクトリを作成します。

    mkdir base
    
  4. base ディレクトリに kustomization.yaml という名前の別のファイルを作成して次のコードを貼り付けます。

    # ./base/kustomization.yaml
    helmCharts:
    - name: cert-manager
      repo: https://charts.jetstack.io
      version: v1.5.3
      releaseName: my-cert-manager
      namespace: cert-manager
    

    このファイルは Kustomize ベースで、リモート Helm チャートをレンダリングします。

  5. Git リポジトリのルートに戻り、ignore-deployment-mutation-patch.yaml という名前のファイルを作成して次のコードを貼り付けます。

    # ./ignore-deployment-mutation-patch.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: any
     annotations:
       client.lifecycle.config.k8s.io/mutation: ignore
    

    このファイルは、ベースの Helm チャートに適用されるパッチです。client.lifecycle.config.k8s.io/mutation: ignore アノテーションがベース ディレクトリ内のすべての Deployment に追加されます。

  6. 変更をリポジトリに commit します。

    git add .
    git commit -m 'Set up manifests.'
    git push
    

サンプル リポジトリには、このようなリポジトリのサンプルがあります。

レンダリングされた構成ファイルをプレビューして検証する

Config Sync が構成ファイルをレンダリングしてクラスタに同期する前に、構成ファイルが正確であることを確認します。それには、nomos hydrate を実行してレンダリングされた構成ファイルをプレビューし、nomos vet を実行して形式が正しいことを検証します。

  1. 次のフラグを使用して、次の nomos hydrate を実行します。

    nomos hydrate \
        --source-format=unstructured \
        --output=OUTPUT_DIRECTORY
    

    コマンドの内容:

    • --source-format=unstructured を使用すると、nomos hydrate は非構造化リポジトリで機能できます。Kustomize の構成と Helm チャートを使用しているため、非構造化リポジトリを使用してこのフラグを追加する必要があります。
    • --output=OUTPUT_DIRECTORY を使用すると、レンダリングされた構成ファイルのパスを定義できます。OUTPUT_DIRECTORY は、出力を保存する場所に置き換えます。
  2. 次のフラグを指定して nomos vet を実行し、構成ファイルの構文と有効性を確認します。

    nomos vet \
        --source-format=unstructured \
        --keep-output=true \
        --output=OUTPUT_DIRECTORY
    

    コマンドの内容:

    • --source-format=unstructured を使用すると、nomos vet は非構造化リポジトリで機能できます。
    • --keep-output=true ではレンダリングされた構成ファイルが保存されます。
    • --output=OUTPUT_DIRECTORY はレンダリングされた構成ファイルのパスです。

Git リポジトリからの同期を構成する

使用する構成ファイルでリポジトリが作成されたので、クラスタからリポジトリへの同期を構成できます。

  1. RootSync オブジェクトを構成するには、root-sync.yaml ファイルを作成します。

    # root-sync.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: root-sync
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      git:
        repo: YOUR_GIT_REPOSITORY
        branch: main
        auth: none
      override:
        enableShellInRendering: true
    

    YOUR_GIT_REPOSITORY は、Git リポジトリの URL に置き換えます。

  2. root-sync.yaml ファイルをクラスタに適用します。

    kubectl apply -f root-sync.yaml
    

インストールを確認する

Config Sync をインストールして構成したら、インストールが正常に完了したことを確認します。

  1. nomos status を使用して、他にエラーがないことを確認します。

    nomos status
    

    出力例:

    *CLUSTER_NAME
    --------------------
    <root>   https:/github.com/GoogleCloudPlatform/anthos-config-management-samples.git/helm-component/manifests@init
    SYNCED   fd17dd5a
    
  2. Helm コンポーネントが、正常にインストールされたかどうかを確認します。

    kubectl get all -n cert-manager
    

    出力例:

    NAME                                              READY   STATUS    RESTARTS   AGE
    pod/my-cert-manager-54f5ccf74-wfzs4               1/1     Running   0          10m
    pod/my-cert-manager-cainjector-574bc8678c-rh7mq   1/1     Running   0          10m
    pod/my-cert-manager-webhook-7454f4c77d-rkct8      1/1     Running   0          10m
    
    NAME                              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    service/my-cert-manager           ClusterIP   10.76.9.35     <none>        9402/TCP   10m
    service/my-cert-manager-webhook   ClusterIP   10.76.11.205   <none>        443/TCP    10m
    
    NAME                                         READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/my-cert-manager              1/1     1            1           10m
    deployment.apps/my-cert-manager-cainjector   1/1     1            1           10m
    deployment.apps/my-cert-manager-webhook      1/1     1            1           10m
    
    NAME                                                    DESIRED   CURRENT   READY   AGE
    replicaset.apps/my-cert-manager-54f5ccf74               1         1         1       10m
    replicaset.apps/my-cert-manager-cainjector-574bc8678c   1         1         1       10m
    replicaset.apps/my-cert-manager-webhook-7454f4c77d      1         1         1       10m