EKS Fargate에서 EKS Auto Mode로 마이그레이션하기

EKS Fargate에서 EKS Auto Mode로 마이그레이션하기

이 주제는 kubectl로 워크로드를 EKS Fargate에서 Amazon EKS Auto Mode로 마이그레이션하는 과정을 안내합니다. 마이그레이션은 점진적으로 수행할 수 있어, 전환 내내 클러스터 안정성과 애플리케이션 가용성을 유지하면서 자신의 속도에 맞춰 워크로드를 이동할 수 있어요.

아래의 단계별 접근 방식은 마이그레이션 기간 동안 EKS Fargate와 EKS Auto Mode를 나란히 실행할 수 있게 합니다. 이 이중 운영 전략은 EKS Fargate를 완전히 폐기하기 전에 EKS Auto Mode에서 워크로드 동작을 검증할 수 있게 해 매끄러운 전환을 보장합니다. 애플리케이션을 개별적으로 또는 그룹으로 마이그레이션할 수 있어 특정 운영 요구와 위험 허용도에 맞는 유연성을 제공해요.

출처: 문서

본문

Amazon EKS Auto Mode와 AWS Fargate가 있는 EKS 비교

AWS Fargate가 있는 Amazon EKS는 EKS를 실행하려는 고객에게 여전히 옵션이지만, Amazon EKS Auto Mode가 앞으로 권장되는 접근 방식입니다. EKS Auto Mode는 완전히 Kubernetes 호환이며, Fargate가 지원할 수 없는 Istio 같은 모든 업스트림 Kubernetes 프리미티브와 플랫폼 도구를 지원합니다. EKS Auto Mode는 GPU와 Spot 인스턴스를 포함한 모든 EC2 런타임 구매 옵션도 완전히 지원하므로, 협상된 EC2 할인과 기타 절감 메커니즘을 활용할 수 있어요. 이러한 기능은 Fargate와 함께 EKS를 사용할 때는 사용할 수 없습니다.

또한 EKS Auto Mode는 표준 Kubernetes 스케줄링 기능을 사용해 각 EC2 인스턴스가 단일 애플리케이션 컨테이너를 실행하도록 하여, Fargate와 동일한 격리 모델을 달성할 수 있게 합니다. Amazon EKS Auto Mode를 채택함으로써 고객은 EC2와 구매 옵션의 전체 폭을 활용하는 유연성을 제공하면서 Fargate가 제공하는 사용 편의성과 인프라 관리 추상화를 유지하는, 완전한 Kubernetes 호환 플랫폼인 AWS에서 Kubernetes를 실행하는 이점을 온전히 누릴 수 있어요.

EKS Auto Mode에서 Fargate 유사 격리 달성

각 Pod가 자체 전용 인스턴스에서 실행되는 Fargate의 Pod 격리 모델을 재현하려면 Kubernetes topology spread constraints를 사용할 수 있습니다. 이는 노드 간 Pod 분포를 제어하는 권장 접근 방식입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: isolated-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: isolated-app
  template:
    metadata:
      labels:
        app: isolated-app
      annotations:
        eks.amazonaws.com/compute-type: ec2
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: isolated-app
        minDomains: 1
      containers:
      - name: app
        image: nginx
        ports:
        - containerPort: 80

이 구성에서:

  • maxSkew: 1은 두 노드 간 Pod 수 차이가 최대 1임을 보장해 노드당 Pod 하나를 효과적으로 분산합니다.
  • topologyKey: kubernetes.io/hostname은 노드를 토폴로지 도메인으로 정의합니다.
  • whenUnsatisfiable: DoNotSchedule은 제약 조건을 충족할 수 없으면 스케줄링을 방지합니다.
  • minDomains: 1은 스케줄링 전에 최소 하나의 도메인(노드)이 존재하도록 보장합니다.

EKS Auto Mode는 이 제약 조건을 충족하도록 필요에 따라 새 EC2 인스턴스를 자동으로 프로비저닝하며, 전체 EC2 인스턴스 유형과 구매 옵션에 접근하면서 Fargate와 동일한 격리 모델을 제공합니다.

대신 더 엄격한 격리를 위해 pod anti-affinity 규칙을 사용할 수도 있어요.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: isolated-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: isolated-app
  template:
    metadata:
      labels:
        app: isolated-app
      annotations:
        eks.amazonaws.com/compute-type: ec2
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - isolated-app
            topologyKey: kubernetes.io/hostname
      containers:
      - name: app
        image: nginx
        ports:
        - containerPort: 80

requiredDuringSchedulingIgnoredDuringExecution이 있는 podAntiAffinity 규칙은 app: isolated-app 라벨을 가진 두 Pod가 같은 노드에 스케줄링될 수 없음을 보장합니다. 이 접근 방식은 Fargate와 유사한 하드 격리 보장을 제공합니다.

사전 조건

마이그레이션을 시작하기 전에 다음이 있는지 확인하세요.

  • Fargate로 클러스터를 설정합니다. 자세한 내용은 Get started with AWS Fargate for your cluster를 참고하세요.
  • kubectl이 설치되고 클러스터에 연결되어 있어야 합니다. 자세한 내용은 Set up to use Amazon EKS를 참고하세요.

1단계: Fargate 클러스터 확인

Fargate가 있는 EKS 클러스터가 실행 중인지 확인합니다.

