このドキュメントは The Kubectl Book の翻訳です。翻訳の GitHub リポジトリはこちら。
- ベースの任意のリソースから任意のフィールドをカスタマイズする
リソースのフィールドをカスタマイズする
動機
ベースから任意のフィールドを修正したくなることがよくあります。たとえば Pod のリソース割り当て予約や Deployment のレプリカ数といったフィールドです。Overlay や patch を使うと、ベースのフィールドをバリエーションで上書きするようフィールドの値を設定できます。
Overlay によって任意のフィールドをカスタマイズする
ベースが提供するリソースに対して Overlay を与えると任意のフィールドを追加、変更、削除できます。 Overlay は疎なリソース定義であり、これを使うと、ベースがカスタマイズをテンプレートとして公開することなく、任意のカスタマイズを実行できます。
Overlay にはリソースを指定するためにグループ、バージョン、種類、名前を書く必要があります。 そこに、ベースリソースに設定する任意のフィールドを記述します。Overlay は StrategicMergePatch を使って適用されます。
ユースケース: 複数の環境 (test、dev、staging、canary、prod) で、replicas や resources といったフィールドを上書きします。
入力: kustomization.yaml ファイルと overlay
# kustomization.yaml
bases:
- ../base
patchesStrategicMerge:
- overlay.yaml
# overlay.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
# override replicas
replicas: 3
template:
spec:
containers:
- name: nginx
# override resources
resources:
limits:
cpu: "1"
requests:
cpu: "0.5"
ベース:
# ../base/kustomization.yaml
resources:
- deployment.yaml
# ../base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
resources:
limits:
cpu: "0.2"
requests:
cpu: "0.1"
適用: クラスタに適用されるリソース
# Overlayed Base Resource
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
spec:
# replicas field has been added
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
# resources have been overridden
resources:
limits:
cpu: "1"
requests:
cpu: "0.5"
Overlay はクラスタにリソース構成を Apply するのと同じマージの意味論を持ちます。一点違うのは、Overlay をマージする際には前回適用されたリソース構成はありません。そのため、そのため、フィールドが明示的に nil に設定されると、フィールドがただ削除されるという結果になります。
JsonPath による任意のフィールドのカスタマイズ
ベースが提供するリソースに対して、JSON Patch を与えることで任意のフィールドを追加、変更、削除できます。
ユースケース: 複数の環境 (test、dev、staging、canary、prod) で、replicas や resources といったフィールドを上書きします。
JSON Patch は RFC 6902 で定められ、リソースに適用されるパッチとなります。Patch はリソースを指定するために、Patch 本体に加えてグループ、バージョン、種類、名前が必要です。Patch はベースのリソースを修正するために多くのパワフルな命令的操作を提供します。
入力: kustomization.yaml ファイル
# kustomization.yaml
bases:
- ../base
patchesJson6902:
- target:
group: apps
version: v1
kind: Deployment
name: nginx-deployment
path: patch.yaml
# patch.yaml
- op: add
path: /spec/replicas
value: 3
# ../base/kustomization.yaml
resources:
- deployment.yaml
# ../base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
適用: クラスタに適用されるリソース
# Patched Base Resource
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
spec:
# replicas field has been added
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx