【Kubernetes】kustomizeでHPAのマニフェストをビルドしてみる

スポンサーリンク

はじめに

kustomizeでHPA(Horizontal Pod Autoscaler)とDeploymentのマニフェストをビルドしてみます。

kustomizeとHPAに関しては下記を参照ください。

【Kubernetes】これから始めるkustomize
はじめにこれからkustomizeを使う人向けに、kustomizeとは何か、実際にどう使うのかを解説していきたいと思います。kustomizeとはkustomizeとは、Kubernetesのマニフェスト管理ツールです。開発環境、ステージ...
【Kubernetes】Horizontal Pod Autoscalerやってみる
はじめにKubernetesのHPA(HorizontalPodAutoscaler)について、ざっくりまとめて実際に試してみたいと思います。APIバージョンはautoscaling/v2を想定しています。HorizontalPodAuto...

ディレクトリ構造

作成するファイルとディレクトリ構造は下記の通りとなります。

.
├── base
│   ├── deployment.yaml
│   ├── hpa.yaml
│   └── kustomization.yaml
└── overlays
    ├── dev
    │   ├── deployment.yaml
    │   ├── hpa.yaml
    │   └── kustomization.yaml
    ├── prod
    │   ├── deployment.yaml
    │   ├── hpa.yaml
    │   └── kustomization.yaml
    └── stg
        ├── deployment.yaml
        ├── hpa.yaml
        └── kustomization.yaml

DeploymentとHPAのマニフェストが各環境(dev、stg、prod)ごとに用意されています。

base

まずはベースとなるファイルを用意します。

DeploymentとHPAのマニフェストは下記の通りです。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: k8s.gcr.io/hpa-example
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 100m
          requests:
            cpu: 100m
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache # Deploymentの名前を指定
  minReplicas: 1
  maxReplicas: 1
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

kustomize用のkustomization.yamlは下記の通りです。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- deployment.yaml
- hpa.yaml

overlays/dev

次にdev環境用のファイルを用意します。

Deploymentはresource、HPAはレプリカ数のみを設定しています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  template:
    spec:
      containers:
      - name: php-apache
        resources:
          limits:
            cpu: 100m
          requests:
            cpu: 100m
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache-hpa
spec:
  minReplicas: 1
  maxReplicas: 1

kustomization.yamlでは、名前のプレフィックスとラベルが付くようにしています。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: hpa-dev

namePrefix: dev-
commonLabels:
  env: dev

resources:
- ./../../base

patchesStrategicMerge:
- deployment.yaml
- hpa.yaml

overlays/stg

stg環境のファイルを用意します。

stg環境もDeploymentはresource、HPAはレプリカ数のみを設定しています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  template:
    spec:
      containers:
      - name: php-apache
        resources:
          limits:
            cpu: 200m
          requests:
            cpu: 200m
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache-hpa
spec:
  minReplicas: 1
  maxReplicas: 5

kustomization.yamlでは、stg環境用の名前のプレフィックスとラベルが付くようにしています。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: hpa-stg

namePrefix: stg-
commonLabels:
  env: stg

resources:
- ./../../base

patchesStrategicMerge:
- deployment.yaml
- hpa.yaml

overlays/prod

prod環境のファイルを用意します。

prod環境も同様にDeploymentはresource、HPAはレプリカ数のみを設定しています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  template:
    spec:
      containers:
      - name: php-apache
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 500m
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache-hpa
spec:
  minReplicas: 1
  maxReplicas: 10

kustomization.yamlでは、prod環境用の名前のプレフィックスとラベルが付くようにしています。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: hpa-prod

namePrefix: prod-
commonLabels:
  env: prod

resources:
- ./../../base

patchesStrategicMerge:
- deployment.yaml
- hpa.yaml

ビルドしてみる

試しにprod環境用のマニフェストをビルドしてみます。

kustomize build overlays/prod --output resource.yaml

ビルドされたマニフェストを確認してみます。

特に気になるのが、HPAのターゲットとなるDeploymentの名前がkustomizeによってプレフィックがついた名前に変わった点です。

kustomizeではnameReferenceという機能で、紐づけらられたリソースの名前がnamePrefixnameSuffixで変更されても、関連する箇所を自動的に変更してくれるようになっています。

ビルドされたマニフェストを確認すると、HPAのscaleTargetRef.nameがプレフィックスがついたDeploymentの名前に変更されているのがわかります。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    env: prod
  name: prod-php-apache # プレフィックスがついている
  namespace: hpa-prod
spec:
  selector:
    matchLabels:
      env: prod
      run: php-apache
  template:
    metadata:
      labels:
        env: prod
        run: php-apache
    spec:
      containers:
      - image: k8s.gcr.io/hpa-example
        name: php-apache
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 500m
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  labels:
    env: prod
  name: prod-php-apache-hpa
  namespace: hpa-prod
spec:
  maxReplicas: 10
  metrics:
  - resource:
      name: cpu
      target:
        averageUtilization: 50
        type: Utilization
    type: Resource
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: prod-php-apache # プレフィックスがついた名前に書き換えられている

nameReferenceについて

nameReferenceは、リソースの名前を紐付ける機能になっています。namePrefixnameSuffixで変更されても、関連する箇所を自動的に変更してくれるようになっています。

自分で設定することもできますが、よく使われるものはビルトインで設定されています。

ビルトインの設定は下記から確認できます。

kustomize/examples/transformerconfigs at master · kubernetes-sigs/kustomize
CustomizationofkubernetesYAMLconfigurations.Contributetokubernetes-sigs/kustomizedevelopmentbycreatinganaccountonGitHub.

参考

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