kubectl get node
NAME STATUS ROLES AGE VERSION
fargate-ip-192-168-92-52.ec2.internal Ready  25m v1.30.8-eks-2d5f260
fargate-ip-192-168-98-196.ec2.internal Ready  24m v1.30.8-eks-2d5f260

실행 중인 Pod를 확인합니다.

kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6659cb98f6-gxpjz 1/1 Running 0 26m
kube-system coredns-6659cb98f6-gzzsx 1/1 Running 0 26m

deployment_fargate.yaml 파일에 배포를 만듭니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        eks.amazonaws.com/compute-type: fargate
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

배포를 적용합니다.

kubectl apply -f deployment_fargate.yaml
deployment.apps/nginx-deployment created

Pod와 배포를 확인합니다.

kubectl get pod,deploy
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-5c7479459b-6trtm   1/1     Running   0          61s
pod/nginx-deployment-5c7479459b-g8ssb   1/1     Running   0          61s
pod/nginx-deployment-5c7479459b-mq4mf   1/1     Running   0          61s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           61s

노드를 확인합니다.

kubectl get node -owide
NAME                                    STATUS  ROLES  AGE VERSION             INTERNAL-IP     EXTERNAL-IP OS-IMAGE       KERNEL-VERSION                  CONTAINER-RUNTIME
fargate-ip-192-168-111-43.ec2.internal  Ready    31s v1.30.8-eks-2d5f260 192.168.111.43        Amazon Linux 2 5.10.234-225.910.amzn2.x86_64  containerd://1.7.25
fargate-ip-192-168-117-130.ec2.internal Ready    36s v1.30.8-eks-2d5f260 192.168.117.130       Amazon Linux 2 5.10.234-225.910.amzn2.x86_64  containerd://1.7.25
fargate-ip-192-168-74-140.ec2.internal  Ready    36s v1.30.8-eks-2d5f260 192.168.74.140        Amazon Linux 2 5.10.234-225.910.amzn2.x86_64  containerd://1.7.25

2단계: 클러스터에서 EKS Auto Mode 활성화

AWS CLI 또는 Management Console로 기존 클러스터에서 EKS Auto Mode를 활성화합니다. 자세한 내용은 Enable EKS Auto Mode on an existing cluster를 참고하세요.

nodepool을 확인합니다.

kubectl get nodepool
NAME              NODECLASS   NODES   READY   AGE
general-purpose   default     1       True    6m58s
system            default     0       True    3d14h

3단계: 마이그레이션용 워크로드 업데이트

EKS Auto Mode로 마이그레이션하려는 워크로드를 식별하고 업데이트합니다.

Fargate에서 EKS Auto Mode로 워크로드를 마이그레이션하려면 eks.amazonaws.com/compute-type: ec2 어노테이션을 적용합니다. 이렇게 하면 Fargate 프로필에도 불구하고 워크로드가 Fargate로 스케줄링되지 않고 EKS Auto Mode NodePool이 처리하게 됩니다. 자세한 내용은 Create a Node Pool for EKS Auto Mode를 참고하세요.

배포(예: deployment_fargate.yaml 파일)를 수정해 컴퓨트 유형을 ec2로 변경합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        eks.amazonaws.com/compute-type: ec2
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

배포를 적용합니다. 이 변경으로 워크로드가 새 EKS Auto Mode 노드에 스케줄링될 수 있습니다.

kubectl apply -f deployment_fargate.yaml

배포가 EKS Auto Mode 클러스터에서 실행 중인지 확인합니다.

kubectl get pod -o wide
NAME                               READY   STATUS    RESTARTS   AGE     IP               NODE                  NOMINATED NODE   READINESS GATES
nginx-deployment-97967b68d-ffxxh   1/1     Running   0          3m31s   192.168.43.240   i-0845aafcb51630ffb
nginx-deployment-97967b68d-mbcgj   1/1     Running   0          2m37s   192.168.43.241   i-0845aafcb51630ffb
nginx-deployment-97967b68d-qpd8x   1/1     Running   0          2m35s   192.168.43.242   i-0845aafcb51630ffb

Fargate 노드가 없고 배포가 EKS Auto Mode 관리 노드에서 실행 중인지 확인합니다.

kubectl get node -owide
NAME                STATUS ROLES  AGE   VERSION             INTERNAL-IP     EXTERNAL-IP OS-IMAGE                                         KERNEL-VERSION CONTAINER-RUNTIME
i-0845aafcb51630ffb Ready   3m30s v1.30.8-eks-3c20087 192.168.41.125  3.81.118.95 Bottlerocket (EKS Auto) 2025.3.14 (aws-k8s-1.30) 6.1.129        containerd://1.7.25+bottlerocket

4단계: 워크로드 점진적으로 마이그레이션

마이그레이션하려는 각 워크로드에 대해 3단계를 반복합니다. 이를 통해 요구사항과 위험 허용도에 따라 워크로드를 개별적으로 또는 그룹으로 이동할 수 있어요.

5단계: 원래 fargate 프로필 제거

모든 워크로드가 마이그레이션되면 원래 fargate 프로필을 제거할 수 있습니다. ``를 Fargate 프로필 이름으로 바꾸세요.

aws eks delete-fargate-profile --cluster-name eks-fargate-demo-cluster --fargate-profile-name

6단계: CoreDNS 축소

EKS Auto Mode가 CoreDNS를 처리하므로 coredns 배포를 0으로 축소합니다.

kubectl scale deployment coredns -n kube-system --replicas=0

더 알아보기 (Learn more)