【kubernetes】環境ごとのconfigmap.yamlをhelmで作る方法
ども、k69 です。
今回はhelmの話。
はじめに
kubernetesのyamlを作成するときにhelmを使っている人は多いと思いますが、
configmap.yamlに登録するアプリなどのconfigファイルを皆さんはどのように管理していますか?
私は環境情報(develop,stage,productなど)をvalues.yamlと_helpers.tplを使って各環境ごとのconfigmap.yamlを作成しました。
同じ悩みを持っている人がいるかもと思い、今回の記事を書きました。
やりたいこと
- 環境依存情報は一箇所にまとめたい。
- アプリ開発チームが作成したconfigファイルをそのまま使いたい。
- configmap.yamlに環境依存情報は持たせない(環境依存情報はvalues.yamlに集約)
ディレクトリ構成
helm create hogepkg
コマンドで雛形を作成後、下記のように修正しました。
※ helmは v2.12.3 です
ディレクトリ構成
charts
└─hogepkg
│ Chart.yaml
│
├─charts
├─inventories
│ ├─develop
│ │ │ values.yaml ★ 1. develop環境用のvalues.yamlファイル
│ │ │
│ │ └─files
│ │ hoge.conf ★ 2. develop環境用のconfigファイル
│ │
│ ├─product
│ └─stage
└─templates
│ configmap.yaml ★ 3. configmap用のhelmテンプレート
│ _helpers.tpl ★ 4. configmapの{{ template }}から呼び出されるヘルパー関数を定義
│
└─tests
各ファイルの内容
1. values.yaml
develop環境用のvalues.yamlファイル
values.yaml
$ cat values.yaml
# Default values for hogepkg.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
env: develop
2. hoge.conf
develop環境用のconfigファイル(適当な内容)
hoge.conf
app develop
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
}
3. configmap.yaml
configmap用のhelmテンプレート
configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: samplepkg
labels:
env: {{ .Values.env }} ★ values.yamlから値を読み込む
data:
{{ template "apphoge.conf" . }} ★ _helpers.tplから値を読み込む
4. _helpers.tpl
configmapの{{ template }}から呼び出されるヘルパー関数
※printfで文字列結合しているところがポイント
_helpers.tpl
{{/*
Get apphoge.conf for configmap.yaml
- 処理概要
1. values.yamlに設定しているenvから環境情報(=developなど)を取得
2. printf関数を使用して文字列を結合し、confファイルのパスを作成
3. confファイルを読み込んだ結果をインデント2(先頭に半角スペースを2個追加)
*/}}
{{- define "apphoge.conf" -}}
{{- $env := .Values.env -}}
{{- $path := printf "inventories/%s/files/hoge.conf" $env -}}
{{ (.Files.Glob $path).AsConfig | indent 2 }}
{{- end -}}
develop環境のconfigmap.yamlを作る
develop環境用のvalues.yamlを指定し、helm template
コマンドを実行する
helm_templateコマンド
cd charts ★ 作業ディレクトリ
helm template hogepkg -f ./hogepkg/inventories/develop/values.yaml
実行結果
実行結果
$ helm template hogepkg -f ./hogepkg/inventories/develop/values.yaml
---
# Source: hogepkg/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: samplepkg
labels:
env: develop
data:
hoge.conf: |-
app develop
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
}
まとめ
やりたいことは実現できた!!
- 環境依存情報は一箇所にまとめたい。
inventoriesフォルダ配下に各環境用のサブフォルダにまとめることができた。 - 開発チームが作成したconfigファイルをそのまま使いたい。
filesファオル配下に格納すればOK。 - configmap.yamlに環境依存情報は持たせない(環境依存情報はvalues.yamlに集約)
変数{{ .Values }}、{{ template }}で環境依存情報はvalues.yamlに集約できた
最後に
もっといいやり方を知っている方はぜひ教えてください(コメント求む!)