Kustomize によるスケーリング

1. 目標

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

このチュートリアルでは、Kustomize の基本コンセプトのいくつかを確認し、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 クライアントと組み合わせて、出力を直接適用できます。これにより、build コマンドの出力が kubectl apply コマンドに直接ストリーミングされます。

(実行しない - 参考情報として記載)

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

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

あるいは、kubectl 自体に統合されたツールを使用して kustomize を実行することもできます。以下の例のようになります。

(実行しない - 参考情報として記載)

kubectl apply -k chat-app/base

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

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

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

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

この例では、名前空間と名前の接頭辞を追加し、kustomization.yaml にいくつかのラベルを追加します。

  1. 共通のラベルと名前空間が含まれるように kustomization.yaml ファイルを更新します。

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

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

bases:

- deployment.yaml

namespace: my-namespace

nameprefix: my-

commonLabels:

app: my-app

EOF

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

この時点でビルドを実行すると、結果の YAML ファイルに、サービスと Deployment の定義の両方に名前空間、ラベル、接頭辞を付けた名前が含まれるようになります。

kustomize build chat-app/base

出力には、デプロイ YAML ファイルにないラベルと名前空間が含まれています。名前が 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 で指定されています。ただし、これらのパッチには、dev と prod の固有の環境変数が含まれています。

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

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

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

bases:

- deployment.yaml

commonLabels:

app: chat-app

EOF

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

ターミナルで次のコマンドを実行して、dev と prod のバリエーションを実装します。

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

出力には、ベース構成と dev 構成のラベル、ベース構成のコンテナ イメージ名、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 フォルダをすべてのアプリケーションのベースにするため、chat-app/base/kustomization.yaml を更新して shared-kustomize をベースとして使用する必要があります。その上で独自の deployment.yaml にパッチを適用します。その後、環境フォルダに再びパッチが適用されます。

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

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

bases:

- ../../shared-kustomize

commonLabels:

app: chat-app

patches:

- deployment.yaml

EOF

  1. kustomize を実行して、マージされた結果を開発環境に表示する

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>