

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# EKS Fargate에서 EKS 자동 모드로 마이그레이션
<a name="auto-migrate-fargate"></a>

이 주제에서는 `kubectl`을 사용하여 EKS Fargate에서 Amazon EKS 자동 모드로 워크로드를 마이그레이션하는 프로세스를 안내합니다. 마이그레이션을 점진적으로 수행할 수 있으므로 전환 기간 동안 클러스터 안정성과 애플리케이션 가용성을 유지하면서 원하는 속도로 워크로드를 이동할 수 있습니다.

아래에 설명된 단계별 접근 방식을 사용하면 마이그레이션 기간에 EKS Fargate와 EKS 자동 모드를 나란히 실행할 수 있습니다. 이러한 이중 작업 전략은 EKS Fargate를 완전히 폐기하기 전에 EKS 자동 모드에서 워크로드 동작을 검증할 수 있게 하여 원활한 전환을 보장하는 데 도움이 됩니다. 애플리케이션을 개별적으로 또는 그룹으로 마이그레이션하여 특정 운영 요구 사항과 위험 허용 범위를 유연하게 수용할 수 있습니다.

## Amazon EKS 자동 모드와 AWS Fargate가 포함된 EKS 비교
<a name="comparing_amazon_eks_auto_mode_and_eks_with_shared_aws_fargate"></a>

EKS를 실행하려는 고객에게는 AWS Fargate가 포함된 Amazon EKS가 여전히 옵션으로 제공되지만, 앞으로는 Amazon EKS 자동 모드를 사용하는 것이 권장됩니다. EKS 자동 모드는 Kubernetes를 완벽하게 준수하며 Fargate가 지원할 수 없는 Istio와 같은 모든 업스트림 Kubernetes 기본 요소와 플랫폼 도구를 지원합니다. 또한 EKS 자동 모드는 GPU 및 스팟 인스턴스를 포함한 모든 EC2 런타임 구매 옵션을 완벽하게 지원하므로 고객은 협상된 EC2 할인 및 기타 절감 메커니즘을 활용할 수 있습니다. Fargate가 포함된 EKS를 사용할 때는 이러한 기능을 이용할 수 없습니다.

또한 EKS 자동 모드를 통해 고객은 각 EC2 인스턴스가 단일 애플리케이션 컨테이너를 실행하도록 표준 Kubernetes 예약 기능을 사용하여 Fargate와 동일한 격리 모델을 구현할 수 있습니다. Amazon EKS 자동 모드를 채택함으로써 고객은 Fargate가 제공하는 인프라 관리의 사용 편의성과 추상화를 유지하면서 모든 범위의 EC2 및 구매 옵션을 활용할 수 있는 유연성을 제공하는 완전한 Kubernetes 호환 플랫폼인 AWS에서 Kubernetes를 실행하는 모든 이점을 누릴 수 있습니다.

### EKS Auto Mode에서 Fargate와 유사한 격리 달성
<a name="_achieving_fargate_like_isolation_in_eks_auto_mode"></a>

각 포드가 자체 전용 인스턴스에서 실행되는 Fargate의 포드 격리 모델을 복제하기 위해 Kubernetes 토폴로지 분산 제약 조건을 사용할 수 있습니다. 이 방법은 노드 간 포드 분산을 제어하는 데 권장되는 접근 방식입니다.

```
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`은 노드당 1개 포드를 효과적으로 분산하도록 두 노드 간 포드 수 차이가 최대 1개가 되도록 보장함
+  `topologyKey: kubernetes.io/hostname`은 노드를 토폴로지 도메인으로 정의함
+  `whenUnsatisfiable: DoNotSchedule`은 제약 조건을 충족할 수 없는 경우 예약을 방지함
+  `minDomains: 1`은 예약하기 전에 하나 이상의 도메인(노드)이 존재하는지 확인

EKS Auto Mode는 이 제약 조건을 충족하기 위해 필요한 경우 새 EC2 인스턴스를 자동으로 프로비저닝하여 Fargate와 동일한 격리 모델을 제공하는 동시에 EC2 인스턴스 유형 및 구매 옵션의 전체 범위에 액세스할 수 있습니다.

또는 보다 엄격한 격리를 위해 포드 비선호도 규칙을 사용할 수 있습니다.

```
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`인 두 포드를 동일한 노드에서 예약할 수 없도록 보장합니다. 이 접근 방식에서는 Fargate와 유사한 하드 격리 보장을 제공합니다.

## 사전 조건
<a name="_prerequisites"></a>

마이그레이션을 시작하기 전에 다음을 수행했는지 확인합니다.
+ Fargate가 포함된 클러스터를 설정합니다. 자세한 내용은 [클러스터를 위한 AWS Fargate 시작하기](fargate-getting-started.md) 섹션을 참조하세요.
+ `kubectl`을 설치하고 클러스터에 연결합니다. 자세한 내용은 [Amazon EKS를 사용하도록 설정](setting-up.md) 섹션을 참조하세요.

