kustomizeでkubernetesのmanifestを環境ごとに生成する
kubernetesKustomizeはk8sのmanifestを生成するツールでkubectlに統合されている。Helmやksonnetのようにテンプレートからではなく、kusomization.yaml以外は素のmanifestをソースとするのでツール独自の記法を覚えたり変換したりする必要がない。
KubernetesのパッケージマネージャーHelmを使う - sambaiz-net
ksonnetでkubernetesのmanifestを環境ごとに生成/applyする - sambaiz-net
kustomization.yaml
には対象とするresources、共通のnamespace, label, prefixやパッチなどを記述する。
$ tree
.
|-- deployment.yaml
`-- kustomization.yaml
$ cat kustomization.yaml
resources:
- deployment.yaml
commonLabels:
foo: bar
$ cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.14.2
name: nginx
ports:
- containerPort: 80
kubectl kustomize
でkustomize適用後のyamlをstdoutに出力し、kubectl apply -k
で直接applyできる。
出力を見ると commonLabels
の foo: bar
labelが追加されている。
$ kubectl kustomize .
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
foo: bar
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
foo: bar
template:
metadata:
labels:
app: nginx
foo: bar
spec:
containers:
- image: nginx:1.14.2
name: nginx
ports:
- containerPort: 80
次に環境ごとの設定を与えてみる。各ディレクトリに kustomization.yaml
を置いて、basesで元となるディレクトリを参照する。
$ tree
.
|-- base
| |-- deployment.yaml
| `-- kustomization.yaml
|-- dev
| `-- kustomization.yaml
`-- prd
|-- increase_replicas.yaml
`-- kustomization.yaml
$ cat prd/increase_replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 10
$ cat prd/kustomization.yaml
bases:
- ../base
namePrefix: prd-
patchesStrategicMerge:
- increase_replicas.yaml
namePrefixだけではなく、baseの方の foo: bar
labelも追加されていて、パッチによってreplicasが10に書き換わっている。
$ kubectl kustomize prd
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
foo: bar
name: prd-nginx-deployment
spec:
replicas: 10
selector:
matchLabels:
app: nginx
foo: bar
template:
metadata:
labels:
app: nginx
foo: bar
spec:
containers:
- image: nginx:1.14.2
name: nginx
ports:
- containerPort: 80