- Raspberry Piを買っておうちKubernetesクラスタを作る
- おうちKubernetesにSealedSecretsを入れる <- イマココ
前回の続き. 次はSecrets管理をどうするかを考える. 別にお家クラスタなのでなんでもいいんだけど,なんでもいいんだけどやっぱりbase64エンコードされただけのSecretをgitにコミットしたくない. GitOpsする都合上どうしてもgitにコミットするのは必須として,たとえprivate repositoryであろうともgitにはあんまりコミットしたくない.
というわけでなんとかして暗号化されたものをコミットするだけで済ませたい.
HashiCorp Vaultに悩む
Secrets管理といったら一番最初に思いつくのはVaultだ.ただVaultで一番問題なのはVault Serverをどこに立てて誰が管理するのかという問題だ. Kubernetesクラスタを作ろうとしているのに,サーバをどこに建てるかを悩むのはなんかおかしい.
いや,おうちに適当なVaultサーバがあればいいんだけど,それすらKubernetesで管理したくなるし,それってつまり依存関係がループしているのでは?
というわけでこの案は却下.
次に考えるのはHashiCorp Cloudだ.ここなら外部にVault Serverを立てて,その管理はHashiCorpに丸投げすることができる.
問題があるとすると,カネがかかることだ.いや,厳密にうとカネがかかることそれ自体が問題なわけではない. すでに毎月結構な額をAWSに払っているのに,なんでVaultのためだけにHashiCrop Cloudにカネを払うんだ?という疑問だ.
$1.58 per hour
まぁしかも結構な金額である.
もう一つ見えるHCP Vault Secretsは無料らしいし,まぁそれで十分だと思うんだけど,それってVault Secrets Operator内からどうやって使うの?
というのがまったく謎なので,諦めた.
というかね,名前のググラビリティが低すぎるんだよ.HCP Vault SecretsでSecretsを管理してVault Secrets OperatorでSecretsに戻すって,何回Secrets書かせるんだよ.調べてもHCP Vaultの利用例しか出てこないんだよ.もっとユニークな名前つけないと調べられないだろうが.
External Secrets Operator
さっき書いたとおりAWSにはどうせ課金しているので,SecretsManagerを使ってしまえば,かなり楽に管理できる. External Secrets Operatorのいいところは,GitにコミットするリソースはSecretsManagerのパスくらいしか記述されていないところだ. 暗号化されたSecretsすら記述されないので,セキュアという意味ではかなり良い. まぁパスをミスったりすると復号できないので悲しいんだけど.
ただ問題はおうちKubernetesはAWS上のリソースではないので,OIDC(IRSA)するのが結構むずいという点だ. あと,せっかくオンプレミスで作ってるんだから,ここでAWS OIDCの設定をあまり入れたくはない.
kOpsでも最初の頃は自分でS3作って鍵を作ってKubernetesのmasterに配置して……というのをやっていた.
同じことをすればできるだろうが,あんまりこういうのはやりたくない.
専用のIAM Userを作ってAccessKeyを吐き出し,それだけGit管理せずにSecretsとして突っ込んでおいてExternalSecretsOperatorから参照するということもできる.
ただ,AccessKeyを,もうあんまり使いたくない…….
Sealed Secrets
というわけでここに落ち着いた. AWS上で使うときは,むしろ
- AWS KMSがあるのになんでクラスタごとに変化するmaster.keyで暗号化するの,KMSでいいじゃん
- 現在設定されている値を見るときにいちいちKubernetesクラスタにアクセスして復号化するのが面倒
とかいろいろ思うことがあって,だいたいいつもExternalSecretsOperatorを使ってしまう. だが,IRSAが気軽にできない環境では,こっちの方が便利な気がした.
あと,これなら追加でカネがかからない. そして,復号化とSecretリソース作成はSealedSecretsのコントローラ側でやってくれるので,我々はSealedSecretリソースをコミットするだけで良い. こういう方式だとGitOpsツール側で,復号化等の追加作業がいらないので,何を採用しても安心感がある.
というわけで
$ helm install sealed-secrets -n kube-system sealed-secrets/sealed-secrets
入れて,
$ kubeseal --fetch-cert --controller-name=sealed-secrets --controller-namespace=kube-system > pub-sealed-secrets.pem
証明書を取得して,
$ kubeseal --scope cluster-wide --format=yaml --cert=pub-sealed-secrets.pem < secrets.yaml > sealed-secrets.yaml
適当なSecretリソースをSealedSecretsに変換できる.
あとは sealed-secrets.yaml
をGit管理して,applyさせたら良いだけ.