이 글은 쿠버네티스에서 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로 학습으로 사용할 때 좋다는 퀴즈도 만들어봤습니다.
- 퀴즈
- AWS volume 연동을 위해 필요한 것은 무엇인가요?
- CSI 컨트롤러와 CSI 노드
- Pod와 Node
- StorageClass와 Namespace
- Service와 Deployment
- Pod에서 AWS 볼륨을 사용하기 위해 필요한 것은 무엇인가요?
- Namespace
- StorageClass
- Pod
- PersistentVolumeClaim
- Kops 설치 시 자동으로 설치되는 AWS 볼륨 컨트롤러는 무엇인가요?
- EBS 컨트롤러
- CSI 컨트롤러
- PV 컨트롤러
- PVC 컨트롤러
- 답
- CSI controller와 CSI node
- StorageClass
- EBS 컨트롤러
'연재 시리즈' 카테고리의 다른 글
pkos 스터디 3주차 1편 - gitops란? (0) | 2023.03.25 |
---|---|
pkos 스터디 2주차 2편 - AWS VPC CNI (5) | 2023.03.18 |
ArgoCD 13편 - kustomize 사용 방법 (0) | 2023.03.10 |
ArgoCD 12편 - helm 차트 release방법 (0) | 2023.03.10 |
pkos 스터디 1주차 - aws에 kops클러스터 생성 (4) | 2023.03.08 |