Ssoon

[3주차] EKS 스토리지 - EBS CSI driver 본문

AWS EKS Workshop Study

[3주차] EKS 스토리지 - EBS CSI driver

구구달스 2023. 5. 12. 00:25
CloudNet@ 팀의 AWS EKS Workshop Study 3주차 정리입니다.
# Amazon EKS User Guide 참고

 

[ CSI (Container Storage Interface) ]

 

컨테이너 환경에서 저장소 시스템과의 통합을 단순화하는 표준 인터페이스

 

저장소 공급자가 자체 드라이버를 구현하여 컨테이너 오케스트레이션 시스템과 통신할 수 있는 인터페이스를 제공합니다. 이를 통해 컨테이너 오케스트레이션 시스템은 저장소에 대한 특정 지식 없이도 다양한 저장소 공급자와 통합할 수 있게 됩니다.

출처 : https://www.inovex.de/de/blog/kubernetes-storage-volume-cloning-ephemeral-inline-volumes-snapshots/

🔹 볼륨 프로비저닝: 저장소 공급자가 컨테이너에 볼륨을 동적으로 프로비저닝할 수 있습니다.

🔹 볼륨 연결과 마운트: 프로비저닝된 볼륨을 컨테이너에 연결하고 마운트할 수 있습니다.

🔹 스냅샷 및 복구: 저장소 스냅샷을 만들고 이를 사용하여 볼륨을 복원할 수 있습니다.

🔹 볼륨 확장 및 축소: 실행 중인 컨테이너에 연결된 볼륨의 용량을 확장하거나 축소할 수 있습니다.

 

[ EBS CSI driver ]

  • Kubernetes 와 Amazon EBS 볼륨 간의 통합을 단순화하는 역할을 합니다.
  • Kubernetes 클러스터 내에서 EBS 볼륨을 쉽게 프로비저닝하고 관리할 수 있습니다.
  • Kubernetes 클러스터에서 EBS 볼륨을 효율적으로 관리하고 데이터를 안전하게 보호하는 데 도움을 줍니다. 이를 통해 애플리케이션의 스토리지 요구 사항을 충족시키고, 가용성과 성능을 향상시킬 수 있습니다.

출처 : https://www.oreilly.com/library/view/production-kubernetes/9781492092292/ch04.html

※ 클러스터를 처음 생성할 때 Amazon EBS CSI 드라이버가 설치되지 않습니다. 드라이버를 사용하려면 Amazon EKS 추가 기능 또는 자체 관리형 추가 기능으로 드라이버를 추가해야 합니다.

 

 

[ 서비스 계정에 대한 Amazon EBS CSI 드라이버 IAM 역할 생성 ]

EBS CSI 플러그 인이 사용자를 대신하여 AWS API를 호출하려면 IAM 권한이 필요합니다

  • 클러스터에 기존 IAM OIDC 제공업체가 있는지 확인합니다.
    • 클러스터의 OIDC 제공업체 ID를 검색하고 변수에 저장합니다.
oidc_id=$(aws eks describe-cluster --name myeks --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
  • 클러스터 ID를 가진 IAM OIDC 제공업체가 이미 계정에 있는지 확인합니다.
aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

 

  • IAM 역할을 생성하고 필요한 AWS 관리형 정책을 연결합니다
    • IAM 역할을 생성하는 AWS CloudFormation 스택을 배포하고, IAM 정책을 연결하고, IAM 역할의 Amazon 리소스 이름(ARN)으로 기존 ebs-csi-controller-sa 서비스 계정에 주석을 추가합니다.
eksctl create iamserviceaccount \
  --name ebs-csi-controller-sa \
  --namespace kube-system \
  --cluster myeks \
  --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
  --approve \
  --role-only \
  --role-name AmazonEKS_EBS_CSI_DriverRole

  • EBS 볼륨의 암호화에 사용자 지정 KMS 키를 사용하는 경우 IAM 역할을 지정합니다.
  • 사용자 지정 키를 생성합니다.

  • 다음 코드를 복사하여 kms-key-for-encryption-on-ebs.json 을 생성합니다.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:CreateGrant",
        "kms:ListGrants",
        "kms:RevokeGrant"
      ],
      "Resource": ["arn:aws:kms:ap-northeast-2:계정ID:key/6ab04a42-7df7-4247-bcef-2eec5435bd29"],
      "Condition": {
        "Bool": {
          "kms:GrantIsForAWSResource": "true"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": ["arn:aws:kms:ap-northeast-2:계정ID:key/6ab04a42-7df7-4247-bcef-2eec5435bd29"]
    }
  ]
}
  • 정책을 생성합니다.
aws iam create-policy \
  --policy-name KMS_Key_For_Encryption_On_EBS_Policy \
  --policy-document file://kms-key-for-encryption-on-ebs.json

  • IAM 정책을 역할에 연결합니다.
aws iam attach-role-policy \
  --policy-arn arn:aws:iam::계정ID:policy/KMS_Key_For_Encryption_On_EBS_Policy \
  --role-name AmazonEKS_EBS_CSI_DriverRole

 

[ EKS Add-ons 기능으로 EBS CSI 드라이버 관리 ]

보안을 강화하고 작업량을 줄이려면 Amazon EKS CSI 드라이버를 Amazon EKS Add-ons 기능으로 관리할 수 있습니다.

Amazon EBS CSI Add-ons 추가

  • eksctl을 사용하여 Amazon EBS CSI 추가 기능을 추가합니다.
eksctl create addon \
--name aws-ebs-csi-driver \
--cluster myeks \
--service-account-role-arn arn:aws:iam::251054188804:role/AmazonEKS_EBS_CSI_DriverRole \
--force

 

[ 샘플 애플리케이션 배포 및 CSI 드라이버 작동 여부 확인 ]

Dynamic Volume Provisioning

  • EBS 컨테이너 스토리지 인터페이스(CSI) 드라이버 GitHub 리포지토리를 로컬 시스템에 복제합니다.
git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git

  • dynamic-provisioning 예제 디렉터리로 이동합니다.
cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
  • ebs-sc StorageClass, ebs-claim PersistentVolumeClaim, app 샘플 Pod 을 배포합니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-claim
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ebs-sc
  resources:
    requests:
      storage: 4Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  containers:
  - name: app
    image: centos
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: ebs-claim
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer

  • ebs-sc 스토리지 클래스 정보를 확인합니다.

  • WaitForFirstConsumer 모드
    • 컨테이너 스케줄링과 관련된 Kubernetes의 기능입니다.
    • PersistentVolumeClaim 을 사용하는 파드가 생성될 때까지 PersistentVolume 의 바인딩과 프로비저닝을 지연시킵니다.
    • PersistentVolume 은 파드의 스케줄링 제약 조건에 의해 지정된 토폴로지에 따라 선택되거나 프로비전됩니다.
  • 생성된 Pod 정보 및 PersistentVolume 정보를 확인합니다. 

  • Pod에서 볼륨에 데이터를 쓰고 있는지 확인합니다.
kubectl exec -it app -- cat /data/out.txt

  • 리소스를 삭제합니다.

 

 

 

 

 

 

 

Comments