nikkie-ftnextの日記

イベントレポートや読書メモを発信

External Secrets OperatorのGetting startedをM1 Mac・Docker Desktopで動かし、AWS Secrets Managerのシークレットからk8sのsecretを作る

はじめに

君と夏の終わり nikkieです。

Kubernetesk8s)関連の素振り模様を晒していきます。

目次

External Secrets Operator(ESO)

External Secrets Operator(ESO)とは、AWSGCPなどクラウドのシークレット管理サービスから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

ドキュメント中のこちらの図が(一度読めたあとは)分かりやすいと思います
ソース: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にシークレットを作る

AWSGUI操作は小学生までと言われるのは重々承知の上で)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. AWSのクレデンシャルをk8sのsecretとする
  2. 1のsecretを参照してSecretStoreを作る

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-practicepasswordキーに指定した値(ひ・み・つ)をpracticepasswordというキーの値に設定します。

% 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は完全に理解です。


  1. 『パスワードは、ひ・み・つ』、名作ですよね! https://aoitori.kodansha.co.jp/series/password/
  2. aws --versionによるとaws-cli/2.9.18 Python/3.9.11 Darwin/21.6.0 exe/x86_64 prompt/off
  3. ref: kubectlを使用してSecretを管理する | Kubernetes