Ssoon

[2주차] CHAPTER-12 쿠버네티스 공유 파일 스토리지 본문

Production Kubernetes Online Study

[2주차] CHAPTER-12 쿠버네티스 공유 파일 스토리지

구구달스 2023. 3. 14. 20:21
이정훈님이 집필하신 "24단계 실습으로 정복하는 쿠버네티스" 로 진행하는 CloudNet@ 팀의 PKOS 2주차 정리입니다.

✔ OpenEBS, Ceph : 하나의  Pod에서만 사용 가능한 블록 스토리지 (특정 Pod가 Volume을 사용하면 다른 Pod는 해당 Volume을 사용할 수 없습니다)

✔ 파일 스토리지 : 여러 Pod가 동시에 같은 Volume을 사용할 수 있습니다.

✔ 쿠버네티스 환경에서 파일 스토리지 사용 방법 1️⃣비용을 지불하고 사용 외장 시스템을 구축 2️⃣ 클러스터 내부에 파일 스토리지를 구축

✔ 쿠버네티스는 파일 스토리지 역시 StorageClass 를 지정합니다. -> 블록 스토리지와 동일하게 파일 스토리지 용도의 StorageClass를 구축하고 PVC YAML 파일에 Volume을 할당합니다.

✔ 쿠버네티스 클러스터 내부에 파일 스토리지 구축 방법 1️⃣ 특정 Node에 NFS 서버에 설치 2️⃣ Ceph등 분산 파일 시스템에 파일 스토리지 기능 추가 

✅ rook-ceph 이용한 공유 파일 스토리지 설치

✔  앞서 설치한 Ceph 스토리지에 공유파일 스토리지 기능을 추가합니다.

✔ 별도의 CephFilesystem CRD (CustomResourceDefinition) 를 설치합니다.

CephFilesystem CRD 설치되면 스토리지용 StorageClass 생성되고 해당 StorageClass 로 PVC를 생성하고 여러 Pod에 연결합니다.

https://rook.io/docs/rook/v1.9/ceph-filesystem.html

 

Ceph Docs

Shared Filesystem A shared filesystem can be mounted with read/write permission from multiple pods. This may be useful for applications which can be clustered using a shared filesystem. This example runs a shared filesystem for the kube-registry. Prerequis

rook.io

  Ceph 공유 파일스토리지를 설치하는 CephFilesystem CRD YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch12/ceph-filesystem.yml

spec.metadataPool.replicated.size: 3
-> 스토리지 서비스에 필요한 메타데이터를 3개의 복제본에 나눠서 저장
-> Ceph 는 스토리지 서비스를 위한 메타데이터와 실제 데이터가 저장되는 부분이 분리
spec.dataPools.replicated.size: 3
-> 실제 데이터를 3개의 디스크 복제본에 분산해서 저장

💠 CephFilesystem CRD 를 생성합니다.

💠 파일 스토리지 용 StorageClass 를 생성합니다.

  Ceph 공유 파일 스토리지용 StorageClass YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch12/ceph-file-sc.yml

✅ 여러 Pod 에서 동시에 단일 파일 스토리지에 마운트

블록 스토리지를 사용할 때 2개 이상의 Pod가 동시에 마운트하지 못하는 제약 사항을 확인합니다.

  블록 스토리지를 사용하는 PVC YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch12/default-pvc.yml

spec.accessModes.ReadWriteOnce
-> 같은 Node를 사용할 경우 여러 Pod가 마운트할 수 있습니다.
spec.storageClassName: "rook-ceph-block"
-> 블록 스토리지 클래스 지정

  블록 스토리지를 사용하는 PVC를 이용하는 busybox 디플로이먼트 YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch12/date-pvc-deploy.yml

spec.template.spec.volumes.persistentVolumeClaim.claimName: default-pvc
-> 이전에 만든 PVC 이름을 명시

💠 default 네임스페이스로 이동 PVC 와 Deployment 리소스를 생성합니다.

💠 동일한 PCV를 다른 Node의 Pod에서 마운트하는 추가 Deployment 를 배포합니다.

✔ 2개의 Pod가 서로 다른 Node에서 실행하도록 기존 Deployment 파일에 podAntiAffinity 설정 추가

  anti-affinity 속성을 사용하는 디플로이먼트 YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch12/date-pvc-affinity-deploy.yml

✔  이미 다른 Pod에서 해당  Volume을 사용 중이어서 다중연결에러 메시지를 볼 수 있습니다.

