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
を利用する方法もあります。