2021-07-05 追記
当記事ではdry-runを利用してマニュフェストファイルを生成していますが、kustomizationを利用した方法のほうが簡単にsecretを生成できます。
追記ここまで
KubernetesのSecretを定義するマニュフェストを作成するの面倒じゃありませんか?
$ echo -n foo | base64
と一つ一つエンコードするのも大変ですし、機密情報がコマンドログに残るのも気持ち悪い。
色々調べていると、kubectl create configmapやkubectl create secretのオプション--from-env-fileとdry-run=clinetを組み合わせたら.envからマニュフェストが生成できそうだなと気がついたので紹介します。
kubectlのオプション解説
--from-env-file: envファイルから設定を読み込む
--dry-run=client: kubenetesのクラスターに適応せずに、クライアント側で動作するかテストする
--output=yaml: マニュフェストをyaml形式で標準出力する
以上を踏まえてやっていきましょう。
.envからSecretリソースを定義するマニュフェストを生成
.envという以下のファイルがあるとします。
HELLO=WORLD
FOO=BAR
HOGE=FUGA
my-secretというSecretリソースを定義するマニュフェストファイルを生成する場合
$ kubectl create secret generic my-secret --dry-run=client --from-env-file=.env --output=yaml
出力結果
apiVersion: v1
data:
FOO: QkFS
HELLO: V09STEQ=
HOGE: RlVHQQ==
kind: Secret
metadata:
creationTimestamp: null
name: my-secret
ということで、既に環境変数がbase64にエンコードされたマニュフェストが生成されました。
もしファイルに出力したい場合、リダイレクトを利用します。
$ kubectl create secret generic my-secret --dry-run=client --from-env-file=.env --output=yaml > secret.yml
.envからConfig Mapマニュフェスト生成
同様に.envからConfig Mapを定義するマニュフェストも生成できます。
my-config-mapというリソースを作成する場合
$ kubectl create configmap my-config-map --dry-run=client --from-env-file=.env --output=yaml
出力結果
apiVersion: v1
data:
FOO: BAR
HELLO: WORLD
HOGE: FUGA
kind: ConfigMap
metadata:
creationTimestamp: null
name: my-config-map
ファイルに出力する場合、リダイレクトを利用する。
$ kubectl create configmap my-config-map --dry-run=client --from-env-file=.env --output=yaml > configmap.yml
メリット
- secretリソースを作成する時に手動で
base64エンコードする必要がない。コマンドログにも機密情報が残らない&楽 - 開発でもよく利用するであろう
.envから生成できる。 - secretリソースを変更するときも
.envから再生成 &kubectl apply -f secret.ymlで適用できる。
終わり
.envからkubernetesのマニュフェストファイルを生成できました。
kubectl create secret generic --from-env-fileだけでも直接Secretリソースは作成できるのですが、マニュフェストファイルを生成しておくと、リソース名も定義できるのでより "infrastructure as code" が実現できると思います。
もしgit管理をする場合生データは危険なので、sopsやsealed secret、git cryptを利用して暗号化した上でコミットすることを忘れずに。
この記事が皆さんの助けになればなと思います。
備考
Secretを作成する方法としてkustomizeのsecretGeneratorを利用する方法もあります。