はじめに
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 を通じてカスタマイズされたアプリケーションを検証しました。


