Closed5
External Secrets OperatorをEKSに入れるメモ
irsaでの導入
この辺
helmでの導入
helm repo add external-secrets https://charts.external-secrets.io/
helm repo update external-secrets
helm upgrade external-secrets external-secrets/external-secrets \
--install --version 0.9.19 \
--namespace kube-system \
--set serviceAccount.create=false
ServiceAccountは予め用意しておく
apiVersion: v1
kind: ServiceAccount
metadata:
name: external-secret
# namespace: kube-system
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::<account id>:role/<作ったロール>
secrets連携
あらかじめtest-secret
というシークレットをsecrets managerに作成しておく
SecretStoreデプロイ
利用する秘匿情報管理サービスやアクセス方法を定義するリソース
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: secretstore-sample
namespace: kube-system
spec:
provider:
aws:
service: SecretsManager
region: ap-northeast-1
auth:
jwt:
serviceAccountRef:
name: external-secret # サービスアカウントを指定
正常にデプロイできた際のログ
$ k logs external-secretsxxxx
{"level":"info","ts":1720318513.2562268,"logger":"provider.aws","msg":"using aws session","region":"ap-northeast-1","external id":"","credentials":{}}
{"level":"info","ts":1720318515.0315566,"logger":"provider.aws","msg":"using aws session","region":"ap-northeast-1","external id":"","credentials":{}}
externalsecretのデプロイ
取得する対象のデータや生成するSecretなどを定義するリソース
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: example
namespace: kube-system
spec:
refreshInterval: 5m
secretStoreRef:
name: secretstore-sample
kind: SecretStore
target:
name: test-secret
creationPolicy: Owner
data:
- secretKey: secret-sample
remoteRef:
key: test-secret
property: password
ログ
{"level":"info","ts":1720318641.2267754,"logger":"provider.aws.secretsmanager","msg":"fetching secret value","key":"test-secret","version":"AWSCURRENT","value":"SECRET"}
secret確認
❯ k get secret test-secret -n kube-system
NAME TYPE DATA AGE
test-secret Opaque 1 101s
cluster単位のClusterSecretStore
上記の例ではkube-system
namespaceですべて完結したが、
それ以外のnamespaceではserviceaccountがデプロイされていないため、secretsmanagerへアクセス出来ない。
ClusterSecretStoreを利用すると全namespaceからsecretsmanagerへアクセスできる
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: cluster-secretstore-sample
spec:
provider:
aws:
service: SecretsManager
region: ap-northeast-1
auth:
jwt:
serviceAccountRef:
name: external-secret
namespace: kube-system # サービスアカウントのnamespaceを指定
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: example
namespace: default # サービスアカウントの存在しないnamespace
spec:
refreshInterval: 5m
secretStoreRef:
name: cluster-secretstore-sample
kind: ClusterSecretStore ###
target:
name: test-secret
creationPolicy: Owner
data:
- secretKey: secret-sample
remoteRef:
key: test-secret
property: password
クラスター単位のexternalsecretもある
メモ
- namespace周りに気をつければ特に難しい点はない
- 基本的にはClusterSecretStoreで単一のSAでSecretsManagerへアクセス出来るようにしておいて、各namespaceのexternalsecretで指定してもらうのが権限的にはよい?
- 各namespaceでSA作るのは手間、ClusterExternalSecretだと不必要なsecretsにアクセスできてしまう
- クラスタ全体/namespace単位で必要なリソースを考える
- 各namespaceでSA作るのは手間、ClusterExternalSecretだと不必要なsecretsにアクセスできてしまう
- cluster単位のリソース
ClusterSecretStore/ClusterExternalSecret
は便利だが、権限周りの考慮が必要- 問題に出くわしたら再度戻ってくる
このスクラップは5ヶ月前にクローズされました