

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 從 EKS Fargate 移轉至 EKS 自動模式
<a name="auto-migrate-fargate"></a>

本主題將引導您使用 `kubectl` 將工作負載從 EKS Fargate 移轉至 Amazon EKS 自動模式的程序。移轉可以逐步進行，讓您能夠按照自己的步調移動工作負載，同時在整個轉換期間保持叢集穩定性和應用程式可用性。

下面概述的逐步方法使您能夠在移轉期間同時執行 EKS Fargate 和 EKS 自動模式。這種雙重操作策略有助於確保平穩轉換，讓您可以在完全停用 EKS Fargate 之前，驗證工作負載在 EKS 自動模式上的行為。您可以單獨或分組移轉應用程式，提供靈活性以適應您的特定運營要求與風險承受能力。

## 使用 AWS Fargate 比較 Amazon EKS Auto 模式和 EKS
<a name="comparing_amazon_eks_auto_mode_and_eks_with_shared_aws_fargate"></a>

對於想要執行 EKS 的客戶而言，Amazon EKS 搭配 AWS Fargate 仍然是選項，但 Amazon EKS Auto Mode 是建議的方法。EKS 自動模式完全符合 Kubernetes 規範，支援所有上游 Kubernetes 基本元件與 Istio 等平台工具，而這些是 Fargate 無法支援的。EKS 自動模式還完全支援所有 EC2 執行時期購買選項，包括 GPU 和 Spot 執行個體，使客戶能夠利用協商後的 EC2 折扣和其他節省機制。這些功能在使用帶有 Fargate 的 EKS 時不可用。

此外，EKS 自動模式允許客戶實現與 Fargate 相同的隔離模型，使用標準的 Kubernetes 排程功能來確保每個 EC2 執行個體運行單個應用程式容器。透過採用 Amazon EKS Auto Mode，客戶可以釋放在 上執行 Kubernetes 的完整優點 AWS ：完全符合 Kubernetes 的平台，提供彈性以利用整個 EC2 的廣度和購買選項，同時保留 Fargate 提供的基礎設施管理的易用性和抽象性。

### 在 EKS Auto 模式下實現類似 Fargate 的隔離
<a name="_achieving_fargate_like_isolation_in_eks_auto_mode"></a>

若要複寫 Fargate 的 Pod 隔離模型，其中每個 Pod 在自己的專用執行個體上執行，您可以使用 Kubernetes 拓撲分散限制條件。這是控制跨節點 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 執行個體，以滿足此限制，提供與 Fargate 相同的隔離模型，同時讓您存取完整的 EC2 執行個體類型和購買選項。

或者，您可以使用 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:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - isolated-app
            topologyKey: kubernetes.io/hostname
      containers:
      - name: app
        image: nginx
        ports:
        - containerPort: 80
```

使用 的`podAntiAffinity`規則`requiredDuringSchedulingIgnoredDuringExecution`可確保在相同節點上`app: isolated-app`無法排程具有標籤的兩個 Pod。此方法提供與 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. 檢查執行中的 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
   ```

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. 檢查 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
   ```

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. 使用 CLI 或 管理主控台在現有叢集上啟用 AWS EKS 自動模式。如需詳細資訊，請參閱[在現有叢集上啟用 EKS 自動模式](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 自動模式的工作負載。

要將工作負載從 Fargate 移轉至 EKS 自動模式，請套用註釋 `eks.amazonaws.com/compute-type: ec2`。這能確保即使存在 Fargate 設定檔，該工作負載也不會由 Fargate 排程，而是由 EKS 自動模式 NodePool 接管。如需詳細資訊，請參閱[為 EKS 自動模式建立節點集區](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. 確認沒有 Fargate 節點在執行，且部署正在 EKS 自動模式受管節點上執行：

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