Secrets Manager 값은 env var가 아니라 Pod의 mounted file이 된다 EKS worker node
Pod SecretProviderClass volume 선언
volume mount
Secrets Store CSI driver node마다 DaemonSet으로 실행
AWS provider 호출
AWS provider (ASCP) IRSA role을 assume
Mounted secret file CSI driver가 tmpfs volume을 mount하고 ASCP가 secret 값을 제공; rotation 활성화 시 주기적 갱신
ASCP의 GetSecretValue 요청 / secret value 반환
AWS Secrets Manager secret value 반환
Pod가 AWS credential을 직접 보유하지 않습니다. Fargate node group은 이 구성을 지원하지 않습니다.
PNG 다운로드 원본 이미지 열기
Secrets Manager의 시크릿을 Amazon EKS의 Pod에 마운트된 파일로 표시하려면, Kubernetes Secrets Store CSI Driver 와 함께 AWS Secrets and Configuration Provider(ASCP) 를 사용해야 합니다. 해당 기능은 Parameter Store parameters도 사용할 수 있습니다. Fargate 노드 그룹에는 지원되지 않습니다.
TL;DR
Secrets Manager의 시크릿을 EKS Pod에 파일로 마운트하려면 Secrets Store CSI Driver와 AWS Secrets and Configuration Provider(ASCP)를 함께 설치해야 합니다. SecretProviderClass는 마운트할 시크릿과 파일 이름을 정의하며, 사용할 Pod와 같은 namespace에 있어야 합니다. Fargate 노드 그룹에서는 이 구성이 지원되지 않습니다. Parameter Store parameter도 같은 방식으로 마운트할 수 있습니다. 1. Helm을 사용해 ASCP 설치 1.1. Helm 레포지토리 업데이트 1.2. Secrets Store CSI Driver 차트 추가 1
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
1.3. Secrets Store CSI Driver 설치 1
helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver
1.4. ACSP 차트 추가 1
helm repo add aws-secrets-manager https://aws.github.io/secrets-store-csi-driver-provider-aws
1.5. ACSP 설치 1
helm install -n kube-system secrets-provider-aws aws-secrets-manager/secrets-store-csi-driver-provider-aws
2. 마운트할 시크릿 식별 SecretProviderClass에는 마운트할 비밀과 마운트할 파일 이름이 나열되어있으며, 사용할 EKS Pod와 동일한 네임스페이스에 있어야 합니다 2.1. SecretProviderClass 생성 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
apiVersion : secrets-store.csi.x-k8s.io/v1
kind : SecretProviderClass
metadata :
name : test-secrets
namespace : weasel
spec :
provider : aws
secretObjects :
- secretName : weasel-pod-secret
type : Opaque
data :
- objectName : HOST # Kubernetes Secret에서 사용할 키 이름
key : HOST
- objectName : PORT
key : PORT
- objectName : DATABASE
key : DATABASE
- objectName : USERNAME
key : USERNAME
- objectName : PASSWORD
key : PASSWORD
parameters :
objects : |
- objectName: "arn:aws:secretsmanager:us-east-1:393035689023:secret:<BASE64_ENCRYPTION_SECRET>-I4AhIF"
jmesPath:
- path: HOST
objectAlias: HOST
- path: PORT
objectAlias: PORT
- path: DATABASE
objectAlias: DATABASE
- path: USERNAME
objectAlias: USERNAME
- path: PASSWORD
objectAlias: PASSWORD
3. EKS Pod에 Secret을 File로 마운트 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion : apps/v1
kind : Deployment
metadata :
labels :
app : test
name : test
namespace : weasel
spec :
replicas : 1
selector :
matchLabels :
app : test
template :
metadata :
labels :
app : test
spec :
serviceAccountName : weasel-eks-pod-sa
containers :
- image : amazon/aws-cli:2.0.30
name : test
command : [ " /bin/bash" , " -c" , " while true; do sleep infinity; done;" ]
volumeMounts :
- name : secrets-store-inline
mountPath : " /mnt/secrets-store"
readOnly : true
volumes :
- name : secrets-store-inline
csi :
driver : secrets-store.csi.k8s.io
readOnly : true
volumeAttributes :
secretProviderClass : " test-secrets"
4. 확인 1
2
3
4
5
6
7
8
❯ k exec -it test-5d6df6c995-6phfj -- /bin/bash
bash-4.2# cd /mnt/secrets-store/
bash-4.2# ls
DATABASE HOST PASSWORD PORT USERNAME
bash-4.2# cat PORT
53306
bash-4.2# cat DATABASE
weasel
5. Reference https://secrets-store-csi-driver.sigs.k8s.io - [Introduction - Secrets Store CSI Driver]
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/manage-secrets.html - [Kubernetes가 있는 AWS Secrets Manager 비밀 사용 - Amazon EKS]
https://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/integrating_csi_driver.html - [아마존 엘라스틱 쿠버네티스 서비스에서 AWS Secrets Manager 시크릿 사용하기 - AWS Secrets Manager]
궁금하신 점이나 추가해야 할 부분은 댓글이나 아래의 링크를 통해 문의해주세요. Written with KKamJi