## 1단계: Fargate 클러스터 확인
<a name="_step_1_check_the_fargate_cluster"></a>

1. Fargate가 포함된 EKS 클러스터가 실행 중인지 확인합니다.

   ```
   kubectl get node
   ```

   ```
   NAME STATUS ROLES AGE VERSION
   fargate-ip-192-168-92-52.ec2.internal Ready <none> 25m v1.30.8-eks-2d5f260
   fargate-ip-192-168-98-196.ec2.internal Ready <none> 24m v1.30.8-eks-2d5f260
   ```

1. 실행 중인 포드를 확인합니다.

   ```
   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
   ```

1. `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
   ```

1. 배포를 적용합니다.

   ```
   kubectl apply -f deployment_fargate.yaml
   ```

   ```
   deployment.apps/nginx-deployment created
   ```

1. 포드와 배포를 확인합니다.

   ```
   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
   ```

1. 노드를 확인합니다.

   ```
   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   <none> 31s v1.30.8-eks-2d5f260 192.168.111.43  <none>      Amazon Linux 2 5.10.234-225.910.amzn2.x86_64  containerd://1.7.25
   fargate-ip-192-168-117-130.ec2.internal Ready   <none> 36s v1.30.8-eks-2d5f260 192.168.117.130 <none>      Amazon Linux 2 5.10.234-225.910.amzn2.x86_64  containerd://1.7.25
   fargate-ip-192-168-74-140.ec2.internal  Ready   <none> 36s v1.30.8-eks-2d5f260 192.168.74.140  <none>      Amazon Linux 2 5.10.234-225.910.amzn2.x86_64  containerd://1.7.25
   ```

## 2단계: 클러스터에서 EKS 자동 모드 활성화
<a name="_step_2_enable_eks_auto_mode_on_the_cluster"></a>

1. AWS CLI 또는 관리 콘솔을 사용하여 기존 클러스터에서 EKS Auto Mode를 활성화합니다. 자세한 내용은 [기존 클러스터에서 EKS Auto Mode 활성화](auto-enable-existing.md) 섹션을 참조하세요.

1. NodePool을 확인합니다.

   ```
   kubectl get nodepool
   ```

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

## 3단계: 마이그레이션할 워크로드 업데이트
<a name="_step_3_update_workloads_for_migration"></a>

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

Fargate에서 EKS 자동 모드로 워크로드를 마이그레이션하려면 주석 `eks.amazonaws.com/compute-type: ec2`를 적용합니다. 이렇게 하면 Fargate 프로파일에도 불구하고 Fargate에서 워크로드를 예약하지 않고 EKS 자동 모드 NodePool에서 워크로드를 포착할 수 있습니다. 자세한 내용은 [EKS Auto Mode용 노드 풀 생성](create-node-pool.md) 섹션을 참조하세요.

1. 배포(예: `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
   ```

1. 배포를 적용합니다. 이 변경 사항을 통해 새 EKS 자동 모드 노드에서 워크로드를 예약할 수 있습니다.

   ```
   kubectl apply -f deployment_fargate.yaml
   ```

1. 배포가 EKS 자동 모드 클러스터에서 실행 중인지 확인합니다.

   ```
   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   <none>           <none>
   nginx-deployment-97967b68d-mbcgj   1/1     Running   0          2m37s   192.168.43.241   i-0845aafcb51630ffb   <none>           <none>
   nginx-deployment-97967b68d-qpd8x   1/1     Running   0          2m35s   192.168.43.242   i-0845aafcb51630ffb   <none>           <none>
   ```

1. EKS 자동 모드 관리형 노드에서 실행 중인 Fargate 노드와 배포가 없는지 확인합니다.

   ```
   kubectl get node -owide
   ```

   ```
   NAME                STATUS ROLES  AGE   VERSION             INTERNAL-IP     EXTERNAL-IP OS-IMAGE                                         KERNEL-VERSION CONTAINER-RUNTIME
   i-0845aafcb51630ffb Ready  <none> 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단계: 점진적으로 워크로드 마이그레이션
<a name="_step_4_gradually_migrate_workloads"></a>

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

## 5단계: 원래 fargate 프로파일 제거
<a name="_step_5_remove_the_original_fargate_profile"></a>

모든 워크로드가 마이그레이션되면 원래 `fargate` 프로파일을 제거할 수 있습니다. *<fargate profile name>*을 Fargate 프로파일의 이름으로 바꿉니다.

```
aws eks delete-fargate-profile --cluster-name eks-fargate-demo-cluster --fargate-profile-name <fargate profile name>
```

## 6단계: CoreDNS 스케일 다운
<a name="_step_6_scale_down_coredns"></a>

EKS 자동 모드는 CoreDNS를 처리하기 때문에 `coredns` 배포를 0으로 스케일 다운합니다.

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