はじめに
君と夏の終わり♪ nikkieです。
Kubernetes(k8s)関連の素振り模様を晒していきます。
目次
- はじめに
- 目次
- External Secrets Operator(ESO)
- 動作環境
- Getting started:AWS Secrets Managerのシークレットからk8sのsecretを作る
- 終わりに
External Secrets Operator(ESO)
External Secrets Operator(ESO)とは、AWSやGCPなどクラウドのシークレット管理サービスからk8sのsecret(リソース)を作るものと理解しています。
シークレット管理サービスを使わずとも秘密情報をk8sのsecretにできますが(kubectl create secret ...
)、ESOを使ってシークレット管理サービスの設定値からsecretを作れることで、秘密情報の管理が単純になるな〜と感じます。
元々Kubernetes External Secretsというものがあったようですがdeprecatedとなり、移行先としてESOが選ばれることが多いようです。
ESO、3つのリソース
API Overviewのドキュメントには、ESOには3つのリソースがあると説明されます
- SecretStore
- ESOから見て外部(=各種クラウド)のシークレット管理サービスにどのようにアクセスするかを定義
- (SecretStoreとExternalSecretとで関心の分離をしている)
- ExternalSecret
- シークレット管理サービスからどのデータを取得するかを定義
- 指定したデータからk8sのsecretができる
- ClusterSecretStore
- クラスタでグローバルなSecretStore
ドキュメント中のこちらの図が(一度読めたあとは)分かりやすいと思います
ソース:https://external-secrets.io/latest/pictures/diagrams-resource-mapping.png
ちょっとでも理解を深めるために素振りしようと、ドキュメントの「Getting started」に取り組みました。
動作環境
M1 Macです。
% sw_vers ProductName: macOS ProductVersion: 12.6.6 BuildVersion: 21G646
Docker Desktop(Version 4.21.1 (114176))を使い、Kubernetesを動かしています(めっちゃ便利!)
k8s関連のコマンドのバージョンは以下です。
% kubectl version Client Version: v1.28.0 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3 Server Version: v1.27.2 % helm version version.BuildInfo{Version:"v3.12.3", GitCommit:"3a31588ad33fe3b89af5a2a54ee1d25bfe6eaa5e", GitTreeState:"clean", GoVersion:"go1.20.7"}
操作するcontextはデフォルトのdocker-desktop
、namespaceはデフォルトのdefault
となります
Getting started:AWS Secrets Managerのシークレットからk8sのsecretを作る
やることは以下です。
- AWSのSecrets Managerにシークレットを作る
- ドキュメントでは具体値の指定がないので、今回はキーと値のペアとしました
- クラスタにESOをインストール
- SecretStoreを作る
- ExternalSecretを作る
- 結果、Secrets Managerに作ったシークレットからk8sのsecretができている
AWSのSecrets Managerにシークレットを作る
(AWSのGUI操作は小学生までと言われるのは重々承知の上で)GUI操作してシークレットexternal-secret-practice
を作りました。
練習用なのでキーと値の設定もお見せしちゃいます!1
AWS CLI2から取得できることも確認しました。
aws secretsmanager get-secret-value --secret-id external-secret-practice
ref: https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/retrieving-secrets.html
クラスタにESOをインストール
Docker Desktopで動かしているk8sクラスタにインストールしちゃいます!
「Getting started」の「Installing with Helm」のところですね。
helm install external-secrets external-secrets/external-secrets -n external-secrets --create-namespace
これでexternal-secrets namespaceが作られ、ESOのインストールもされます。
If you do not want the CRDs to be automatically upgraded and managed, you must set the installCRDs option to false. (e.g.
--set installCRDS=false
)
CRDの自動アップグレードや自動管理を望まない場合は、(helm install
で)--set installCRDS=false
を指定してね(意訳)とあるのですが、指定したところapplyしたときに「ensure CRDs are installed first」と言われたので指定していません(アンインストールしてやり直しています)
SecretStoreを作る
AWS Secrets Managerへのアクセスを定義します。
1は「Create a secret containing your AWS credentials」に沿って実施します。
% kubectl create secret generic awssm-secret --from-file=./access-key --from-file=./secret-access-key secret/awssm-secret created
(2つのファイルaccess-keyとsecret-access-key中の値は、上でaws CLIに使っているのと揃えています)
これでsecret awssm-secretができ、access-keyとsecret-access-keyという2つのキーを持ちます。
この2つのキーを参照してSecretStoreを定義します。
% kubectl apply -f secret-store.yaml
secretstore.external-secrets.io/secretstore-sample created
SecretStoreまでできました!
ExternalSecretを作る
SecretStore(secretstore-sample
)を参照してExternalSecretを作ります。
できあがるsecretはpractice
とし、AWS Secrets Managerのシークレットexternal-secret-practice
のpassword
キーに指定した値(ひ・み・つ
)をpractice
のpassword
というキーの値に設定します。
% kubectl apply -f external-secret.yaml
externalsecret.external-secrets.io/example created
ExternalSecretをapplyしたあと、secretsを見ると
% kubectl get secrets NAME TYPE DATA AGE awssm-secret Opaque 2 14m practice Opaque 1 28s
practiceがある!!
passwordというキーの値を見ると3
% kubectl get secrets practice -o jsonpath='{.data.password}' | base64 -d ひ・み・つ
AWS Secrets Managerのシークレットに保存した値がk8sのsecretにできました!🙌
後片付け
% kubectl delete -f external-secret.yaml -f secret-store.yaml externalsecret.external-secrets.io "example" deleted secretstore.external-secrets.io "secretstore-sample" deleted % kubectl delete secret awssm-secret secret "awssm-secret" deleted % helm delete external-secrets --namespace external-secrets release "external-secrets" uninstalled % kubectl delete ns external-secrets namespace "external-secrets" deleted
Secrets Managerのシークレットも削除します
終わりに
ESOを使って、AWS Secrets Managerのシークレットからk8sのsecretを作れました!
ローカルのk8sクラスタでESOのインストールから動かせて、Getting startedは完全に理解です。
- 『パスワードは、ひ・み・つ』、名作ですよね! https://aoitori.kodansha.co.jp/series/password/↩
-
aws --version
によるとaws-cli/2.9.18 Python/3.9.11 Darwin/21.6.0 exe/x86_64 prompt/off
↩ - ref: kubectlを使用してSecretを管理する | Kubernetes↩