$ helm repo add external-secrets https://charts.external-secrets.io
$ helm install external-secrets \
external-secrets/external-secrets \
-n external-secrets \
--create-namespace \
--set installCRDs=true \
--set webhook.port=9443
위 명령어 실행 후 확인
external-secrets
, external-secrets-cert-controller
, external-secrets-webhook
총 세 종류의 파드가 정상적으로 확인되어야한다.
미리 생성해놓은 victor-eks-fargate-svc-role
에 아래와 같이 설정해주었다.
victor-secretstore.yaml
내용
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: victor-parameterstore
namespace: kube-system # namespace는 당연히 모두 같아야 함.
spec:
provider:
aws:
service: ParameterStore
region: ap-northeast-2
auth:
jwt:
serviceAccountRef: # 인증에 사용할 IAM Service Account 정보 정의
name: victor-eks-fargate-svc-role-sa
apply 해준다.
$ kubectl apply -f victor-secretstore.yaml
Valid 상태가 되면 잘 된것이다.
현재 AWS SSM 파라미터 스토어에 저장되어있는 test-key 파라미터의 값을 사용할 것이다.
victor-externalsecret.yaml
내용
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: victor-externalsecret
namespace: kube-system
spec:
secretStoreRef: # 위에서 생성한 SecretStore 정보 정의
name: victor-parameterstore
kind: SecretStore
target:
name: victor-k8s-secret # EKS 클러스터 내에 만들어질 secret name 정의
data:
- secretKey: test-key # secret 내 key name 정의
remoteRef:
key: test-key # 클러스터 내에서 쓸 AWS SSM Parameter store데이터의 key name 명시
apply 해준다.
$ kubectl apply -f victor-externalsecret.yaml
apply 후 확인해보니 SecretSynced 상태이고
EKS 클러스터 내 secret에 방금 yaml파일 target 내 지정한 이름으로 잘 생성이 되어있다.
deployment 파일 수정
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: app-deployment
template:
metadata:
labels:
app: app-deployment
spec:
containers:
- name: app-deployment
image: # 비공개
envFrom:
- configMapRef:
name: env-configmap
# 이 아래부분 부터
env:
- name: TEST_KEY # 컨테이너 내에서 등록될 환경변수의 이름
valueFrom:
secretKeyRef:
name: victor-k8s-secret # secret의 이름
key: test-key # secret data에 명시된 키
optional: false # 환경변수가 제대로 주입이 안될 경우 컨테이너 생성이 안되게 함
########################################################################
ports:
- containerPort: 3000
그리고, apply 해준다.
$ kubectl apply -f app-deployment.yaml
배포된 deployment(pod)에 Shell로 접속해서 환경변수로 주입이 잘 되어있는지 확인해보자.
잘 확인된다.
참고: Parameter Store에 저장되어있는 중첩되있는 값들이나 array들도 gjson 문법으로 액세스가 가능하다. (https://github.com/tidwall/gjson/blob/master/SYNTAX.md)
AWS SSM Parameter Store에 위와 같은 JSON 및 array 형태의 키와 값을 저장해줬다.
victor-secretstore.yaml
내용
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: victor-parameterstore
namespace: kube-system
spec:
provider:
aws:
service: ParameterStore
region: ap-northeast-2
auth:
jwt:
serviceAccountRef:
name: victor-eks-fargate-svc-role-sa # 인증에 사용할 IAM Service Account 정보 정의
apply 해준다.
$ kubectl apply -f victor-secretstore.yaml
Valid 상태 확인
victor-externalsecret.yaml
내용
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: victor-externalsecret
namespace: kube-system
spec:
refreshInterval: 1m # 1분마다 refresh해서 Parameter store 값 업데이트해서 가져옴
secretStoreRef: # 위에서 생성한 SecretStore 정보 정의
name: victor-parameterstore
kind: SecretStore
target:
name: victor-k8s-secret-db # EKS 클러스터 내에 만들어질 secret name 정의
data:
- secretKey: account-id # secret 내 key name 정의
remoteRef:
key: victor-secret-db # EKS 클러스터로 가져올 AWS SSM Parameter store 데이터의 key name 명시
property: account.id # root
- secretKey: account-password
remoteRef:
key: victor-secret-db
property: account.password # root1234
- secretKey: endpoint-url-0
remoteRef:
key: victor-secret-db
property: endpoints.0.url # test01.com
- secretKey: endpoint-tag-0
remoteRef:
key: victor-secret-db
property: endpoints.0.tag # test01
apply 해준다.
$ kubectl apply -f victor-externalsecret.yaml
apply 후 kubectl get externalsecret -n kube-system
명령어로 확인해보니 SecretSynced 상태이고
EKS 클러스터 내 secret에 방금 yaml파일 target 내 지정한 이름으로 잘 생성이 되어있다.
deployment 파일 수정
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: app-deployment
template:
metadata:
labels:
app: app-deployment
spec:
containers:
- name: app-deployment
image: # 비공개
envFrom:
- configMapRef:
name: env-configmap
env: # 여기 아래부터
- name: DB_ID # 컨테이너 내에서 등록될 환경변수의 이름
valueFrom:
secretKeyRef:
name: victor-k8s-secret-db # secret의 이름
key: account-id # secret data에 명시된 키
optional: false # 환경변수가 제대로 주입이 안될 경우 컨테이너 생성이 안되게 함
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: victor-k8s-secret-db
key: account-password
optional: false
- name: DB_ENDPOINT_URL_0
valueFrom:
secretKeyRef:
name: victor-k8s-secret-db
key: endpoint-url-0
optional: false
- name: DB_ENDPOINT_TAG_0
valueFrom:
secretKeyRef:
name: victor-k8s-secret-db
key: endpoint-tag-0
optional: false
###########################################################################
ports:
- containerPort: 3000
그리고, apply 해준다.
$ kubectl apply -f app-admin-deployment.yaml
배포된 deployment(pod)에 Shell로 접속해서 환경변수로 주입이 잘 되어있는지 확인해보자.
잘 확인된다.
💡 참고
AWS SSM Parameter Store에서 데이터 값 변경이 일어난 경우, EKS 클러스터 내 secret에서 refresh되어 업데이트가 됐다 하더라도 해당 deployment(pod)가 재기동 되어야지 환경변수도 업데이트 된다.
victor-secretstore-aws.yaml
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: aws-parameterstore # name만 다르게 해줌
namespace: kube-system
spec:
provider:
aws:
service: ParameterStore
region: ap-northeast-2
auth:
jwt:
serviceAccountRef:
name: victor-eks-fargate-svc-role-sa
apply
$ kubectl apply -f victor-secretstore-aws.yaml
Secret Store가 잘 생성되었다.
victor-pushsecret.yaml
apiVersion: external-secrets.io/v1alpha1
kind: PushSecret
metadata:
name: victor-pushsecret # Customisable
namespace: kube-system # Same of the SecretStores
spec:
refreshInterval: 10s # Refresh interval for which push secret will reconcile
secretStoreRefs: # A list of secret stores to push secrets to
- name: aws-parameterstore
kind: SecretStore
selector:
secret:
name: victor-k8s-secret # Source Kubernetes secret to be pushed
data:
- match:
secretKey: test-key # Source Kubernetes secret key to be pushed
remoteRef:
remoteKey: test-key-2 # Remote reference (where the secret is going to be pushed)
위 내용으로 apply
$ kubectl apply -f victor-pushsecret.yaml
위와 같이 Synced 상태이면 잘 된 것이다.
그리고, AWS SSM Parameter Store에 test-key-2라는 이름으로 EKS 클러스터 시크릿 내 test-key 의 값이 push 된 것을 확인할 수 있다.
https://external-secrets.io/latest/
https://external-secrets.io/latest/provider/aws-parameter-store/