GKE Secret 管理どうするか
考えたやつ
やりたいこと
Secret 直入れは嫌
kustomize から参照できるようにしたい
イメージに埋めたり中から見たいだけでなく、GCP プロダクトの連携等で Secret に値が入ってる必要があることもある
手元からも CI からも manifest 適用したい
(できたら) バージョン管理したい
こうするのはどうか
秘密の情報はファイルに書いておく
GCS に置いてもいいけど
CI では Cloud Build で復号する
手元では復号する make タスクとか用意しておいて manifest 適用前に叩く
当然復号後のファイル名は ignore しておく
kustomize では復号後のファイルを参照してリソースを作る
secretGenerator とかでファイル参照できる
複合したファイルをどっかにマウントしたいときとかも対応しやすいのではないか
要素が少ないのは良い
手作り感がある
クラスタぽいぽい作り直してもセットアップが楽、再現性がある
ただクラスタ側になにもしないから...
code:Makefile
PROJECT := your-project
GCLOUD := gcloud --project $(PROJECT)
PLAINTEXTS := \
dev/secrets/secret-text \
prd/secrets/secret-text
.PHONY: decrypt
decrypt: $(PLAINTEXTS)
%:
$(GCLOUD) kms decrypt \
--location=global \
--keyring=green \
--key=gke-secrets \
--plaintext-file=$@ \
--ciphertext-file=$(@:=.enc)
%.enc:
$(GCLOUD) kms encrypt \
--location=global \
--keyring=green \
--key=gke-secrets \
--plaintext-file=$(@:.enc=) \
--ciphertext-file=$@
External Secrets
External Secrets は GoDaddy の公開しているプラグイン
GCP & AWS の SecretManager を参照できる
よさそうだけど helm が登場する
GCP なら Config Connector でいいかなあという気持ちになる
そうか?
helm client & kubectl でも使える
Config Connector
Secret の管理のための仕組みではない
manifest から GCP リソースを作って参照できる
例えば GCS バケット作るとか Spanner インスタンス立てるとか
manifest から各種 GCP リソースを作成・参照できる
そこで SecretManagerSecret の値を Secret として参照すればよさそう
作成は別(手動等)で参照だけできるかはよくわかってない
Secret を更新 -> CloudSQL User のパスワードで参照、という感じで、Secret 側が 主なのが気になる
参照だけするのはこれ
SecretManager では projects/{{project}}/secrets/{{secret_id}} で参照できそう? なんか違いそうだな
良さそうだけど、初手 GKE アドオンインストール & Workload Identity、ハマったらめっちゃ困りそうというのが気になる
とはいえ Ingress で Load Balancing 立てるのとどの程度違うのかと言われるとまあそんなもんという気もする
試してみたいがめんどくさい
berglas
Cloud Function に mutating webhook を置いて manifest 適用時に叩く
Init Container
manifest から参照しないなら Init コンテナで secret を取ってくる手もある
アプリケーション内から Secret Manager 叩くのと雰囲気や用途は近いが Pod 起動時に処理を挟めるのでコンテナと疎結合になる
secrets-store-csi-driver
kubernetes sigs のやつ