GitHub

https://github.com/Choidongjun0830

클라우드

Kubernetes Volumes

gogi masidda 2024. 10. 12. 01:02

기초 용어

  • Drive: 저장 장치
  • Volume: Logical한 Drive. Drive를 논리적으로 쪼개서 만들어짐. Kubernetes에서 컨테이너가 데이터를 읽고 쓸 수 있는 공간
    • Pod 중에서 어떤 것은 Storage가 필요할 수도 있다. 
      • => Storage를 이용 가능하게 Pod에 Volume을 붙여준다. (Mount Volume)
    • Pod는 하나 이상의 Container로 구성되어 있고, 이 컨테이너들 간에 데이터를 주고 받으려면, Volume을 사용해 Storage를 연결해야 한다. 

emptyDir, hostPath

  • emptyDir
    • 임시적인 Volume. 캐시나 로그 등 임시 데이터를 저장하는데 쓰인다.
    • Pod가 죽었다가 살아나면 사라진다.
  • hostPath
    • Pod 내에 Volume을 만드는게 아니라, Node의 파일 시스템을 볼륨으로 만들어서 이것을 Pod(Container)에 마운트 시켜주는 것이다.
      • Node의 Life Cycle에 영향을 받는다.
        • Node가 죽었다 살아나면 사라진다.
  • 그래서 보통 Remote Storage를 사용해서, 더 안정적인 PV와 PVC, StorageClass를 사용한다.

Storage Requirement

  • Storage는 Pod의 Life Cycle에 영향을 받지 않아야 한다.
  • Storage는 모든 Node에서 접근 가능해야 한다.
    • Pod를 Deploy할 때, scheduler가 어느 노드에 돌릴지 결정하니까.
    • Pod가 죽었다가 살아날 때 같은 Node에서 실행되는게 아니니까.
  • Storage는 Cluster가 crash가 나도 살아남아야 한다.
    • Pod가 동작하는 Cluster 말고 다른 곳에 있어야 한다.
    • Pod와 Storage는 다른 곳에 두어야 한다. 

PersistentVolume, PersistentVolumeClaim

  • 엔지니어가 PV를 만들면, Volume 사용자가 PVC로 PV를 사용하겠다고 한다.
  • PersistentVolume은 어느 namespace에도 속해있으면 안된다. 모든 노드가 접근 가능해야 하니까.
  • PersistentVolumeClaim은 그것을 사용할 Pod와 같은 네임스페이스에 있어야 한다.
  • PVC에서 사용자는 필요한 스토리지의 크기와 접근 방식을 명시하면, K8S가 알아서 적절한 PV와 연결해준다. 
  • PVC는 PV와 연결되어야만 사용할 수 있다.
# PV yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv-3
spec:
  capacity:
    storage: 3Gi
  accessModes:
  -ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  local:
    path: /tmp
  nodeAffinity:
    required:
      nodeSelectorTerms:
      -matchExpressions:
         key: kubernetes.io/hostname
         operator: In
         value: 
           hostname

 

# PVC yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc-2
  namespace: a
spec:
  resources:
    requests:
      storage: 2Gi
  accessModes:
  -ReadWriteOnce

 

# Pod yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod-a
  namespace: a
spec:
  containers:
  -name: test-container
   image: kubetm/init
   volumeMounts:
     name: test-pvc
     mountPath: /test
  volumes:
    name: test-pvc
    persistentVolumeClaim:
    -claimName: test-pvc-2
  • volumeMounts:
    • mountPath:
      • 이를 통해 container가 volume을 갖게 된다.

StorageClass

PVC를 만들었는데 적절한 PV가 없으면 PVC를 사용하지 못함. 그러면 엔지니어가 PV를 빨리 만들어야 하는데, 이는 너무 번거롭고 비효율적임. 그래서 PVC를 만들면 동적으로 PV가 만들어지게 하는 것이 StorageClass.

 

# StorageClass yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: storage-class-name
provisoner: kubernetes.io/aws-ebs
parameters:
  type: io1
  iopsPerGB: "10"
  fsType: ext4

 

# PVC yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
   -ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: storage-class-name

PVC의 storageClassName 필드에 미리 만들어둔 StorageClass의 name을 적어 동적으로 요청한다.


Secret, ConfigMap

  • 이 두가지는 누구나 써야하는, 무조건 있어야 하는 특별한 용도의 Volume이다.
  • Secret과 ConfigMap은 만들지 않아도 자동으로 존재한다.
  • Secret
    • 민감한 데이터를 저장하고 관리하는 데 사용된다.
    • 예를 들어, 패스워드, API 키, 인증서 같은 데이터를 Secret에 저장하여, 애플리케이션이 안전하게 해당 데이터를 참조할 수 있게 한다.
    • Secret은 일반적으로 base64로 인코딩되며, 클러스터 내에서 접근 제어를 통해 보호된다.
  • ConfigMap
    • 민감하지 않은 설정 데이터를 저장하는 데 사용된다.
    • 예를 들어, 환경 변수, 구성 파일, 커맨드라인 옵션 등을 관리할 수 있으며, 애플리케이션이 이를 참조하여 동작 방식을 제어할 수 있다.
728x90

'클라우드' 카테고리의 다른 글

Kubernetes Principles  (0) 2024.10.15
K8S 네트워킹  (1) 2024.10.11
Deployment 리소스 생성시 흐름  (0) 2024.10.10
Kubernetes Basic - 2  (2) 2024.10.08
Restful API  (1) 2024.10.06