Kustomize を使用したアプリケーションのカスタマイズ

KubernetesBeginner
オンラインで実践に進む

はじめに

Helm は Kubernetes テンプレートをリリースとしてパッケージ化しますが、Kustomize は異なるアプローチをとります。Kustomize は通常の Kubernetes YAML から開始し、テンプレート式を使用せずに変更を重ねていきます。これは、共有のベースを維持しつつ、名前、ネームスペース、レプリカ数、パッチなどの環境固有の小さな差異を適用したい場合に非常に便利です。

この実験では、ベースとなる Deployment と Service を作成し、Kustomize でそのベースをレンダリングします。次に、名前、ネームスペース、レプリカ数、アプリケーションメッセージを変更する本番環境用(production)のオーバーレイを作成します。最後に、kubectl apply -k を使用してオーバーレイをデプロイし、作成された Service をテストします。

Kustomize ワークスペースの準備

このステップでは、ネームスペースを準備し、kubectl を通じて Kustomize が利用可能であることを確認します。

まずは /home/labex/project から始めます。この実験では、ベースマニフェストとオーバーレイファイルをこのワークスペース内に保持します。

mkdir -p /home/labex/project
cd /home/labex/project

Kubernetes API サーバーに到達可能であることを確認します。VM が起動した直後でノードの準備ができていない場合は、数秒待ってから再度コマンドを実行してください。

kubectl get nodes --request-timeout=5s

期待される出力例:

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

クラスターネットワークの Pod が Ready になるまで待ちます。実験の最後に Service をテストするため、クラスターネットワークが正常である必要があります。

kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s

期待される出力:

pod/calico-node-... condition met

ckad-prep-kustomize という名前のネームスペースを作成し、現在のネームスペースとして設定します。

kubectl create namespace ckad-prep-kustomize
kubectl config set-context --current --namespace=ckad-prep-kustomize

ネームスペースを確認し、kubectl kustomize が利用可能であることを確認します。kubectl kustomize は、リソースを適用せずに Kustomize ディレクトリをレンダリングします。

kubectl config view --minify --output 'jsonpath={..namespace}'; echo
kubectl kustomize --help | sed -n '1,3p'

期待される出力例:

ckad-prep-kustomize
Build a set of KRM resources...

再利用可能なベースの作成

このステップでは、通常の Kubernetes YAML から Kustomize のベースを作成します。

ベースは共有の出発点です。環境固有のカスタマイズが追加される前の、完全で有効な Kubernetes オブジェクトを含んでいる必要があります。ここでは、ベースに 1 つの Deployment と 1 つの Service を含めます。このアプリケーションは、MESSAGE 環境変数の値を小さな Web ページに書き込みます。

ベースディレクトリを作成します。

mkdir -p kustomize-demo/base

ベースとなる Deployment を作成します。

cat > kustomize-demo/base/deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kustomize-web
  labels:
    app: kustomize-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kustomize-web
  template:
    metadata:
      labels:
        app: kustomize-web
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: web
        image: busybox:1.36
        env:
        - name: MESSAGE
          value: base-v1
        command:
        - /bin/sh
        - -c
        - |
          mkdir -p /www
          echo "$MESSAGE" > /www/index.html
          httpd -f -p 8080 -h /www
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 1
          periodSeconds: 2
EOF

ベースとなる Service を作成します。そのセレクターは Deployment の Pod ラベルと一致します。

cat > kustomize-demo/base/service.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  name: kustomize-web
spec:
  selector:
    app: kustomize-web
  ports:
  - port: 80
    targetPort: 8080
EOF

ベースの kustomization.yaml を作成します。このファイルは、どのリソースがベースに属しているかを Kustomize に伝えます。

cat > kustomize-demo/base/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
EOF

適用せずにベースをレンダリングします。

kubectl kustomize kustomize-demo/base | sed -n '1,120p'

期待される出力には、kustomize-web という名前の Service、kustomize-web という名前の Deployment、replicas: 1、および value: base-v1 が含まれます。

本番環境用オーバーレイの追加

このステップでは、本番環境向けのデプロイメント用にベースをカスタマイズするオーバーレイを作成します。

オーバーレイはベースを参照し、変更を加えます。このオーバーレイは、オブジェクトを ckad-prep-kustomize ネームスペースに配置し、prod- という名前のプレフィックスを追加し、Deployment のレプリカ数を 3 にスケールし、MESSAGE の値を prod-v2 にパッチします。

オーバーレイディレクトリを作成します。

mkdir -p kustomize-demo/overlays/prod

Deployment のパッチを作成します。パッチは元のベースオブジェクトである kustomize-web を指定します。Kustomize は prod- プレフィックスを追加する前にパッチを照合します。

cat > kustomize-demo/overlays/prod/deployment-patch.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kustomize-web
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: web
        env:
        - name: MESSAGE
          value: prod-v2
EOF

オーバーレイの kustomization.yaml を作成します。resources エントリはベースを指し、namespace、namePrefix、patches がカスタマイズの内容を記述します。

cat > kustomize-demo/overlays/prod/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ckad-prep-kustomize
namePrefix: prod-
resources:
- ../../base
patches:
- path: deployment-patch.yaml
EOF

本番環境用オーバーレイをレンダリングします。

kubectl kustomize kustomize-demo/overlays/prod | sed -n '1,160p'

期待される出力例:

name: prod-kustomize-web
namespace: ckad-prep-kustomize
replicas: 3
value: prod-v2

カスタマイズされたアプリケーションのデプロイとテスト

このステップでは、本番環境用オーバーレイを適用し、作成された Service をテストします。

kubectl apply -k コマンドは、Kustomize ディレクトリをレンダリングし、その結果を Kubernetes API サーバーに送信します。一時的な YAML ファイルを作成する必要はありません。

本番環境用オーバーレイを適用します。

kubectl apply -k kustomize-demo/overlays/prod

期待される出力例:

service/prod-kustomize-web created
deployment.apps/prod-kustomize-web created

カスタマイズされた Deployment を待ちます。

kubectl rollout status deployment/prod-kustomize-web --timeout=120s

期待される出力:

deployment "prod-kustomize-web" successfully rolled out

オーバーレイから作成されたオブジェクトを確認します。

kubectl get deployment,service prod-kustomize-web

期待される出力例:

deployment.apps/prod-kustomize-web   3/3
service/prod-kustomize-web

クライアント Pod を作成し、Service をテストします。レスポンスが prod-v2 であれば、オーバーレイのパッチによって実行中のアプリケーション設定が変更されたことが証明されます。

kubectl run kustomize-client --image=busybox:1.36 --restart=Never --command -- sleep 3600
kubectl wait --for=condition=Ready pod/kustomize-client --timeout=120s
kubectl exec kustomize-client -- wget -qO- http://prod-kustomize-web

期待される出力:

prod-v2

まとめ

通常の Deployment と Service の YAML から Kustomize のベースを作成し、ネームスペース、オブジェクト名、レプリカ数、アプリケーションメッセージを変更する本番環境用オーバーレイを作成しました。ベースとオーバーレイの両方をレンダリングした後、kubectl apply -k を使用してオーバーレイを適用し、Service を通じてカスタマイズされたアプリケーションを検証しました。