【kustomize】特定の環境だけbaseのリソースを削除する

スポンサーリンク

はじめに

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

参考

タイトルとURLをコピーしました