kustomizeでkubernetesのmanifestを環境ごとに生成する

kubernetes

Kustomizeは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できる。 出力を見ると commonLabelsfoo: 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