Ssoon
[3주차] EKS 스토리지 - EBS CSI driver 본문
CloudNet@ 팀의 AWS EKS Workshop Study 3주차 정리입니다.
# Amazon EKS User Guide 참고
[ CSI (Container Storage Interface) ]
컨테이너 환경에서 저장소 시스템과의 통합을 단순화하는 표준 인터페이스
저장소 공급자가 자체 드라이버를 구현하여 컨테이너 오케스트레이션 시스템과 통신할 수 있는 인터페이스를 제공합니다. 이를 통해 컨테이너 오케스트레이션 시스템은 저장소에 대한 특정 지식 없이도 다양한 저장소 공급자와 통합할 수 있게 됩니다.
🔹 볼륨 프로비저닝: 저장소 공급자가 컨테이너에 볼륨을 동적으로 프로비저닝할 수 있습니다.
🔹 볼륨 연결과 마운트: 프로비저닝된 볼륨을 컨테이너에 연결하고 마운트할 수 있습니다.
🔹 스냅샷 및 복구: 저장소 스냅샷을 만들고 이를 사용하여 볼륨을 복원할 수 있습니다.
🔹 볼륨 확장 및 축소: 실행 중인 컨테이너에 연결된 볼륨의 용량을 확장하거나 축소할 수 있습니다.
[ EBS CSI driver ]
- Kubernetes 와 Amazon EBS 볼륨 간의 통합을 단순화하는 역할을 합니다.
- Kubernetes 클러스터 내에서 EBS 볼륨을 쉽게 프로비저닝하고 관리할 수 있습니다.
- Kubernetes 클러스터에서 EBS 볼륨을 효율적으로 관리하고 데이터를 안전하게 보호하는 데 도움을 줍니다. 이를 통해 애플리케이션의 스토리지 요구 사항을 충족시키고, 가용성과 성능을 향상시킬 수 있습니다.
※ 클러스터를 처음 생성할 때 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
- 리소스를 삭제합니다.
'AWS EKS Workshop Study' 카테고리의 다른 글
[3주차] EKS 스토리지 - FSx for Lustre CSI driver (0) | 2023.05.12 |
---|---|
[3주차] EKS 스토리지 - EFS CSI driver (0) | 2023.05.12 |
[2주차] EKS Networking - Custom configuration mode (0) | 2023.05.04 |
[2주차] EKS Networking - Prefix Mode (0) | 2023.05.04 |
[2주차] EKS Networking - Secondary IP mode (0) | 2023.05.02 |
Comments