on
[EKS] EBS 볼륨을 PV로 사용 #1
[EKS] EBS 볼륨을 PV로 사용 #1
Pod 간 공유 가능한 스토리지를 만들어야 했습니다.
그러던 중 PV, PVC 라는 k8s 개념이 있어서 공부한 것을 정리해 보겠습니다.
물리 스토리지를 쿠버네티스 클러스터에 표현한 것이 PV이고, Pod의 볼륨과 PV를 연결하는 관계가 PVC 입니다.
StorageClass
- 볼륨 유형 및 바인딩 속성을 지정하려면 스토리지 클래스가 필요합니다. 지금은 standard를 지정하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 kind: StorageClass apiVersion: storage.k8s.io / v1 metadata: name: standard # 기본 StorageClass provisioner: kubernetes.io / aws - ebs parameters: type: gp2 reclaimPolicy: Retain mountOptions: - debug volumeBindingMode: Immediate cs
Reclaim Policy
PV는 연결된 PVC가 삭제된 후 다시 다른 PVC에 의해서 재사용이 가능한데, 재사용 시에 디스크의 내용을 지울지 유지할지에 대한 정책을 Reclaim Policy를 이용하여 설정이 가능합니다. (디스크의 특성에 따라 적용 가능한 Policy가 다릅니다)
Retain: 삭제하지 않고 PV의 내용을 유지합니다. 삭제할 때는 수동으로 삭제해야 합니다.
Recycle: 기본 볼륨 플러그인에서 지원하는 경우 Recycle 반환 정책은 볼륨에서 기본 스크럽( rm -rf /thevolume/* )을 수행하고 새 클레임에 다시 사용할 수 있도록 합니다.
Recycle rm -rf /thevolume/* Delete: 볼륨의 사용이 끝나면, 해당 볼륨은 삭제됩니다. AWS EBS, GCE PD, Azure Disk 등이 이에 해당합니다.
https://kubernetes.io/ko/docs/concepts/storage/persistent-volumes/#%EB%B0%98%ED%99%98-reclaiming
AWS EBS 파라미터
type: io1, gp2, sc1, st1. 자세한 내용은 AWS 문서를 본다. 기본값: gp2.
io1, gp2, sc1, st1. 자세한 내용은 AWS 문서를 본다. 기본값: gp2. zone (사용 중단(deprecated)): AWS 영역. zone 과 zones 를 지정하지 않으면, 일반적으로 쿠버네티스 클러스터의 노드가 있는 모든 활성화된 영역에 걸쳐 볼륨이 라운드 로빈으로 조정된다. zone 과 zones 파라미터를 동시에 사용해서는 안된다.
(사용 중단(deprecated)): AWS 영역. 지정하지 않으면, 일반적으로 쿠버네티스 클러스터의 노드가 있는 모든 활성화된 영역에 걸쳐 볼륨이 라운드 로빈으로 조정된다. zones 파라미터를 동시에 사용해서는 안된다. zones (사용 중단): 쉼표로 구분된 AWS 영역의 목록. zone 과 zones 를 지정하지 않으면, 일반적으로 쿠버네티스 클러스터의 노드가 있는 모든 활성화된 영역에 걸쳐 볼륨이 라운드 로빈으로 조정된다. zone 과 zones 파라미터를 동시에 사용해서는 안된다.
(사용 중단): 쉼표로 구분된 AWS 영역의 목록. 지정하지 않으면, 일반적으로 쿠버네티스 클러스터의 노드가 있는 모든 활성화된 영역에 걸쳐 볼륨이 라운드 로빈으로 조정된다. zones 파라미터를 동시에 사용해서는 안된다. iopsPerGB: io1 볼륨 전용이다. 1초당 GiB에 대한 I/O 작업 수이다. AWS 볼륨 플러그인은 요청된 볼륨 크기에 곱셈하여 볼륨의 IOPS를 계산하고 이를 20,000 IOPS로 제한한다(AWS에서 지원하는 최대값으로, AWS 문서를 본다). 여기에는 문자열, 즉 10 이 아닌, "10" 이 필요하다.
io1 볼륨 전용이다. 1초당 GiB에 대한 I/O 작업 수이다. AWS 볼륨 플러그인은 요청된 볼륨 크기에 곱셈하여 볼륨의 IOPS를 계산하고 이를 20,000 IOPS로 제한한다(AWS에서 지원하는 최대값으로, AWS 문서를 본다). 여기에는 문자열, 즉 10 이 아닌, "10" 이 필요하다. fsType: fsType은 쿠버네티스에서 지원된다. 기본값: "ext4".
"ext4". encrypted: EBS 볼륨의 암호화 여부를 나타낸다. 유효한 값은 "ture" 또는 "false" 이다. 여기에는 문자열, 즉 true 가 아닌, "true" 가 필요하다.
"ture" 또는 여기에는 문자열, 즉 true 가 아닌, 필요하다. kmsKeyId: 선택 사항. 볼륨을 암호화할 때 사용할 키의 전체 Amazon 리소스 이름이다. 아무것도 제공되지 않지만, encrypted 가 true라면 AWS에 의해 키가 생성된다. 유효한 ARN 값은 AWS 문서를 본다.
https://kubernetes.io/ko/docs/concepts/storage/storage-classes/#aws-ebs
PV용 AWS EBS 프로비저닝
- EBS 볼륨은 PV를 연결하려는 pod가 생성되는 node와 동일한 리전 및 가용성 영역에 있어야 합니다.
& aws ec2 create-volume --region ap-northeast-2 --availability-zone ap-northeast-2a --size 5 --volume-type gp2
node에 label 부여
(pod가 생성될 node를 지정하기 위함)
$ kubectl label nodes <레이블 키>=<레이블 값>
PersistentVolume (PV)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 apiVersion: v1 kind: PersistentVolume metadata: name: pv - 1 spec: accessModes: - ReadWriteOnce awsElasticBlockStore: fsType: ext4 volumeID: vol - xxxxxxxxxxxx capacity: storage: 5Gi persistentVolumeReclaimPolicy: Retain storageClassName: gp2 - retain volumeMode: Filesystem hostPath: # node에 저장하도록 path 지정 path: / data cs
생성된 EBS 볼륨의 ID를 확인하고 yaml 파일에 넣어줍니다.
awsElasticBlockStore 볼륨은 AWS EBS 볼륨을 Pod에 마운트 합니다. Pod를 제거할 때 지워지는 emptyDir 와는 다르게 EBS 볼륨의 내용은 유지되고, 볼륨은 마운트 해제만 됩니다. 이 의미는 EBS 볼륨에 데이터를 미리 채울 수 있으며, 파드 간에 데이터를 "전달(handed off)"할 수 있습니다.
hostPath 를 사용하여 Pod의 디렉터리와 node의 디렉터리가 마운트 되게 설정하겠습니다.
PersistentVolumeClaim (PVC)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 apiVersion: v1 kind: PersistentVolumeClaim metadata: labels: app: wordpress name: pvc - 1 spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: gp2 - retain volumeMode: Filesystem volumeName: pv - 1 cs
AccessMode: PV에 대한 동시에 Pod에서 접근할 수 있는 정책을 정의합니다. (AWS EBS는 ReadWriteOnce 만 가능) ReadWriteOnce: 하나의 노드에서 해당 볼륨이 읽기-쓰기로 마운트 될 수 있다. ReadWriteOnce 접근 모드에서도 파트가 동일 노드에서 구동되는 경우에는 복수의 파드에서 볼륨에 접근할 수 있다. ReadWriteMany: 볼륨이 다수의 노드에서 읽기 전용으로 마운트 될 수 있다. ReadWriteOncePod: 볼륨이 단일 파드에서 읽기-쓰기로 마운트 될 수 있다. 전체 클러스터에서 단 하나의 파드만 해당 PVC를 읽거나 쓸 수 있어야 하는 경우 ReadWriteOncePod 접근 모드를 사용한다. 이 기능은 CSI 볼륨과 쿠버네티스 버전 1.22+ 에서만 지원된다.
Wordpress 배포
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 apiVersion: apps / v1 kind: Deployment metadata: name: wordpress labels: app: wordpress spec: selector: matchLabels: app: wordpress tier: frontend template: metadata: labels: app: wordpress tier: frontend spec: containers: - image: wordpress: 5. 5. 3 - apache name: wordpress env: - name: WORDPRESS_DB_HOST value: wordpress - mysql - name: WORDPRESS_DB_PASSWORD value: password ports: - containerPort: 80 name: wordpress volumeMounts: - name: ebs - volume mountPath: / data volumes: - name: ebs - volume persistentVolumeClaim: claimName: pvc - 1 nodeSelector: # ap - northeast - 2a에 생성한 pv와 연결하기 위함 az: a - - - apiVersion: v1 kind: Service metadata: name: wordpress labels: app: wordpress spec: type: NodePort ports: - port: 80 nodePort: 30000 selector: app: wordpress tier: frontend Colored by Color Scripter cs
워드프레스에 PVC를 붙여 배포해보겠습니다.
server ip:30000
워드프레스 기본 이미지가 잘 나옵니다.
해당 파드에 들어가 EBS 볼륨이 붙었는지 확인해보겠습니다.
$ kubectl exec -it -- bash
/data 경로에 마운트가 된 것을 확인할 수 있습니다. !!
실습을 해보니 미리 EBS를 생성하고, 같은 지역의 Node에 label을 붙이고 설정하는 것이 번거롭다고 생각했습니다.
그러다가 StorageClass 를 사용하여 PVC를 바로 생성해서 EBS 볼륨, PV가 자동으로 생성하도록 하는 방법이 있다는 것을 찾았습니다. 이 내용에 대해선 다음 편으로 포스팅하겠습니다.
참고
https://kubernetes.io/ko/docs/concepts/storage/persistent-volumes/
https://asvignesh.in/pod-and-persistent-volume-with-existing-ebs-in-eks/
from http://jenakim47.tistory.com/70 by ccl(A) rewrite - 2021-12-23 10:59:06