はじめに
kustomizeでHPA(Horizontal Pod Autoscaler)とDeploymentのマニフェストをビルドしてみます。
kustomizeとHPAに関しては下記を参照ください。


ディレクトリ構造
作成するファイルとディレクトリ構造は下記の通りとなります。
.
├── 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
という機能で、紐づけらられたリソースの名前がnamePrefix
やnameSuffix
で変更されても、関連する箇所を自動的に変更してくれるようになっています。
ビルドされたマニフェストを確認すると、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
は、リソースの名前を紐付ける機能になっています。namePrefix
やnameSuffix
で変更されても、関連する箇所を自動的に変更してくれるようになっています。
自分で設定することもできますが、よく使われるものはビルトインで設定されています。
ビルトインの設定は下記から確認できます。