EKS Auto Mode에 샘플 상태유지 워크로드 배포하기

EKS Auto Mode에 샘플 상태유지 워크로드 배포하기

이 튜토리얼은 EKS Auto Mode 클러스터에 샘플 상태유지 애플리케이션을 배포하는 방법을 안내합니다. 애플리케이션은 영구 볼륨에 타임스탬프를 기록하며, EKS Auto Mode의 자동 EBS 볼륨 프로비저닝과 영속성 기능을 보여 줍니다.

출처: 문서

본문

사전 조건

  • EKS Auto Mode 클러스터
  • 적절한 권한으로 구성된 AWS CLI
  • kubectl이 설치·구성되어 있어야 합니다.

자세한 내용은 Set up to use Amazon EKS를 참고하세요.

1단계: 환경 구성

환경 변수를 설정합니다.

export CLUSTER_NAME=my-auto-cluster
export AWS_REGION="us-west-2"

kubeconfig를 업데이트합니다.

aws eks update-kubeconfig --name "${CLUSTER_NAME}"

2단계: 스토리지 클래스 생성

StorageClass는 EKS Auto Mode가 EBS 볼륨을 프로비저닝하는 방식을 정의합니다.

EKS Auto Mode는 StorageClass를 자동으로 만들지 않아요. EKS Auto Mode의 스토리지 기능을 사용하려면 ebs.csi.eks.amazonaws.com을 참조하는 StorageClass를 직접 만들어야 합니다.

storage-class.yaml 파일을 만듭니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: auto-ebs-sc
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.eks.amazonaws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: gp3
  encrypted: "true"

StorageClass를 적용합니다.

kubectl apply -f storage-class.yaml

핵심 구성 요소:

  • provisioner: ebs.csi.eks.amazonaws.com - EKS Auto Mode를 사용합니다.
  • volumeBindingMode: WaitForFirstConsumer - Pod가 필요로 할 때까지 볼륨 생성을 지연합니다.
  • type: gp3 - EBS 볼륨 유형을 지정합니다.
  • encrypted: "true" - EBS가 이 클래스로 만든 볼륨을 암호화할 때 기본 aws/ebs 키를 사용합니다. 선택 사항이지만 권장됩니다.
  • storageclass.kubernetes.io/is-default-class: "true" - 영구 볼륨 클레임에 다른 볼륨 클래스를 지정하지 않는 한 Kubernetes가 기본적으로 이 스토리지 클래스를 사용합니다. 다른 스토리지 컨트롤러에서 마이그레이션하는 경우 이 값을 설정할 때 주의하세요. (선택)

3단계: 영구 볼륨 클레임 생성

PVC는 StorageClass에서 스토리지를 요청합니다.

pvc.yaml 파일을 만듭니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: auto-ebs-claim
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: auto-ebs-sc
  resources:
    requests:
      storage: 8Gi

PVC를 적용합니다.

kubectl apply -f pvc.yaml

핵심 구성 요소:

  • accessModes: ReadWriteOnce - 볼륨을 한 번에 한 노드에서만 마운트할 수 있습니다.
  • storage: 8Gi - 8 GiB 볼륨을 요청합니다.
  • storageClassName: auto-ebs-sc - 우리가 만든 StorageClass를 참조합니다.

4단계: 애플리케이션 배포

Deployment는 영구 볼륨에 타임스탬프를 기록하는 컨테이너를 실행합니다.

deployment.yaml 파일을 만듭니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: inflate-stateful
spec:
  replicas: 1
  selector:
    matchLabels:
      app: inflate-stateful
  template:
    metadata:
      labels:
        app: inflate-stateful
    spec:
      terminationGracePeriodSeconds: 0
      nodeSelector:
        eks.amazonaws.com/compute-type: auto
      containers:
        - name: bash
          image: public.ecr.aws/docker/library/bash:4.4
          command: ["/usr/local/bin/bash"]
          args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 60; done"]
          resources:
            requests:
              cpu: "1"
          volumeMounts:
            - name: persistent-storage
              mountPath: /data
      volumes:
        - name: persistent-storage
          persistentVolumeClaim:
            claimName: auto-ebs-claim

Deployment를 적용합니다.

kubectl apply -f deployment.yaml

핵심 구성 요소:

  • 파일에 타임스탬프를 기록하는 간단한 bash 컨테이너.
  • /data에 PVC를 마운트합니다.
  • CPU 코어 1개를 요청합니다.
  • EKS 관리 노드용 node selector를 사용합니다.

5단계: 설정 검증

Pod가 실행 중인지 확인합니다.

kubectl get pods -l app=inflate-stateful

PVC가 바인딩되었는지 확인합니다.

kubectl get pvc auto-ebs-claim

EBS 볼륨을 확인합니다.

# Get the PV name
PV_NAME=$(kubectl get pvc auto-ebs-claim -o jsonpath='{.spec.volumeName}')
# Describe the EBS volume
aws ec2 describe-volumes \
  --filters Name=tag:CSIVolumeName,Values=${PV_NAME}

데이터가 기록되고 있는지 확인합니다.

kubectl exec "$(kubectl get pods -l app=inflate-stateful \
  -o=jsonpath='{.items[0].metadata.name}')" -- \
  cat /data/out.txt

6단계: 정리

다음 명령으로 이 튜토리얼에서 만든 모든 리소스를 제거합니다.

# Delete all resources in one command
kubectl delete deployment/inflate-stateful pvc/auto-ebs-claim storageclass/auto-ebs-sc

내부에서 일어나는 일(What's Happening Behind the Scenes)

  • PVC가 StorageClass에서 스토리지를 요청합니다.
  • Pod가 스케줄링되면:
    • EKS Auto Mode가 EBS 볼륨을 프로비저닝합니다.
    • PersistentVolume을 만듭니다.
    • 볼륨을 노드에 연결합니다.
    • Pod가 볼륨을 마운트하고 타임스탬프 기록을 시작합니다.

Snapshot Controller

EKS Auto Mode는 Kubernetes CSI Snapshotter(snapshot controller라고도 함)와 호환됩니다. 하지만 EKS Auto Mode에는 snapshot controller가 포함되지 않아요. snapshot controller 설치·구성은 사용자 책임입니다. 자세한 내용은 Enable snapshot functionality for CSI volumes를 참고하세요.

EKS Auto Mode의 스토리지 기능을 참조하는 다음 VolumeSnapshotClass를 검토하세요.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: auto-ebs-vsclass
driver: ebs.csi.eks.amazonaws.com
deletionPolicy: Delete

Kubernetes CSI Snapshotter에 대해 자세히 알아보세요.

더 알아보기 (Learn more)