연재 시리즈

pkos 스터디 2주차 1편 - AWS volume 사용 원리

악분 2023. 3. 18. 01:20
반응형

이 글은 쿠버네티스에서 AWS volume을 사용하는 원리와 방법을 설명합니다. 저는 kops를 이용하여 쿠버네티스를 설치했습니다.

 

동작원리

커스텀 쿠버네티스 controller을 만들어 AWS volume을 생성/수정/삭제를 관리합니다. 예를 들어 AWS EBS Controller는 pod가 AWS EBS volume가 생성 요청하면, AWS API를 사용하여 volume을 생성합니다.

 

AWS volume이 생성되면, kubelet이 pod에 AWS volume을 연결합니다. 각 노드에 EBS daemonset pod가 kubelet과 함께 AWS volume을 pod에 연결합니다.

 

위 그림은 놀랍게도 chatgpt가 그려준 겁니다. mermaid라는 언어를 사용해서 chatgpt에게 관계도를 그려달라고 부탁했습니다. 답변 일부분을 수정했습니다.

 

쿠버네티스 리소스로 AWS volume 설정

CSI controller와 CSI node가 있으면 쿠버네티스에서 AWS volume을 사용할 준비가 되었습니다. storeageclass를 이용하면 쿠버네티스 리소스로 AWS volume을 정의할 수 있습니다.

# storageclass
kind: StorageClass
metadata:
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
  name: kops-csi-1-21
parameters:
  encrypted: "true"
  type: gp3
provisioner: ebs.csi.aws.com
...

 

pod가 AWS volume을 사용하려면 persistent volume과 persistent volume claim을 사용하면 됩니다. 단, storeageclass를 설정해줘야 합니다.

# pvc 예
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-claim
spec:
  storageClassName: kops-csi-1-21
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
  ...

 

그림으로 쿠버네티스 리소스 관계를 정리해볼까요? chatgpt에게 시각화를 부탁해봤습니다!

 

mermaid라는 언어를 사용해서 chatgpt에게 관계도를 그려달라고 부탁했습니다.

 

실습

EBS controller를 이용하여, pod가 AWS volume을 사용하는 예제를 실습합니다.

 

설치

kubectl get pod -n kube-system -l app.kubernetes.io/instance=aws-ebs-csi-driver

 

그리고 storeageclass도 자동으로 생성됩니다.

kubectl get sc

 

EBS 타입에 맞게 스토리지 클래스를 선택하여 사용하면 됩니다. 타입은 parameters필드에 정의되어 있습니다.

kubectl describe sc kops-csi-1-21 | grep Parameters
kubectl describe sc kops-ssd-1-17 | grep Parameters

 

pvc생성

pvc를 생성합니다.

kubectl apply -f pvc.yaml

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi

 

pvc를 조회하면 Pending상태에 있습니다. 아직 연결된 pod가 없기 떄문입니다. 그리고 storageclass를 설정하지 않았으므로 default storeageclass를 사용합니다.

 

pod생성

pvc를 사용하는 pod를 생성합니다.

kubectl apply -f pod.yaml

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  terminationGracePeriodSeconds: 3
  containers:
  - name: app
    image: centos
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: ebs-claim

 

pod생성 후 pvc를 보면 상태가 Bound로 변경되었습니다. pv를 생성하지 않았는데 pv에 Bound되었습니다. EBS storageclass는 pvc사용 요청이 오면 pv를 만드는 동적 프로비저닝을 지원하기 때문입니다.

kubectl get pvc

 

pvc가 Bound상태로 변하면 pv가 생성됩니다.

kubectl get pv

 

pv의 storeageclass가 EBS이므로 AWS EBS가 생성됩니다. EC2 대시보드에서 node Instance volume을 확인해보세요. 쿠버네티스 pv와 연결된 EBS volume이 보입니다.

 

용량 수정

EBS CSI는 용량은 늘릴 수 있으나 줄일 수 없습니다.

# 용량 확장
kubectl patch pvc ebs-claim -p '{"spec":{"resources":{"requests":{"storage":"10Gi"}}}}'

# 용량 축소 -> 에러 발생
kubectl patch pvc ebs-claim -p '{"spec":{"resources":{"requests":{"storage":"2Gi"}}}}'

 

AWS volume생성 과정 디버깅

csi-controller pod로그를 확인하면 EBS volume 생성과 node에 volume을 연결하는 과정이 보입니다.

kubectl -n kube-system logs -f -l app=ebs-csi-controller

 

(보너스) Notion AI

Notion AI에게 이 페이지 글 요약을 부탁했습니다. 어느정도 맞는 말인 것 같네요

  • AWS 볼륨을 쿠버네티스에서 사용하려면 CSI 컨트롤러와 CSI 노드가 필요합니다.
  • StorageClass를 사용하여 쿠버네티스 리소스에서 AWS 볼륨을 정의할 수 있습니다.
  • Pod에서 AWS 볼륨을 사용하려면 PersistentVolume과 PersistentVolumeClaim을 사용합니다.
  • Kops 설치 시 EBS 컨트롤러가 자동으로 설치됩니다.
  • csi-controller Pod 로그를 확인하면 EBS 볼륨이 생성되고 노드에 볼륨이 연결되는 과정을 확인할 수 있습니다.

 

notion AI로 학습으로 사용할 때 좋다는 퀴즈도 만들어봤습니다.

 

- 퀴즈

  1. AWS volume 연동을 위해 필요한 것은 무엇인가요?
    • CSI 컨트롤러와 CSI 노드
    • Pod와 Node
    • StorageClass와 Namespace
    • Service와 Deployment
  2. Pod에서 AWS 볼륨을 사용하기 위해 필요한 것은 무엇인가요?
    • Namespace
    • StorageClass
    • Pod
    • PersistentVolumeClaim
  3. Kops 설치 시 자동으로 설치되는 AWS 볼륨 컨트롤러는 무엇인가요?
    • EBS 컨트롤러
    • CSI 컨트롤러
    • PV 컨트롤러
    • PVC 컨트롤러

 

- 답

  1. CSI controller와 CSI node
  2. StorageClass
  3. EBS 컨트롤러
반응형