kubernetes의 볼륨과 스케일링

박상태·2024년 9월 2일
0
post-thumbnail

개요

파드는 교체될 때 파드가 지니고 있던 데이터를 모두 잃어버리게 됩니다.
만약 해당 파드가 대형 결제 시스템을 실행 중인데 파드가 고장나 데이터를 모두 잃어버리게 됐다면 그 손실액은 어마어마 할 것입니다.
그렇기 때문에 어떤 파드라도 동일하게 접근할 수 있는 데이터 저장소는 필수입니다.

동일한 애플리케이션이 돌아가는 파드를 레플리카라고 합니다.
레플리카를 이용하여 일부가 고장이 나도 나머지는 정상 동작하여 가용성을 확보할 수 있습니다.

이처럼 쿠버네티스에는 데이터 저장 방식인 볼륨과 파드를 늘리는 스케일링이 있습니다.

컨테이너 파일 시스템

컨테이너 이미지는 파일 시스템의 초기 내용을 제공합니다.
기록 가능한 레이어는 컨테이너에서 수정된 파일을 저장하며, 컨테이너의 수명과 동일한 생애 주기를 가집니다.
컨테이너가 재시작되면 데이터가 유실될 수 있습니다.

볼륨(Volume)

EmptyDir: 파드와 동일한 수명 주기를 가지는 빈 디렉터리 볼륨입니다. 파드가 재시작되어도 데이터는 유지되지만, 파드가 대체되면 초기화됩니다.
HostPath: 노드의 특정 디렉터리를 파드에 마운트하는 볼륨입니다. 파드가 동일한 노드에서 실행될 경우 데이터를 유지할 수 있습니다. 그러나 컨테이너에서 명령을 실행할 수 있게 된다면 노드의 디스크 전체를 장악할 수 있다는 보안 문제가 발생할 수 있습니다.

영구볼륨과 클레임

PersistentVolume (PV): 쿠버네티스에서 사용 가능한 스토리지를 정의한 리소스입니다. 다양한 스토리지 시스템(NFS, Azure Files 등)을 지원합니다.
PersistentVolumeClaim (PVC): 파드에서 사용할 스토리지를 요청하는 리소스입니다. PVC가 PV와 연결되어야 파드에서 스토리지를 사용할 수 있습니다.

동적 볼륨 프로비저닝

동적 볼륨 프로비저닝: PVC만 작성하면 그에 맞는 PV를 클러스터에서 자동으로 생성해주는 방식입니다. 이는 관리의 편리성을 높입니다.

스토리지 유형 정의

Provisioner: PV를 생성하는 주체를 정의합니다.
ReclaimPolicy: PV가 사용되지 않을 때 처리 방법을 지정합니다.
VolumeBindingMode: PVC 생성 시점에 PV를 바로 생성할지, 파드 생성 시에 생성할지를 결정합니다.

스케일링

쿠버네티스에서의 스케일링은 애플리케이션의 가용성과 처리 능력을 높이기 위해 중요한 과정입니다. 스케일링은 주로 레플리카셋(ReplicaSet)을 통해 이루어지며, 디플로이먼트(Deployment)가 이를 관리합니다. 디플로이먼트는 여러 개의 레플리카셋을 관리할 수 있으며, 스케일링 시 레플리카셋의 수를 조정해 파드의 개수를 늘리거나 줄입니다.

레플리카셋과 주요 용어 관계

파드(Pod): 쿠버네티스에서의 기본 컴퓨팅 단위로, 애플리케이션 컨테이너가 실행됩니다.
컨트롤러: 파드를 관리하는 리소스로, 디플로이먼트와 레플리카셋이 여기에 속합니다.
디플로이먼트: 레플리카셋을 관리하는 상위 컨트롤러로, 애플리케이션의 업데이트 및 스케일링을 지원합니다.
레플리카셋: 파드를 직접 관리하며, 정의된 레플리카 수에 맞춰 파드를 생성하거나 삭제합니다.

스케일링 방식

디플로이먼트 스케일링: 디플로이먼트 정의에서 레플리카 수를 변경하거나, kubectl scale 명령어를 사용해 스케일링할 수 있습니다. 스케일링 시 기존 레플리카셋의 파드 수가 조정됩니다. 만약 파드의 정의가 변경되면, 기존 레플리카셋은 대체되고 새로운 레플리카셋이 생성됩니다.

데몬셋(DaemonSet) 스케일링:

데몬셋: 모든 노드에서 단일 파드가 실행되도록 관리하는 리소스.
주로 인프라 관련 작업, 예를 들어 노드에서 데이터를 수집해 중앙 모듈로 전달하는 역할에 사용.
각 노드에 리버스 프록시(예: Nginx)를 배치하는 데 적합.
데몬셋의 동작 방식
데몬셋은 모든 노드에서 파드를 하나씩 실행하며, 노드가 추가되면 해당 노드에도 파드를 생성.
노드가 제거되거나 파드가 삭제되면 데몬셋이 자동으로 대체 파드를 생성하여 노드마다 파드가 유지되도록 함.
특정 노드에만 파드를 실행하도록 설정할 수 있으며, 이를 위해 nodeSelector를 사용해 특정 레이블을 가진 노드를 지정.
데몬셋을 통해 각 노드에서 일관된 작업이 수행되도록 하며, 이러한 설정과 관리 방법은 시스템의 안정성과 효율성을 높이는 데 중요한 역할을 합니다.

쿠버네티스 객체 간 오너십

컨트롤러 리소스: 레이블 셀렉터를 이용해 관리할 리소스를 결정.
관리되는 리소스는 자신을 관리하는 컨트롤러 리소스의 정보를 메타데이터에 기록.
컨트롤러 리소스가 삭제되면, 가비지 컬렉터가 관리 주체가 없는 리소스를 자동으로 제거.

추가 사항

레플리카셋의 재사용: 디플로이먼트가 생성한 파드는 정의된 템플릿의 해시 값에 따라 이름이 결정됩니다. 동일한 정의로 스케일링하면 기존 레플리카셋이 재사용됩니다.

서비스와 로드밸런싱: 쿠버네티스 서비스는 파드에 트래픽을 분배하여 로드밸런싱을 수행합니다. 클러스터 외부 트래픽은 로드밸런서 서비스가 처리하며, 내부 통신은 클러스터 IP 서비스가 담당합니다.

볼륨 공유 문제: 여러 파드가 동일한 볼륨을 사용할 때 동시성 문제가 발생할 수 있습니다. 특히 캐시 볼륨을 사용하는 경우, 파드 간 데이터 불일치가 생길 수 있습니다.

호스트경로 볼륨: 같은 노드에서 실행되는 파드는 호스트경로 볼륨을 공유할 수 있습니다. 하지만 이 방법은 동시성 문제가 발생할 수 있으므로 주의가 필요합니다.

정리

이 내용을 통해 Kubernetes에서 스토리지와 볼륨을 어떻게 관리하고 활용할 수 있는지 이해할 수 있습니다.
또한, 쿠버네티스의 스케일링은 다양한 방식으로 이루어지며, 각 방식은 특정 요구사항을 만족시키기 위해 사용됩니다. 이를 통해 높은 가용성과 안정성을 유지하면서 애플리케이션을 관리할 수 있습니다

profile
노력하고 성장하는 개발자입니다.

0개의 댓글