

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# EKS Fargate から EKS Auto Mode に移行する
<a name="auto-migrate-fargate"></a>

このトピックでは、`kubectl` を使用してワークロードを EKS Fargate から Amazon EKS Auto Mode に移行するプロセスについて説明します。移行は段階的に実行できるため、移行を通じてクラスターの安定性とアプリケーションの可用性を維持しながら、ワークロードを自分のペースで移動できます。

以下に説明するステップバイステップのアプローチを取ると、移行期間中に EKS Fargate と EKS Auto Mode を並行して実行できます。このデュアルオペレーション戦略では、EKS Fargate を完全に廃止する前に EKS Auto Mode でワークロードの動作を検証できるため、スムーズな移行が可能です。アプリケーションは個別またはグループで移行できるため、特定の運用要件とリスク許容度に柔軟に対応できます。

## Amazon EKS Auto Mode と、AWS Fargate を使用した EKS の比較
<a name="comparing_amazon_eks_auto_mode_and_eks_with_shared_aws_fargate"></a>

AWS Fargate を使用する Amazon EKS は、EKS を実行するお客様に引き続きオプションとしてご利用いただけますが、今後のアプローチとしては Amazon EKS Auto Mode がお勧めです。EKS Auto Mode は、Kubernetes に完全に準拠しており、Fargate では対応していない Istio などのアップストリーム Kubernetes プリミティブとプラットフォームツールをすべてサポートしています。EKS Auto Mode は、GPU インスタンスやスポットインスタンスを含め、すべての EC2 ランタイム購入オプションにも完全に対応しているため、EC2 の割引の交渉といった仕組みを活用して節約を行えます。Fargate で EKS を使用する場合は、そのような機能が用意されていません。

さらに、EKS Auto Mode なら、Fargate と同じ分離モデルを実現できます。これを行うには、標準の Kubernetes スケジューリング機能を使用して、各 EC2 インスタンスで 1 つのアプリケーションコンテナを実行します。Amazon EKS Auto Mode を導入すると、Kubernetes を AWS で実行するメリットを最大限に活用できます。これはKubernetes に完全準拠したプラットフォームであり、EC2 と購入の広範なオプションをすべて利用できます。また、Fargate が実現するインフラストラクチャ管理の利便性や抽象化も維持されています。

### 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` は、任意の 2 つのノード間のポッド数の差が最大 1 であることを保証し、ノードごとに 1 つのポッドを効果的に分散する
+  `topologyKey: kubernetes.io/hostname` はノードをトポロジドメインとして定義する
+  `whenUnsatisfiable: DoNotSchedule` は、制約が満たされない場合、スケジューリングを禁止する
+  `minDomains: 1` は、スケジュールする前に、少なくとも 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` を持つ 2 つのポッドを同じノードでスケジュールすることを禁止します。このアプローチにより、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 Auto Mode を有効にする
<a name="_step_2_enable_eks_auto_mode_on_the_cluster"></a>

1. AWS CLI またはマネジメントコンソールを使用して、既存のクラスターで EKS 自動モードl を有効にします。詳細については、「[既存のクラスターで EKS Auto Mode を有効にする](auto-enable-existing.md)」を参照してください。

1. ノードプールを確認します。

   ```
   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 自動モードl に移行するワークロードを特定して更新します。

Fargate から EKS Auto Mode にワークロードを移行するには、注釈 `eks.amazonaws.com/compute-type: ec2` を適用します。こうすることで、Fargate プロファイルに関係なく、Fargate によるワークロードスケジュールは行われず、その役割は EKS Auto Mode NodePool に引き継がれます。詳細については、「[EKS 自動モードl 用のノードプールを作成する](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 Auto Mode ノードでワークロードをスケジュールできます。

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

1. デプロイが 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   <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. 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  <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 Auto Mode では CoreDNS が処理されるため、`coredns` デプロイを 0 にスケールダウンします。

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