はじめに
Kustomizeのbaseディレクトリにあるリソースを特定のoverlaysの環境からのみ削除する方法を紹介します。
背景
Kustomizeを使っていて、基本的にはどの環境にもデプロイするリソースはbase
配下にマニフェストを配置しますが、ある特定の環境のみbase
で用意したリソースをデプロイしたくない状況がありました。
例えば、下記のようなディレクトリ構成でbase
配下にDeploymentとHPAのマニフェストを配置していますが、overlays/dev
の環境にはHPAをデプロイしたくないような場合です。
.
├── base/
│ ├── deployment.yaml
│ ├── hpa.yaml
│ └── kustomization.yaml
└── overlays/
├── dev/ # dev環境はHPAをデプロイしたくない
├── stg/
└── prod/
こういった状況でどうやってbase
配下のリソースをデプロイしないようにするかの方法を紹介します。
特定のoverlayだけbaseのリソースを削除する
まず、削除したい環境のoverlays
配下に下記のような$patch: delete
を含めたパッチファイルを用意します。
$patch: delete
apiVersion: v1
kind: Pod
metadata:
name: pod-name
用意したパッチファイルを対象の環境のoverlays
配下のkustomization.yaml
で下記のようにpatchesStrategicMerge
で指定します。
...
patchesStrategicMerge:
- delete-pod-base.yaml
...
試してみる
実際に試してみます。
用意するファイルとディレクトリ構成は下記の通りです。
.
├── base
│ ├── deployment.yaml
│ ├── hpa.yaml
│ └── kustomization.yaml
└── overlays
├── prod
│ ├── deployment.yaml
│ ├── hpa.yaml
│ └── kustomization.yaml
└── stg
├── delete-hpa-base.yaml
├── deployment.yaml
└── kustomization.yaml
base
にあるHPAをstg環境にデプロイしないようにします。
base
base
配下のファイルはそれぞれ下記の通りです。
kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- hpa.yaml
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: nginx
hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 3
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
stg
overlays/stg
配下のファイルはそれぞれ下記の通りです。
overlays/stg/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: app-stg
resources:
- ./../../base
patchesStrategicMerge:
- deployment.yaml
- delete-hpa-base.yaml
overlays/stg/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
template:
spec:
containers:
- name: nginx
resources:
limits:
cpu: 200m
requests:
cpu: 200m
overlays/stg/delete-hpa-base.yaml
$patch: delete # 削除
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
prod
overlays/prod
配下のファイルはそれぞれ下記の通りです。
overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: app-prod
resources:
- ./../../base
patchesStrategicMerge:
- deployment.yaml
- hpa.yaml
overlays/prod/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
template:
spec:
containers:
- name: nginx
resources:
limits:
cpu: 500m
requests:
cpu: 500m
overlays/prod/hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
minReplicas: 1
maxReplicas: 10
ビルドしてみる
まずは特にbase
のリソースを削除していないoverlays/prod
からビルドしてみます。
kustomize build overlays/prod --output resource-prod.yaml
ビルドされたファイルを見ると、DeploymentとHPAのマニフェストが含まれていることが確認できます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: app-prod
spec:
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx
name: nginx
resources:
limits:
cpu: 500m
requests:
cpu: 500m
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
namespace: app-prod
spec:
maxReplicas: 10
metrics:
- resource:
name: cpu
target:
averageUtilization: 50
type: Utilization
type: Resource
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
次に、overlays/stg/delete-hpa-base.yaml
で$patch: delete
を追記したパッチファイルを含んだoverlays/stg
をビルドしてみます。
kustomize build overlays/stg --output resource-stg.yaml
$patch: delete
を含んでいたリソースはビルドされたファイルには含まれていないことが確認できます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: app-stg
spec:
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx
name: nginx
resources:
limits:
cpu: 200m
requests:
cpu: 200m