Kustomize によるスケーリング

1. 目標

Kustomize は、テンプレートを使用せずにアプリケーション構成をカスタマイズする方法を導入し、既製のアプリケーションの使用を簡素化するツールです。スタンドアロン ユーティリティとして使用でき、kubectl に kubectl apply -k を介して組み込まれています。また、スタンドアロン CLI としても使用できます。詳細については、kustomize.io をご覧ください。

このチュートリアルでは、Kustomize の基本的なコンセプトをいくつか学習し、それを使用してアプリケーションと環境のバリエーションを管理します。

次のことを行います。

  • kustomize コマンドライン クライアントを利用する
  • 共通要素をオーバーライドする
  • 大きな YAML 構造をパッチ適用
  • 複数のオーバーレイ レイヤを活用する

2. ワークスペースの準備

  1. 次の URL にアクセスして Cloud Shell エディタを開きます。

https://ide.cloud.google.com

  1. ターミナル ウィンドウで、このチュートリアルの作業ディレクトリを作成します。

mkdir kustomize-lab

  1. ディレクトリに移動して IDE ワークスペースを設定する

cd kustomize-lab && cloudshell workspace .

3. kustomize コマンドライン クライアントの使用

kustomize の強みは、カスタム値を使用してベースの Kubernetes YAML をオーバーレイして変更できることです。これを行うには、kustomize に、ファイルの場所とオーバーライドする内容に関する指示を含むベースファイルが必要です。Kustomize は Kubernetes エコシステムに含まれており、さまざまな方法で実行できます。

このセクションでは、ベースの kustomize 構成を作成し、スタンドアロンの kustomize コマンドライン クライアントでファイルを処理します。

  1. まず、基本構成ファイルを保持するフォルダを作成します。

mkdir -p chat-app/base

  1. ベースフォルダにシンプルな Kubernetes deployment.yaml を作成する

cat <<EOF > chat-app/base/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`metadata:`

  `name: chat-app`

`spec:`

  `containers:`

  `- name: chat-app`

    `image: chat-app-image`

EOF

  1. ベース kustomization.yaml を作成する

Kustomize は、エントリ ポイントとして kustomization.yaml という名前のファイルを探します。このファイルには、さまざまなベースファイルとオーバーライド ファイルへの参照と、特定のオーバーライド値が含まれています。

deployment.yaml をベース リソースとして参照する kustomization.yaml ファイルを作成します。

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. ベースフォルダで kustomize コマンドを実行します。この操作を行うと、デプロイ YAML ファイルが変更なしで出力されます。これは、まだバリエーションを含めていないため、想定される動作です。

kustomize build chat-app/base

このスタンドアロン クライアントは、kubectl クライアントと組み合わせて、次の例のように出力を直接適用できます。これにより、ビルドコマンドの出力が kubectl apply コマンドに直接ストリーミングされます。

(実行しない - 参照用にのみ含まれています)

kustomize build chat-app/base | kubectl apply -f -

この手法は、特定のバージョンの kustomize クライアントが必要な場合に便利です。

また、kubectl 自体に統合されたツールを使用して kustomize を実行することもできます。次の例をご覧ください。

(実行しない - 参照用にのみ含まれています)

kubectl apply -k chat-app/base

4. 共通要素のオーバーライド

ワークスペースが構成され、kustomize が機能していることを確認したので、次は基本値の一部をオーバーライドします。

イメージ、名前空間、ラベルは、アプリケーションと環境ごとにカスタマイズされることがよくあります。これらは一般的に変更されるため、Kustomize では kustomize.yaml で直接宣言できます。これにより、これらの一般的なシナリオに対して多くのパッチを作成する必要がなくなります。

この手法は、テンプレートの特定のインスタンスを作成するためによく使用されます。名前とその Namespace を変更するだけで、1 つの基本リソースセットを複数の実装で使用できるようになりました。

この例では、Namespace と名前の接頭辞を追加し、kustomization.yaml にラベルを追加します。

  1. kustomization.yaml ファイルを更新して、共通のラベルと Namespace を含めます。

ターミナルで次のコマンドをコピーして実行します。

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

namespace: my-namespace

nameprefix: my-

commonLabels:

app: my-app

EOF

  1. ビルド コマンドを実行する

この時点でビルドを実行すると、生成された YAML ファイルのサービス定義とデプロイ定義の両方に、名前空間、ラベル、接頭辞付きの名前が含まれていることがわかります。

kustomize build chat-app/base

出力には、デプロイ YAML ファイルにないラベルと Namespace が含まれています。名前が chat-app から my-chat-app に変更されたことも確認してください

(出力 - コピーしないでください)

