Cover Image for 【kubernetes】環境ごとのconfigmap.yamlをhelmで作る方法
【kubernetes】環境ごとのconfigmap.yamlをhelmで作る方法

ども、k69 です。
今回はhelmの話。

image.png

はじめに

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に集約できた

最後に

もっといいやり方を知っている方はぜひ教えてください(コメント求む!)

© 2022 k69

本サイトを通じて、たくさんの人がプログラミングに興味を持ち、 これがキッカケでモノづくりの楽しさに触れることができれば幸せです!