Kubernetes External Secrets (KES) は Kubernetes において、AWS Secrets Managerなどの外部のシークレット管理システムと連携して、セキュアにSecretsリソースを作成するコンポーネント。
2021年に非推奨化が発表されて、2022年7月にアーカイブされている。 移行先として External Secrets Operator (ESO) がアナウンスされている。 他にも同様の機能を提供するコンポーネントはあるが、移行コストが比較的小さそうなのでこちらにした。
KESの仕組み
KESはExternalSecretリソースの内容をもとに、AWS Secrets Manager等外部システムに登録されている情報を取得し、Secret リソースを作成する。 SecretはKubernetes標準のリソースなので、他のリソースから参照できる。
ESOの仕組み
https://external-secrets.io/latest/introduction/overview/
Custom Resourceとcontrollerが、外部からシークレット情報を取得してSecretを作成する。外部システムの変更を監視し、reconcileする。
SecretStore
リソースが、外部APIの定義と認証情報を持っているので、 ExternalSecret
はどこから取ってくるのかは意識しない。
- ESO は
ExternalSecret
のspec.secretStoreRef
を使って適切なSecretStore
を見つける。見つからなければ後続の処理は行われない SecretStore
から外部APIクライアントを生成ExternalSecret
に定義された情報を外部APIから取得ExternalSecret.target.template
の定義に従ってKind=Secret
を作成する- 作成されたSecretは外部APIと同期される
サポート
https://external-secrets.io/latest/introduction/stability-support/
- 最新の2つのマイナーリリースまでをサポートする
- 2-3ヶ月に一度マイナーリリースを行う
- つまり最新バージョンはおおよそ4-6ヶ月サポートされる
AWS Secrets Manager や GCP Secret Manager等はESO公式がサポートしているので安心できそう。
主な変更点
- SecretStore(ClusterSecretStore)の追加
- ExternalSecretのapiVersionが異なる
公式でKESからESOに移行するツールを用意しているので、これのManual Migrationを実行してどんな変更になるのかを概観するとわかりやすい。
このツールには、KESからESOにmigrationしてそのままクラスターに反映させる機能もあるが、マニフェストを Argo CD で管理している都合上それをするとdiffが発生するため使わなかった。
手順
ESOをインストール
Helmでインストールできる。 https://external-secrets.io/main/introduction/getting-started/
SecretStoreを作成
https://external-secrets.io/main/guides/multi-tenancy/
今回のユースケースでは、Shared ClusterSecretStoreが移行のコストが一番小さく済みそうなので、ClusterSecretStoreを作成することにする
ExternalSecretを作成
spec.target.name
を指定しない場合はExternalSecretと同じ名前で作成される- ポーリングの間隔は、KESではDeploymentで設定していたが、ESOではExternalSecretの
spec.refreshInterval
で指定する
Secretの名前をKESとは別で作成すると、名前がバッティングすることなく簡単に作成でき、両方共存させることもできるので、参照している箇所を順次変更していくことで安全に変更できる。
Secretの名前を変えたくない場合は kes-to-esoの手動マイグレーション を参考に実施する。
- ExternalSecretをapply
- KESのreplicasを0にしてKESを停止させる
apiVersion: kubernetes-client.io/v1
のExternalSecretで生成されたSecretリソースのmetadata.ownerReferences
をapiVersion: external-secrets.io/v1beta1
のExternalSecretへ書き換える 1.