EKS Fargate から EKS Auto Mode に移行する - Amazon EKS

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

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

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 インスタンスやスポットインスタンスを含め、すべての EC2 ランタイム購入オプションにも完全に対応しているため、EC2 の割引の交渉といった仕組みを活用して節約を行えます。Fargate で EKS を使用する場合は、そのような機能が用意されていません。

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

EKS Auto Mode で Fargate のような分離を実現する

各ポッドがそれぞれの専用インスタンスで実行される 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 と同様の強固な分離を保証します。

前提条件

移行を開始する前に、以下を確認します。

ステップ 1: Fargate クラスターを確認する

  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
  2. 実行中のポッドを確認します。

    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
  3. 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
  4. デプロイを適用します:

    kubectl apply -f deployment_fargate.yaml
    deployment.apps/nginx-deployment created
  5. ポッドとデプロイを確認します。

    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
  6. ノードを確認します。

    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 を有効にする

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

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

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

ステップ 3: 移行するワークロードを更新する

EKS 自動モードl に移行するワークロードを特定して更新します。

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

  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
  2. デプロイを適用します。この変更により、新しい EKS Auto Mode ノードでワークロードをスケジュールできます。

    kubectl apply -f deployment_fargate.yaml
  3. デプロイが 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>
  4. 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: ワークロードを段階的に移行する

移行するワークロードごとにステップ 3 を繰り返します。この結果、要件とリスク許容度に基づいて、ワークロードを個別またはグループで移動できます。

ステップ 5: 元の fargate プロファイルを削除する

すべてのワークロードを移行したら、元の fargate プロファイルを削除できます。<fargate profile name> を Fargate プロファイルの名前に置き換えます。

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

ステップ 6: CoreDNS をスケールダウンする

EKS Auto Mode では CoreDNS が処理されるため、coredns デプロイを 0 にスケールダウンします。

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