on
ReadWriteMany 모드에서 포드 전체에서 NFS 영구 볼륨 사용
ReadWriteMany 모드에서 포드 전체에서 NFS 영구 볼륨 사용
반응형
네트워크 파일 공유 또는 NFS는 네트워크를 통해 제공되는 블록 스토리지입니다. 이를 통해 여러 호스트에 동일한 스토리지 리소스를 마운트할 수 있습니다. 다양한 시스템에서 정보를 저장하고 공유할 수 있는 탁월한 선택입니다. 일반적으로 애플리케이션의 여러 인스턴스를 HA 모드로 제공하려는 경우에 유용합니다.
성능 측면에서는 전통적으로 NFS가 SAN 기반 영구 디스크보다 느립니다. 그러나 클라우드에서 관리되는 서비스를 사용할 수 있기 때문에 이 콘은 상당히 많은 부분을 다룹니다. 예를 들어 GCP의 파일스토어를 사용하면 여러 범주의 파일 공유에 대해 다음과 같은 IOP를 제공합니다.
영구 디스크를 살펴보면 다음과 같은 결과가 나타납니다.
두 표를 모두 살펴보면 IOP와 처리량이 두 시나리오 모두에서 비슷하다는 것을 알 수 있습니다. 따라서 관리 NFS 오퍼링을 사용해도 큰 손실을 입지 않을 것입니다.
자, 이제 실습하러 오겠습니다. 새 Google 파일스토어 파일 공유를 만들고 영구 볼륨 리소스를 사용하여 액세스할 것입니다. 그런 다음 영구 볼륨 클레임 리소스를 사용하여 영구 볼륨을 청구합니다. 그런 다음 배포에서 PersistentVolumeClaim을 사용하여 플라스크 애플리케이션의 세 인스턴스를 포드로 실행합니다. 각 포드는 호스트 이름과 특정 애플리케이션에 대한 방문 횟수를 전체적으로 보고합니다. 세 개의 포드 모두 파일 공유 내에서 동일한 파일을 읽고 쓸 수 있습니다. 자, 이제 더 이상 떠들지 말고 전제조건을 살펴보자.
전제조건
연습에는 Google Kubernetes Engine(GKE) 클러스터와 Google Filestore 파일 공유를 사용할 것입니다. 따라서 당연히 GCP 계정이 필요합니다. 좋은 소식은 아직 등록하지 않았다면 3개월 동안 GCP 무료 평가판을 등록할 수 있다는 것입니다.
또한 연습을 위해 이 저장소를 포크하고 복제한 다음 CD를 저장해야 합니다. 이제 다음 단계로 GKE 클러스터를 생성해 보겠습니다.
GKE 클러스터 만들기
GKE 클러스터를 만들려면 다음 명령을 사용합니다.
$ gcloud container clusters create cluster-1 --zone us-central1-a
몇 분 정도 소요되며 GKE 클러스터를 가동하고 실행해야 합니다. 다음으로 파일스토어 인스턴스를 만들어야 합니다.
파일스토어 인스턴스 만들기
데모에 불과하므로 3TB 용량의 표준 계층 파일스토어 인스턴스를 만들 것입니다. 사용 사례 및 성능 요구사항에 맞는 계층을 사용할 수 있습니다.
파일스토어를 만들려면 다음 명령을 사용합니다.
$ gcloud filestore instances create cluster-1-fs --location us-central1-a --tier STANDARD --file-share=name="cluster_1_fs",capacity=3T --network=name=default
보시는 바와 같이, 파일스토어가 만들어집니다. 자, 이제 쿠버네테스 자원을 만들어 봅시다.
Kubernetes 리소스 만들기
먼저 우리가 만든 파일 공유를 가리키는 영구 볼륨을 만들고 이를 주장하기 위해 영구 볼륨 클레임을 만들어야 합니다.
영구 볼륨 및 클레임 생성
그러기 전에 파일 공유 사이트에서 자세한 정보를 얻어야 해요. 다음 명령을 사용하여 나열해 보겠습니다.
$ gcloud filestore instances list
그런 다음 PersistentVolume 규격에서 이러한 세부 정보를 사용할 수 있습니다. 또한 사용할 영구 볼륨 클레임 리소스를 사용하여 영구 볼륨을 클레임해야 합니다. 두 가지를 모두 합치면 다음과 같은 매니페스트를 얻을 수 있습니다.
PersistentVolume 사양 섹션에서 다음을 정의했습니다.
용량은 3TB입니다. 이 크기는 처음에 파일스토어 인스턴스를 만들 때 지정한 크기입니다.
accessModes 섹션에는 ReadWriteMany가 있으며, 이는 이 영구 볼륨에서 여러 포드가 동시에 읽고 쓸 수 있음을 의미합니다.
nfs 섹션에는 파일 공유 이름 및 서버가 포함된 경로가 있으며, 파일 공유 이름에는 파일스토어 IP_ADDRESS가 포함되어야 합니다. 자리 표시자를 그것으로 교체합니다.
PersistentVolumeClaim 규격 섹션은 다음을 정의합니다.
ReadWriteMany로 설정된 액세스모드
storageClassName이 "으로 설정되었습니다. 기본 storageClass를 사용하지 않고 대신 사용자 지정 PersistentVolume을 할당하려고 합니다.
volumeName이 filesserver-pv로 설정됩니다. 그러면 PersistentVolumeClaim이 정의된 PersistentVolume에 매핑됩니다.
또한 3TB의 리소스를 요청하고 있습니다.
이제 다음 명령을 사용하여 매니페스트를 적용하겠습니다.
$ kubectl apply -f fileserver-pvc.yaml
보시다시피 영구 볼륨을 사용할 수 있으며 영구 볼륨 클레임에 바인딩되어 있습니다. 따라서 이제 애플리케이션을 배포할 수 있습니다.
응용 프로그램 배포
응용 프로그램은 방문 횟수를 반환하는 간단한 Python Flask 앱입니다. 다음은 app.py 파일입니다.
우리가 코드에서 볼 수 있듯이, 그것은 파일 /데이터/카운트로부터 최근의 방문 횟수를 읽으려고 시도하고, 숫자를 1씩 증가시키며, 업데이트된 값으로 파일을 쓰는 것과 함께 값을 반환한다. 여러 인스턴스가 파일을 동시에 수정하지 않도록 쓰기 기능에 잠금, 수정 및 잠금 해제 패턴이 표시됩니다.
이제 이 애플리케이션은 이미 DockerHub에서 구축되어 사용할 수 있습니다. 따라서 다음 매니페스트를 사용하여 배포할 것입니다.
매니페스트는 배포 리소스와 서비스 리소스로 구성됩니다. 배포 리소스는 애플리케이션의 복제본 3개를 실행하며, 모든 복제본은 파일 서버-pvc PersistentVolumeClaim을 사용합니다. 즉, 모든 포드 복제본이 동일한 파일 시스템에서 동시에 읽고 쓸 수 있습니다.
서비스 리소스는 로드 밸런서의 포트 80에 앱을 노출하기만 합니다. 따라서 로드 밸런서 IP 주소를 사용하여 외부에서 서비스를 검색할 수 있어야 합니다.
이제 다음 명령을 사용하여 매니페스트를 적용하겠습니다.
$ kubectl apply -f app-deployment.yam
이제 포드가 실행 중이며 서비스에 외부 IP가 있으므로 테스트해 볼 수 있습니다.
배포 테스트
Curl을 사용하여 서비스의 외부 IP를 타격할 것이며, 로드 밸런스가 3개의 포드 간에 거의 동일하게 이루어지는 것을 볼 수 있습니다. 우리는 또한 히트가 가는 Pod에 관계없이 모든 히트에 대한 방문 카운터가 증가하는 것을 보아야 한다.
다음 명령을 사용하여 서비스를 시작하겠습니다.
$ curl
보시는 바와 같이, 엔드포인트를 10번 쳤을 때, 매번 히트할 때마다 카운트가 1씩 증가한다는 것을 알 수 있습니다. 동시에 반응이 서로 다른 포드로부터 온다는 것도 알 수 있습니다. 즉, 세 개의 포드 모두 파일 공유에서 동일한 진실 출처를 언급하고 있습니다. 즉, ReadWriteMany 모드 PVC가 작동합니다.
결론
ReadWriteMany PVC를 위한 NFS로 Google Filestore와 같은 관리 서비스를 사용하는 것은 특히 애플리케이션 설계를 복잡하게 하지 않고 사용자 환경에서 HA 구성이 필요한 경우 매우 뛰어난 성능 옵션입니다.
읽어줘서 고마워! 기사를 재미있게 보셨기를 바랍니다!
from http://devcloset.tistory.com/406 by ccl(A) rewrite - 2021-09-22 09:01:00