나의 공부기록

[Kubernetes] 15. EKS - Dynamic Provisioning, Secrets Manager 본문

CS/Kubernetes

[Kubernetes] 15. EKS - Dynamic Provisioning, Secrets Manager

나의 개발자 2025. 5. 7. 15:08

➕ 사전 준비 : Private 클러스터 생성

 

💡 EBS 🆚 EFS 차이

[ EBS(Block Storage) - 하드웨어(디스크) ]
➡️ 단일 인스턴스에 attach 해야 함
➡️ 파일 시스템이 구성되어 있지❌(= 사용자가 구성해야 함) 
➡️ 특정 노드(attach 된)에 존재하는 Pod만 접근 가능 

[ EFS(File Storage) - NFS ]
➡️ 다수 인스턴스에서 접근 가능
➡️ 여러 노드에 존재하는 다수의 Pod들이 접근 가능

👉 EKS환경에서 동적 프로비저닝을 할 때는 EFS를 사용해야 함

 

EKS환경에서 Dynamic Provisioning(동적 프로비저닝)

더보기

CSI(Container Storage Interface)

  • 다이나믹 프로비저닝을 위한 애드온(Addon)
    ➡️ALB 생성을 위해 LB Controller를 설치했던 것과 유사

1. 환경 변수 등록

export CLUSTER_NAME=pri-cluster
export ACCOUNT_ID=<내 계정 ID>
export VPC_ID=<내 VPC ID>
export REGION=ap-northeast-2
export ROLE_NAME=AmazonEKS_EFS_CSI_DriverRole

 

2. OIDC 활성화

eksctl utils associate-iam-oidc-provider --cluster $CLUSTER_NAME --approve

 

  • 정책은 이미 AWS에 구성된 관리형 정책 사용

 

3.  IRSA & AWS SA 생성

3-1. IAM Role 생성

  • IRSA = ROLE_NAME = AmazonEKS_EFS_CSI_DriverRole 생성
  • IAM SA = efs-csi-controller-sa 생성
  • 정책은 이미 존재하는 관리형 정책 = AmazonEFSCSIDriverPolicy
eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $CLUSTER_NAME \
    --role-name $ROLE_NAME \
    --role-only \
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
    --approve

 

3-2. IAM Role 생성 확인

 

4. Addon(애드온) 설치

eksctl create addon --cluster $CLUSTER_NAME --name  aws-efs-csi-driver --version latest \
    --service-account-role-arn arn:aws:iam::$ACCOUNT_ID:role/$ROLE_NAME --force
    
# 결과
2025-05-07 02:45:12 [ℹ]  Kubernetes version "1.32" in use by cluster "pri-cluster"
2025-05-07 02:45:12 [ℹ]  IRSA is set for "aws-efs-csi-driver" addon; will use this to configure IAM permissions
2025-05-07 02:45:12 [!]  the recommended way to provide IAM permissions for "aws-efs-csi-driver" addon is via pod identity associations; after addon creation is completed, run `eksctl utils migrate-to-pod-identity`
2025-05-07 02:45:12 [ℹ]  using provided ServiceAccountRoleARN "arn:aws:iam::798172178824:role/AmazonEKS_EFS_CSI_DriverRole"
2025-05-07 02:45:12 [ℹ]  creating addon: aws-efs-csi-driver

 

5. PV가 생성될 EFS 구성

5-1. EFS 생성

  • EKS가 설치된 VPC 선택

 

5-2. EFS 생성 확인

  • 🌟EFS ID 중요!

 

6.  StorageClass

6-1. StorageClass 정의

vi sc.yml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
parameters:
  provisioningMode: efs-ap
  fileSystemId: <자신의 EFS ID>
  directoryPerms: "700"

 

6-2. StorageClass 생성

  • StorageClass 이름은 나중에 사용
kubectl apply -f sc.yml 

# 결과
storageclass.storage.k8s.io/efs-sc created

 

7. PVC

7-1. PVC 정의

vi pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-claim-1
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 5Mi

 

7-2. PVC 생성

kubectl apply -f pvc.yml

#결과
persistentvolumeclaim/efs-claim-1 created

 

8. 결과 확인 - PV가 정상적으로 생성

root@aws-cli:~/mani/eks/efs# kubectl get pv,pvc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
persistentvolume/pvc-8661e57b-5681-4ba7-89ef-fa79470b4485   5Mi        RWX            Delete           Bound    default/efs-claim-1   efs-sc         <unset>                          46s

NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
persistentvolumeclaim/efs-claim-1   Bound    pvc-8661e57b-5681-4ba7-89ef-fa79470b4485   5Mi        RWX            efs-sc         <unset>                 47s
root@aws-cli:~/mani/eks/efs#

 

 

RDS에 AWS Secrets Manager 적용

더보기

1. RDS 생성

  • RDS의 인증 정보를 Secret에 넣음

 

2. Secret 생성 확인

  • pod에서 불러올 Secret 생성 ➡️ RDS의 인증정보
  • Secret을 사용하기 위한 샘플 코드 제공

 

Secret CSI 드라이버 설치

3. OIDC 활성화

eksctl utils associate-iam-oidc-provider --cluster $CLUSTER_NAME --approve

 

4. IAM SA 생성

eksctl create iamserviceaccount --name secret-sa --region=$REGION --cluster $CLUSTER_NAME --attach-policy-arn arn:aws:iam::aws:policy/SecretsManagerReadWrite --approve --override-existing-serviceaccounts

# sa 생성 확인
root@aws-cli:~/mani/eks/efs# kubectl get sa
NAME        SECRETS   AGE
default     0         89m
secret-sa   0         49s

 

5. helm 레포지토리 추가

helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts

 

6. helm 릴리스 생성 (namespace : kube-system)

helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver

 

ASCP(AWS Secrets and Configuration Provider)

  • AWS의 Secret을 EKS의 Secret처럼 쓸 수 있게 해줌

7. ASCP를 위한 헬름 레포지토리 추가

helm repo add aws-secrets-manager https://aws.github.io/secrets-store-csi-driver-provider-aws

 

8. ASCP 릴리스 생성

helm install -n kube-system secrets-provider-aws aws-secrets-manager/secrets-store-csi-driver-provider-aws

 

9. SecretProviderClass 정의

  • metadata.name : aws-secrets ➡️ 나중에 Pod 정의 시, SecretProviderClass를 명시할 때, 쓰이는 이름
vi spc.yml

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
spec:
  provider: aws
  parameters:
    objects: |
        - objectName: "<내 시크릿의 ARN>"

 

  • 내 시크릿의 ARN 확인 방법 : AWS Secrets Manager > 보안 암호 

 

10.  SPC 생성

kubectl apply -f spc.yml

 

 11. 테스트용 Deployment 정의

vi test-dep.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fast-dep
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fast
  template:
    metadata:
      name: fast-pod
      labels:
        app: fast
    spec:
      serviceAccountName: secret-sa 
      containers:
      - name: fast-con
        image: oolralra/ipnginx
        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: "aws-secrets"  # 참조하는 SecretProviderClass의 이름

 

12. 테스트용 Deployment 생성

kubectl apply -f test-dep.yml

 

13. 결과 확인

  • RDS의 접속정보 확인 가능