メインコンテンツまでスキップ

Kustomize

始める前に

このセクションのために環境を準備してください:

~$prepare-environment

Kustomizeは、宣言的な「kustomization」ファイルを使用してKubernetesマニフェストファイルを管理することができます。これにより、Kubernetesリソースの「ベース」マニフェストを表現し、構成、カスタマイズ、そして多くのリソースにわたる横断的な変更を簡単に適用することが可能になります。

例えば、以下のcheckoutデプロイメントのマニフェストファイルを見てみましょう:

~/environment/eks-workshop/base-application/checkout/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: checkout
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/type: app
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: checkout
app.kubernetes.io/instance: checkout
app.kubernetes.io/component: service
template:
metadata:
annotations:
prometheus.io/path: /metrics
prometheus.io/port: "8080"
prometheus.io/scrape: "true"
labels:
app.kubernetes.io/name: checkout
app.kubernetes.io/instance: checkout
app.kubernetes.io/component: service
app.kubernetes.io/created-by: eks-workshop
spec:
serviceAccountName: checkout
securityContext:
fsGroup: 1000
containers:
- name: checkout
envFrom:
- configMapRef:
name: checkout
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
image: "public.ecr.aws/aws-containers/retail-store-sample-checkout:1.2.1"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 3
resources:
limits:
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
volumeMounts:
- mountPath: /tmp
name: tmp-volume
volumes:
- name: tmp-volume
emptyDir:
medium: Memory

このファイルは前のGetting Startedラボですでに適用されていますが、Kustomizeを使用してreplicasフィールドを更新することで、このコンポーネントを水平にスケールしたいとします。このYAMLファイルを手動で更新する代わりに、Kustomizeを使用してspec/replicasフィールドを1から3に更新します。

そのためには、以下のkustomizationを適用します。

  • 最初のタブでは、適用するkustomizationを表示しています
  • 2番目のタブでは、kustomizationが適用された後の更新されたDeployment/checkoutファイルのプレビューを表示しています
  • 最後に、3番目のタブでは変更点のdiffだけを表示しています
~/environment/eks-workshop/modules/introduction/kustomize/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: checkout
spec:
replicas: 3

このkustomizationを適用する最終的なKubernetes YAMLを生成するには、kubectlCLIにバンドルされているkustomizeを呼び出すkubectl kustomizeコマンドを使用します:

~$kubectl kustomize ~/environment/eks-workshop/modules/introduction/kustomize

これにより多くのYAMLファイルが生成され、Kubernetesに直接適用できる最終的なマニフェストが表示されます。kustomizeの出力をkubectl applyに直接パイプしてこれを実証してみましょう:

~$kubectl kustomize ~/environment/eks-workshop/modules/introduction/kustomize | kubectl apply -f -
namespace/checkout unchanged
serviceaccount/checkout unchanged
configmap/checkout unchanged
service/checkout unchanged
service/checkout-redis unchanged
deployment.apps/checkout configured
deployment.apps/checkout-redis unchanged

「checkout」関連のさまざまなリソースが「unchanged」であり、deployment.apps/checkoutが「configured」になっていることに気付くでしょう。これは意図的なものです — checkoutデプロイメントにのみ変更を適用したいからです。これは、前のコマンドを実行すると実際に2つのファイルが適用されたためです:上で見たKustomizeのdeployment.yamlと、~/environment/eks-workshop/base-application/checkoutフォルダ内のすべてのファイルにマッチする以下のkustomization.yamlファイルです。patchesフィールドは、パッチを適用する特定のファイルを指定します:

~/environment/eks-workshop/modules/introduction/kustomize/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../../base-application/checkout
patches:
- path: deployment.yaml

レプリカ数が更新されたことを確認するには、次のコマンドを実行します:

~$kubectl get pod -n checkout -l app.kubernetes.io/component=service
NAME                        READY   STATUS    RESTARTS   AGE
checkout-585c9b45c7-c456l   1/1     Running   0          2m12s
checkout-585c9b45c7-b2rrz   1/1     Running   0          2m12s
checkout-585c9b45c7-xmx2t   1/1     Running   0          40m

kubectl kustomizekubectl applyの組み合わせを使用する代わりに、kubectl apply -k <kustomization_directory>-fフラグの代わりに-kフラグを使用)で同じことを実現できます。このアプローチはこのワークショップを通じて使用され、マニフェストファイルの変更を適用しやすくしながら、適用される変更を明確に表示します。

試してみましょう:

~$kubectl apply -k ~/environment/eks-workshop/modules/introduction/kustomize

アプリケーションのマニフェストを初期状態に戻すには、単に元のマニフェストセットを適用するだけです:

~$kubectl apply -k ~/environment/eks-workshop/base-application

いくつかのラボ演習で見られる別のパターンは次のようなものです:

~$kubectl kustomize ~/environment/eks-workshop/base-application \
| envsubst | kubectl apply -f-

これはenvsubstを使用して、Kubernetesマニフェストファイル内の環境変数プレースホルダーを、あなたの特定の環境に基づく実際の値に置き換えます。例えば、いくつかのマニフェストでは、EKSクラスター名を$EKS_CLUSTER_NAMEで、またはAWSリージョンを$AWS_REGIONで参照する必要があります。

Kustomizeの仕組みを理解したので、Helmモジュールに進むか、直接基礎モジュールに進むことができます。

Kustomizeについて詳しく知るには、公式Kubernetesのドキュメントを参照してください。