kind: Deployment

metadata:

labels:

`app: my-app`

name: my-chat-app

namespace: my-namespace

5. 大きな YAML 構造のパッチ適用

Kustomize には、ベースリソースをオーバーレイするパッチを適用する機能もあります。この手法は、アプリケーションと環境間の変動性を提供するためによく使用されます。

このステップでは、同じベースリソースを使用する単一のアプリケーションの環境バリエーションを作成します。

  1. まず、さまざまな環境用のフォルダを作成します。

mkdir -p chat-app/dev

mkdir -p chat-app/prod

  1. 次のコマンドでステージ パッチを作成します。

cat <<EOF > chat-app/dev/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: chat-app`

    `env:`

    `- name: ENVIRONMENT`

      `value: dev`

EOF

  1. 次のコマンドを使用して、本番環境のパッチを作成します。

cat <<EOF > chat-app/prod/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: chat-app`

    `env:`

    `- name: ENVIRONMENT`

      `value: prod`

EOF

上記のパッチにはコンテナ イメージ名が含まれていません。この値は、前の手順で作成した base/deployment.yaml で指定されています。ただし、これらのパッチには、開発環境と本番環境の一意の環境変数が含まれています。

  1. ベース ディレクトリの kustomize YAML ファイルを実装する

ベースの kustomization.yaml を書き換え、名前空間と名前の接頭辞を削除します。これはバリエーションのないベース構成にすぎないためです。これらのフィールドは、すぐに環境ファイルに移動されます。

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

commonLabels:

app: chat-app

EOF

  1. dev ディレクトリの kustomize YAML ファイルを実装する

ターミナルで次のコマンドを実行して、開発環境と本番環境のバリエーションを実装します。

cat <<EOF > chat-app/dev/kustomization.yaml

bases:

- ../base

namespace: dev

nameprefix: dev-

commonLabels:

env: dev

patches:

- deployment.yaml

EOF

ファイルの patches: セクションが追加されていることに注意してください。これは、kustomize がこれらのファイルをベースリソースの上にオーバーレイする必要があることを示します。

  1. prod ディレクトリの kustomize YAML ファイルを実装する

cat <<EOF > chat-app/prod/kustomization.yaml

bases:

- ../base

namespace: prod

nameprefix: prod-

commonLabels:

env: prod

patches:

- deployment.yaml

EOF

  1. kustomize を実行してファイルを統合する

ベースファイルと環境ファイルを作成したら、kustomize プロセスを実行してベースファイルにパッチを適用できます。

次のコマンドを dev に対して実行して、統合された結果を確認します。

kustomize build chat-app/dev

出力には、ベース構成と開発構成のラベル、ベースのコンテナ イメージ名、開発フォルダの環境変数など、マージされた結果が含まれています。

6. 複数のオーバーレイ レイヤを活用する

多くの組織には、アプリチームのサポートとプラットフォームの管理を支援するチームがあります。多くの場合、これらのチームは、すべての環境のすべてのアプリに含める必要がある特定の詳細(ロギング エージェントなど)を含めることを望んでいます。

この例では、すべてのアプリケーションに含まれ、どの環境にデプロイされるかに関係なく、shared-kustomize フォルダとリソースを作成します。

  1. shared-kustomize フォルダを作成する

mkdir shared-kustomize

  1. 共有フォルダにシンプルな deployment.yaml を作成する

cat <<EOF > shared-kustomize/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: logging-agent`

    `image: logging-agent-image`

EOF

  1. 共有フォルダに kustomization.yaml を作成する

cat <<EOF > shared-kustomize/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. アプリケーションから shared-kustomize フォルダを参照する

shared-kustomize フォルダをすべてのアプリケーションのベースにするため、shared-kustomize をベースとして使用するように chat-app/base/kustomization.yaml を更新する必要があります。次に、独自の deployment.yaml を上にパッチ適用します。環境フォルダは、その上に再度パッチを適用します。

ターミナルで次のコマンドをコピーして実行します。

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- ../../shared-kustomize

commonLabels:

app: chat-app

patches:

- deployment.yaml

EOF

  1. kustomize を実行して、dev の統合結果を表示する

kustomize build chat-app/dev

出力には、アプリベース、アプリ環境、shared-kustomize フォルダからマージされた結果が含まれています。具体的には、コンテナ セクションに 3 つの場所すべての値が表示されます。

(出力 - コピーしないでください)

<pre>

`containers:`

      `- env:`

        `- name: ENVIRONMENT`

          `value: dev`

        `name: chat-app`

      `- image: image`

        `name: app`

      `- image: logging-agent-image`

        `name: logging-agent`

</pre>