✔ 블록 스토리지 액세스 모드는 ReadWriteOnce -> 단일 Pod에서만 읽기/쓰기 가능 -> 다른 Pod에서 같은 Volume을 마운트하면 에러 발생!

👉  블록 스토리지 클래스를 사용하면 서로 다른 Pod 가 동시에 마운트 할 수 없습니다.

💠 파일 스토리지를 이용해 PVC 와 Pod를 생성합니다.

Ceph 파일 스토리지 클래스를 이용하는 PVC YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch12/cephfs-pvc.yml

spec.accessModes.ReadWriteMany
-> 파일 스토리지 액세서모는 여러 Pod에서 읽기/쓰기가 가능한 ReadWriteMany
spec.storageClassName: rook-cephfs
-> Ceph 파일 스토리지 클래스 이용

💠 생성된 PVC를 2개의 busybox Pod에서 사용합니다.

 파일 스토리지에 현재 시간과 호스트네임을 기록하는 busybox YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch12/busybox-pvc-deploy.yml

spec.template.spec.containers.command: "while true; do date >> /mnt/index.html; hostname >> /mnt/index.html; sleep $(($RANDOM % 5 + 5)); echo $'\n' ; done"
-> 2개의 Pod가 같은 시간에 동시에 동일 파일에 쓰는 것을 방지하기 위해 임의의 시간($RANDOM % 5 + 5)
	간격으로 현재 시간(date)과 호스트네임(hostname)을 /mnt/index.html 파일에 저장합니다.
spec.template.spec.volumes.persistentVolumeClaim.claimName: cephfs-pvc
-> 이전에 생성한 파일 스토리지 PVC 이름을 지정

✔ /mnt/index.html 파일에 2개의 busybox 에서 현재 시간과 호스트네임이 기록되는 것을 확인합니다. 

💠 동시에 하나의 파일 스토리지 볼륨을 마운트 하는 5개의 NGINX Pod 를 실행합니다.

NGINX 웹서버 홈 디렉토리를 공동 디렉토리로 사용하는 NGINX YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch12/nginx-homedirectory-deploy.yml

spec.template.spec.containers.volumeMounts.mountPath: /usr/share/nginx/html
-> NGINX 웹서의 홈디렉터리를 해당 볼륨의 마운트 포인트 지정
-> busybox 파드에서 입력하는 현재시간과 호스트네임을 NGINX 홈 디렉터리에 저장
spec.template.spec.volumes.persistentVolumeClaim.claimName: cephfs-pvc
-> busybox에서 사용한 PVC와 동일한 PVC 지정

💠 NGINX 파드를 로드밸런서 타입의 서비스를 사용해 외부에 노출합니다.

 로드밸런서 타입의 NGINX 서비스 YAML

https://raw.githubusercontent.com/wikibook/kubepractice/main/ch12/nginx-loadBalancer-svc.yml

💠 로드밸런서에 접속하여  busybox 파드의 호스트네임과 시간을 NGINX 웹서버에 표시되는 것을 확인합니다.

스토리지 고가용성 테스트

✔ Ceph는 mon Pod가 외부 접속용 클라이언트와 연결해서 스토리지 서비스를 제공합니다.

✔  mon Pod는 N+2 형태로 다중화 구성

💠 Ceph 파일 스토리지를 사용하는 cephfs PVC 와 busybox Pod를 실행합니다.

💠  Pod가 실행중인 ubuntu20-1 Node를 제거(drain)해서 Node에서 실행중인 Pod를 강제 종료합니다.

💠 종료된 Pod가 ubuntu20-3 Node에서 실행됩니다.

👉 Ceph 파일 스토리지는 블록스토리지와 동일하게 분산 파일 시스템을 사용해서 특정 노드가 다운돼도 다른 노드로 이전해서 정상적으로 서비스하는 것이 가능합니다.

💠 Ceph 스토리지를 삭제합니다.

https://rook.io/docs/rook/v1.10/Getting-Started/ceph-teardown/

 

Cleanup - Rook Ceph Documentation

Cleanup Cleaning up a Cluster If you want to tear down the cluster and bring up a new one, be aware of the following resources that will need to be cleaned up: rook-ceph namespace: The Rook operator and cluster created by operator.yaml and cluster.yaml (th

rook.io

✔ 삭제가 잘 안되어 Removing the Cluster CRD Finalizer 참고하여 삭제하였습니다. 

Comments