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経由で利用してみます。
主な機能としては以下があるようです。
- 他のソースからリソースを生成する
- リソースの横断的なフィールドの設定
- リソースコレクションの作成とカスタマイズ
使ってみる
インストール
まずはkubectlのインストールが必要になります。macbookを使っている方は以下のようにしてkubectlをまずはインストールします。
brew install kubectl
そのほかのインストール方法は以下を参照ください。
ConfigMap生成
それではまずはConfigMap生成のチュートリアルをしてみます。ConfigMapとは設定情報をキーバリューストアの形式で保存しておくリソースになります。
まずはキーバリューデータをファイルに設定します。application.properties
というファイル名で以下のようにファイルを作成します。
FOO=Bar
次に、kustomizeの設定ファイルである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
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
直下に値が保存されます。
また、複数のファイルを指定することもできます。
configMapGenerator:
- name: example-configmap
files:
- application.properties
ens:
- .env
configMapGenerator:
- name: example-configmap
ens:
- .env
Secret生成
次にSecretを生成してみます。Secretとは、kuberntes上でアプリケーションを実行する際に必要な機密情報を扱うための仕組みです。
例として、password.txt
にユーザ名やパスワードが保存されている場合、以下のようにするとSecretを扱うためのYAMLファイルを生成できます。
username=admin
password=password
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.yaml
とservice.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
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
app: nginx
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に設定しておくことで増やすことができます。例えば以下のように実装することで実現できます。
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
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 4
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