728x90
해당 포스팅은 "쿠버네티스 인 액션"을 공부하고 정리한 글입니다. 모든 내용은 해당 도서를 기준으로 합니다.
⬛ 6장 볼륨:컨테이너에 디스크 스토리지 연결
◼️ 6.1 볼륨 소개
볼륨
- 파드의 구성 요소로 컨테이너와 동일하게 파드 스펙에서 정의됨.
- 독립적인 쿠버네티스 오브젝트가 아니므로 자체적으로 생성, 삭제될 수 없음.
- 파드의 모든 컨테이너에서 사용 가능하지만 접근하려는 컨테이너에서 각각 마운트 돼야 함.
- 각 컨테이너는 잘 정의된 단일 책임을 가지고 있지만 각각 컨테이너 자체만으로는 큰 쓸모가 없음.
- 세 컨테이너 간에 디스크 스토리지를 공유하지 않는 파드를 생성하는 것은 의미가 없음.
- 세 개의 컨테이너 구성에 볼륨이 없다면 파드는 아무런 동작을 하지 않음.
- 볼륨 두 개를 파드에 추가하고 세 개의 컨테이너 내부의 적절한 경로에 마운트 하면 위와 같이 부분의 합보다 더 나은 시스템이 생성됨.
▪️ 6.1.2 사용 가능한 볼륨 유형 소개
- emptyDir : 일시적인 데이터를 저장하는 데 사용되는 간단한 빈 디렉터리
- hostPath : 워커 노드의 파일 시스템을 파드의 디렉터리로 마운트 하는데 사용
- gitRepo : 깃 레포지터리의 콘텐츠를 체크아웃 해 초기화 한 볼륨
- nfs : NFS 공유를 파드에 마운트
- gcePersistentDisk, awsElasticBlock, azureDisk : 클라우드 제공자의 전용 스토리지를 마운트 하는데 사용
- persistentVolumeClaim : 사전에 혹은 동적으로 프로비저닝 된 퍼시스턴트 스토리지를 사용하는 방법
◼️ 6.2 볼륨을 사용한 컨테이너 간 데이터 공유
▪️ 6.2.1 emptyDir 볼륨 사용
emptyDir
- 볼륨이 빈 디렉터리로 시작됨.
- 파드에 실행 중인 애플리케이션은 어떤 파일이든 볼륨에 쓸 수 있음.
- 볼륨의 라이프사이클이 파드에 묶여 있으므로 파드가 삭제되면 콘텐츠는 사라짐.
- 동일 파드에서 실행 중인 컨테이너 간 파일을 공유할 때 유용함.
- 임시 데이터를 디스크에 쓰는 목적인 경우 사용.
- 가장 단순한 볼륨의 유형이지만 다른 유형들도 이 볼륨을 기반으로 함.
- 파드는 컨테이너 두 개와 각 컨테이너에 각기 다른 경로로 마운트 된 단일 볼륨을 가짐.
- html-generator 컨테이너가 시작하면 매 10초마다 fortune 명령의 결과를 /var/htdocs/index.html에 쓰기 시작
- web-server 컨테이너가 시작하자마자 컨테이너는 /usr/share/nginx/html 디렉터리의 HTML 파일을 서비스하기 시작함.
▪️ 6.2.2 깃 리포지터리를 볼륨으로 사용하기
- 기본적으로 emptyDir 볼륨이며 파드가 시작되면 깃 리포지터리를 복제하고 특정 리비전을 체크아웃 해 데이터로 채움.
- 깃 리포지터링 웹사이트의 정적 HTML 파일을 저장하고 gitRepo 볼륨과 웹 서버 컨테이너를 가진 파드를 생성할 수 있음.
- 단점은 gitRepo에 변경을 푸시할 때 마다 웹사이트의 새 버전을 서비스하기 위해 파드를 삭제해줘야 한다는 점임.
◼️ 6.3 워커 노드 파일시스템의 파일 접근
특정 시스템 레벨의 파드는 노드의 파일을 읽거나 파일 시스템을 통해 노드 디바이스를 접근하기 위해 노드의 파일 시스템을 사용해야 함.
쿠버네티스는 hostPath 볼륨으로 가능케 함.
▪️ 6.3.1 hostPath 볼륨 소개
- 노드 파일 시스템의 특정 파일이나 디렉터리를 가리킴.
- 동일 노드에 실행 중인 파드가 hostPath 볼륨의 동일 경로를 사용 중이면 동일한 파일이 표시 됨.
- hostPath 볼륨의 콘텐츠는 파드가 종료 되어도 삭제되지 않음.
- 파드가 삭제되면 다음 파드가 호스트의 동일 경로를 가리키는 hostPath 볼륨을 사용함.
- hostPath 볼륨을 자체 데이터를 저장하기 위한 목적으로 사용하지 않음.
- 단지 노드 데이터에 접근하기 위해 사용함.
◼️ 6.4 퍼시스턴트 스토리지 사용
▪️ 6.4.2 기반 퍼시스턴트 스토리지로 다른 유형 볼륨 사용하기
NFS 볼륨
- 클러스터가 여러 대의 서버로 실행되는 경우 외장 스토리지를 볼륨에 마운트하기 위한 다양한 지원 옵션이 제공 됨.
- 그 예로 NFS가 있음.
◼️ 6.5 기반 스토리지 기술과 파드 분리
퍼시스턴트 볼륨 유형은 파드 개발자가 실제 네트워크 스토리지 인프라스트럭처에 관한 지식을 갖춰야 함.
NFS 기반의 볼륨을 생성하려면 개발자는 NFS 익스포트가 위치하는 실제 서버를 알아야 함.
▪️ 6.5.1 퍼시스턴트 볼륨과 퍼시스튼트 볼륨 클레임 소개
세부사항을 처리하지 않고 애플리케이션이 쿠버네티스 클러스터에 스토리지를 요청할 수 있도록 하기 위해 새로운 리소스 두개가 도입됨.
- PV(Persistent Volume)
- PVC(Persistent Volume Claim)
- 개발자가 파드에 기술적인 세부 사항을 기재한 볼륨을 추가하는 대신 클러스터 관리자가 기반 스토리지를 설정하고 쿠버네티스 API 서버로 퍼시스턴트 볼륨 리소스를 생성해 쿠버네티스에 등록함.
- 퍼시스턴트볼륨이 생성되면 관리자는 크기와 지원 가능한 접근 모드를 지정함.
- 클러스터 사용자가 파드에 퍼시스턴트 스토리지를 사용해야 하면 먼저 최소 크기와 필요한 접근 모드를 명시한 퍼시스턴트볼륨클레임 매니페스트를 생성함.
- 그 후 사용자는 퍼시스턴트볼륨클레임 매니페스트를 쿠버네티스 API 서버에 게시하고 쿠버네티스는 적절한 퍼시스턴트볼륨을 찾아 클레임에 볼륨을 바인딩 함.
- 이후 퍼시스턴트볼륨클레임은 파드 내부의 볼륨 중 하나로 사용될 수 있음.
▪️ 6.5.2 퍼시스턴트볼륨 생성
- 관리자는 쿠버네티스에게 용량이 얼마가 되는지 단일 노드나 동시에 다수 노드에 읽기나 쓰기가 가능한지 여부를 알려야 함.
- 쿠버네티스에게 퍼시스턴트볼륨이 해제되면 어떤 동작을 해야 할지 알려야 함.
- 퍼시스턴트볼륨을 지원하는 실제 스토리지의 유형, 위치, 그 밖의 속성 정보를 지저해야 함.
▪️ 6.5.3 퍼시스턴트볼륨클레임 생성을 통한 퍼시스턴트볼륨 요청
- 파드가 재스케줄링되더라도 동일한 퍼시스턴트볼륨클레임이 사용 가능한 상태로 유지되기를 원하므로 퍼시스턴트볼륨에 대한 클레임은 파드를 생성하는 것과 별개의 프로세스임.
퍼시스턴트볼륨클레임 생성하기
- 퍼시스턴트볼륨클레임이 생성되자마자 쿠버네티스는 적절한 퍼시스턴트볼륨을 찾고 클레임에 바인딩 함.
- 퍼시스턴트볼륨의 용량은 퍼시스턴트볼륨클레임의 요청을 수용할 만큼 충분히 커야 함.
▪️ 6.5.4 파드에서 퍼시스턴트볼륨클레임 사용하기
▪️ 6.5.5 퍼시스턴트볼륨과 퍼시스턴트볼륨클레임 사용의 장점 이해하기
▪️ 6.5.6 퍼시스턴트볼륨 재사용
- 파드와 퍼시스턴트볼륨클레임을 삭제해도 이미 볼륨을 사용했기 때문에 데이터를 가지고 있으므로 클러스터 관리자가 볼륨을 완전히 비우지 않으면 새로운 클레임에 바인딩할 수 없음.
- 쿠버네티스에 persistentVolumeClaimPolicy를 Retain으로 설정하면 퍼시스턴트볼륨이 이러한 동작을 할 수 있음.
- Recycle은 볼륨의 콘텐츠를 삭제하고 볼륨이 다시 클레임될 수 있도록 볼륨을 사용 가능하게 만듦.
- Delete 정책은 기반 스토리지를 삭제함.
◼️ 6.6 퍼시스턴트볼륨의 동적 프로비저닝
클러스터 관리자는 실제 스토리지를 미리 프로비저닝해두야 함.
다행히 쿠버네티스는 퍼시스턴트 볼륨의 동적 프로비저닝을 통해 이 작업을 자동으로 수행할 수 있음.
▪️ 6.6.1 스토리지클래스 리소스를 통한 사용 가능한 스토리지 유형 정의하기
사용자가 퍼시스턴트볼륨클레임을 생성하면 결과저긍로 새로운 퍼시스턴트볼륨이 프로비저닝되므로 관리자는 하나 혹은 그 이상의 스토리지 클래스 리소스를 생성해야 함.
- 스토리지 클래스 리소스는 퍼시스턴트볼륨클레임이 스토리지클래스에 요청할 때 어떤 프로비저너가 퍼시스턴트볼륨을 프로비저닝하는 데 사용돼야 할지를 지정함.
▪️ 6.6.2 퍼시스턴트볼륨클레임에서 스토리지 클래스 요청하기
- 스토리지 클래스 리소스가 생성되면 사용자는 퍼시스턴트볼륨클레임의 이름에 스토리지클래스를 참조할 수 있음.
- 클러스터 관리자는 성능이나 기타 특성이 다른 여러 스토리지 클래스를 생성할 수 있음.
- 개발자는 생성할 각 클레임에 가장 적합한 스토리지 클래스를 결정함.
- 스토리지클래스의 좋은 점은 클레임 이름으로 이를 참조한다는 사실임.
- 다른 클러스터 간 스토리지 클래스 이름을 동일하게 사용하면 PVC 정의를 다른 클러스터로 이식이 가능함.
스토리지 클래스를 지정하지 않고 퍼시스턴트볼륨클레임 생성하기
storageClassName 속성을 지정하지 않고 PVC를 생성하면 구글 쿠버네티스 엔진에서는 pd-standard 유형의 GCE 퍼시스턴트디스크가 프로비저닝 됨.
728x90