🕌

kustomizeを使ってみた

に公開

今回はkubernetesの宣言的なマネジメントをできるkustomizeを使ってみました。kubernetesを最近よく使うなかでとても目にするので、今回チュートリアルをやってみました。

kustomizeとは?

公式ページによると

Kustomize is a standalone tool to customize Kubernetes objects through a kustomization file.

ということで、kustomizationファイルを通じてkubernetesオブジェクトをカスタマイズするスタンドアロンツールということです。kubectlの1.14から、kustomizeをサポートしたということで、今回もkubectl経由で利用してみます。

主な機能としては以下があるようです。

  • 他のソースからリソースを生成する
  • リソースの横断的なフィールドの設定
  • リソースコレクションの作成とカスタマイズ

https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization/

使ってみる

インストール

まずはkubectlのインストールが必要になります。macbookを使っている方は以下のようにしてkubectlをまずはインストールします。

brew install kubectl

そのほかのインストール方法は以下を参照ください。

https://kubernetes.io/ja/docs/tasks/tools/

ConfigMap生成

それではまずはConfigMap生成のチュートリアルをしてみます。ConfigMapとは設定情報をキーバリューストアの形式で保存しておくリソースになります。

まずはキーバリューデータをファイルに設定します。application.propertiesというファイル名で以下のようにファイルを作成します。

application.properties
FOO=Bar

次に、kustomizeの設定ファイルであるkustomization.yamlに以下のような設定を書きます。

kustomization.yaml
configMapGenerator:
- name: example-configmap
  files:
    - application.properties

configMapGeneratorキーを利用することで、この設定ではConfigMapを作成しようとしていることを指定し、configMapGenerator.filesにてどのファイルから情報を受け取るか指定します。

ファイルを作成した後に、以下のコマンドを実行すると、ConfigMapを生成するための設定ファイルが標準出力されます。

kubectl kustomize ./

# 結果
apiVersion: v1
data:
  application.properties: |
    FOO=Bar
kind: ConfigMap
metadata:
  name: example-configmap-1-g4hk9g2ff8

結果をファイルに保存するには以下のようにすると保存できます。

kubectl kustomize ./ > configmap.yaml

先ほどはapplication.propertiesというファイルをデータ保存場所としていましたが、例えば.envに設定したデータを参照する場合、kustomization.yamlを以下のように変更すると以下のように結果を得ることができます。

HOGE=fuga
kustomization.yaml
configMapGenerator:
- name: example-configmap
  ens:
    - .env
kubectl kustomize ./

# 結果
apiVersion: v1
data:
  HOGE: fuga
kind: ConfigMap
metadata:
  name: example-configmap-1-ttcc2hh6f8

先ほどの例ではdata.application.propertiesに値が格納されていましたが、.envを参照した場合はdata直下に値が保存されます。

また、複数のファイルを指定することもできます。

kustomization.yaml
configMapGenerator:
- name: example-configmap
  files:
    - application.properties
  ens:
    - .env
kustomization.yaml
configMapGenerator:
- name: example-configmap
  ens:
    - .env

Secret生成

次にSecretを生成してみます。Secretとは、kuberntes上でアプリケーションを実行する際に必要な機密情報を扱うための仕組みです。

例として、password.txtにユーザ名やパスワードが保存されている場合、以下のようにするとSecretを扱うためのYAMLファイルを生成できます。

password.txt
username=admin
password=password
kustomization.yaml
secretGenerator:
- name: example-secret
  files:
    password.txt

これらのファイルを用意して実行すると以下のような結果になります。

kubectl kustomize ./

# 結果
apiVersion: v1
data:
  password.txt: dXNlcm5hbWU9YWRtaW4KcGFzc3dvcmQ9cGFzc3dvcmQK
kind: Secret
metadata:
  name: example-secret-dg744tcmkk
type: Opaque

複数リソースの合成

kustomizeでは複数リソースを一つのファイルにまとめることができます。例えば、以下のようにdeployment.yamlservice.yamlで分けられたリソースファイルを利用すると、結合できます。

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.16
          ports:
            - containerPort: 80
service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
    - port: 80
      protocol: TCP
  selector:
    app: nginx
kustomization.yaml
resources:
  - deployment.yaml
  - service.yaml

以下を実行すると、結合されていることが確認できます。resourcesで複数ファイルを指定することにより、指定されたファイルが結合されます。

kubectl kustomize ./

# 結果
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.16
        name: nginx
        ports:
        - containerPort: 80

パッチの適用

kustomizeを利用すると、元となるファイルで設定された内容を指定されたパッチファイルの内容に更新することができます。例えばベース設定ではレプリカ数が2に設定されているが環境によっては4に増やしたいといったときに、パッチファイルでレプリカ数を4に設定しておくことで増やすことができます。例えば以下のように実装することで実現できます。

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicasa: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.16
          ports:
            - containerPort: 80
increase_replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 4
kustomization.yaml
resources:
  - deployment.yaml
patches:
  - path: increase_replicas.yaml

以上を実行すると以下のような結果になりました。ファイルの差分として、レプリカ数のみが2から4に変更されていることが確認できました。

kubectl kustomize ./

# 結果
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.16
        name: nginx
        ports:
        - containerPort: 80

この機能を利用することで、本番環境と開発環境のイメージの名前を変更したりと環境差分をkustomizationを利用することで吸収できることになります。そのため、ベースとなるリソース構成を共通化することができるようになります。

まとめ

今回はkustomizeを使ってkubernetesリソースのカスタマイズ方法について学習してみました。環境ごとにリソースファイルを量産する必要もなくなりますし、環境の差分をうまく設定するための方法として、実用的ですし普段の活動でもよく目にしていたので、今回学習できてよかったと思います。

実際にはもっと複雑だったり設定するべきこと、フォルダ構成などいろいろな要素があると思いますので、継続して学習して発信させてもらいます。

Discussion