[쿠버네티스 기초다지기] 06장 - 스토리지와 스테이트풀 애플리케이션 실행


06장 스토리지와 스테이트풀 애플리케이션 실행퍼시스턴트 스토리지

  • 볼륨은 컨테이너 바깥에 존재
  • 중요한 데이터를 저장할 수 있도록 함
  • 파드 수준의 볼륨은 동일 파드내에서 동일한 애플리케이션 스택으로 구성된 컨텐이너들이 서로 데이터를 공유할 수 있다.

임시 디스크

  • emptydir 볼륨 사용
    • 더 높은 성능을 위해 노드 머신 자체의 스토리지 볼륨이나 RAM 디스크 옵션과 함께 사용 가능
    • 파드가 제거되면 데이터 손실 됨
    • 머신 재부팅하면 RAM 타입 디스크에 있는 데이터는 모두 지워짐
apiVersion: v1
kind: Pod
metadata:
  name: memory-pd
spec:
  containers:
  - image: nginx:latest
    ports:
    - containerPort: 80
    name: memory-pd
    volumeMounts:
    - mountPath: /memory-pd
      name: memory-volume
  volumes:
  - name: memory-volume
    emptyDir:
      medium: Memory
  • 컨테이너 내부 스토리지 확인
kubectl exec memory-pd -- ls -lh | grep memory-pd

클라우드 볼륨

  • GCE 퍼시스턴트 디스크
    • GCP -> Compute Engine -> 디스크 -> 디스크 만들기
    • 여러 머신에 마운팅 가능
      • 볼륨은 읽기 전용 모드만 가능

그 밖의 스토리지 옵션

  • nfs
    • 네트워크 파일 공유(NFS)를 마운트 할 수 있게 해주며, 인프라 전체에 걸친 데이터 퍼시스트와 공유에 유용하게 사용 가능
  • gitrepo
    • 깃 저장소를 새로운 빈(empty) 폴더로 복제

PersistentVolume과 StorageClass

  • PersistentVolume, PersistentVolumeClaim
    • 애플리케이션에 지정하고 요청할 수 있는 방법 제공
  • PersistentVolume
    • 관리자에 의해 제공
    • 특정 파드에 종속되지 않는다.
    • PersistentVolumeClaim을 사용해 파드가 청구 가능
  • PersistentVolumeClaim
    • 필요한 스토리지의 세부 정보 지정
    • 액세스 유형
      • ReadWriteOnce : 한 노드에 의한 읽기 및 쓰기
      • ReadOnlyMany : 여러 노드에 의한 읽기 전용
      • ReadWriteMany : 여러 노드에 의한 읽기 및 쓰기
    • 스토리지 크기 정의 가능
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: demo-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: "solidstate"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      release: "aws-storage"

스테이트풀셋

  • 스테이트풀 데이터를 포함하는 애플리케이션 배포에 일관성과 예측 가능성 제공
  • 네트워크 액세스와 스토리지 청구를 위해 번호가 지정된 네이밍 제공
    • 일관성 있는 네이밍 지원
  • “셋의 이름”-N : N은 0부터 레플리카의 개수
  • 쿠버네티스가 특정 파드에 네트워크 이름과 persistentVolume을 연관짓는 방법 제공
ex)
db-0
db-1
db-2
  • 파드 생성 및 종료를 명령하는 역할도 함
    • 파드는 0에서 N으로 시작되고 N에서 0으로 종료 됨

스테이트풀 예제

  • StorageClass 생성해서 사용
  • 구글 클라우드 퍼시스턴트 프로비저너에 연결할 수 있게 해준다.

SSD 드라이브 StorageClass 생성

kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: solidstate
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd
  zone: us-west1-a

스테이트풀셋 생성

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: whaleset
spec:
  serviceName: sayhey-svc
  replicas: 3
  template:
    metadata:
      labels:
        app: sayhey
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: sayhey
        image: jonbaier/httpwhalesay:0.2
        command: ["node", "index.js",  "Whale it up!."]
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
      annotations:
        volume.beta.kubernetes.io/storage-class: solidstate
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

스테이트풀셋과 파드 조회

kubectl get statefulsets
kubectl get pods

PersistentVolume 조회 - StatefulSet이 각 파드에 생성하고 청구한 볼륨 확인

kubectl get pv

PersistentVolumeClaim 조회 - 각 파드에 볼륨을 예약 확인

kubectl get pvc