從 EKS Fargate 移轉至 EKS 自動模式 - Amazon EKS

協助改進此頁面

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

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

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

從 EKS Fargate 移轉至 EKS 自動模式

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

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

使用 AWS Fargate 比較 Amazon EKS Auto 模式和 EKS

對於想要執行 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 的隔離

若要複寫 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 類似的硬隔離保證。

先決條件

開始移轉之前,請確保您已具備下列項目

步驟 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. 檢查執行中的 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
  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. 檢查 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
  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 自動模式

  1. 使用 CLI 或 管理主控台在現有叢集上啟用 AWS EKS 自動模式。如需詳細資訊,請參閱在現有叢集上啟用 EKS 自動模式

  2. 檢查 nodepool:

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

步驟 3:更新工作負載以進行移轉

識別並更新您想要移轉至 EKS 自動模式的工作負載。

要將工作負載從 Fargate 移轉至 EKS 自動模式,請套用註釋 eks.amazonaws.com/compute-type: ec2。這能確保即使存在 Fargate 設定檔,該工作負載也不會由 Fargate 排程,而是由 EKS 自動模式 NodePool 接管。如需詳細資訊,請參閱為 EKS 自動模式建立節點集區

  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 自動模式節點:

    kubectl apply -f deployment_fargate.yaml
  3. 檢查部署是否在 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>
  4. 確認沒有 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:逐步移轉工作負載

針對要移轉的每個工作負載重複步驟 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 自動模式會處理 CoreDNS,您可將 coredns 部署縮減到 0:

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