[쿠버네티스 기초다지기] 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