為您的 Amazon EKS 叢集啟用 Windows 支援 - Amazon EKS

協助改善此頁面

想要為此使用者指南做出貢獻嗎? 捲動至此頁面底部,然後選取 [編輯此頁面於] GitHub。您的貢獻將有助於使我們的用戶指南更適合所有人。

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

為您的 Amazon EKS 叢集啟用 Windows 支援

部署 Windows 節點之前,請注意以下考量。

考量事項
  • 您可以透過 HostProcess Pod 在 Windows 節點上使用主機聯網。如需詳細資訊,請參閱 Kubernetes 文件中的建立 Windows HostProcessPod

  • Amazon EKS 叢集必須包含一或多個 Linux 或 Fargate 節點,才能執行只在 Linux 上執行的核心系統 Pods,例如:CoreDNS。

  • kubeletkube-proxy 事件日誌會重新導向至 EKS Windows 事件日誌,且其限制會設定為 200 MB。

  • 您無法將 Pods 的安全群組 和在 Windows 節點上執行的 Pods 搭配使用。

  • 您無法將自訂聯網與 Windows 節點搭配使用。

  • 您無法將 IPv6 與 Windows 節點搭配使用。

  • Windows 節點為每個節點支援一個彈性網路介面。依預設,每個 Windows 節點可以執行的 Pods 數量,等於節點執行個體類型的每個彈性網路介面可用的 IP 地址數量減去一。如需詳細資訊,請參閱 Amazon EC2 使用者指南每個執行個體類型的每個網路界面的 IP 地址

  • 在 Amazon EKS 叢集中,具有負載平衡器的單一服務最多可支援 1024 個後端 Pods。每個 Pod 都有自己的唯一 IP 地址。自 OS Build 17763.2746 起的 Windows Server 更新後,過去的 64 個 Pods 限制已不存在。

  • Windows 容器不支援在 Fargate 上使用 Amazon EKS Pods。

  • 無法從 vpc-resource-controller Pod 擷取日誌。您先前在將控制器部署到資料平面時可以這麼做。

  • 在將 IPv4 地址指派給新的 Pod 之前,有一段冷卻期間。這可以防止流量因 kube-proxy 規則過時而流動到具有相同 IPv4 地址的較舊 Pod。

  • 在 GitHub 上可管理控制器的來源。若要對控制器做出貢獻或提出問題,請造訪 GitHub 上的專案

  • 為Windows受管節點群組指定自訂 AMI ID 時,請新增eks:kube-proxy-windows至 AWS IAM 驗證器組態對應。如需詳細資訊,請參閱 指定 AMI ID 時的限制和條件

必要條件
  • 現有的叢集。叢集必須執行下表所列的其中一種 Kubernetes 版本和平台版本。所列版本之後推出的所有 Kubernetes 和平台版本亦受支援。若叢集或平台版本比下列其中一個版本還舊,則需要在叢集的資料平面上啟用舊版 Windows 支援。當叢集為以下 Kubernetes 和平台版本之一或更新的版本時,您可以在控制平面上移除舊版 Windows 支援啟用 Windows 支援

    Kubernetes 版本 平台版本
    1.30 eks.2
    1.29 eks.1
    1.28 eks.1
    1.27 eks.1
    1.26 eks.1
    1.25 eks.1
    1.24 eks.2
  • 叢集必須至少有一個 (建議至少有兩個) Linux 節點或 Fargate Pod,才能執行 CoreDNS。若啟用舊版 Windows 支援,則必須使用 Linux 節點 (不能使用 Fargate Pod) 來執行 CoreDNS。

  • 現有 Amazon EKS 叢集 IAM 角色

啟用 Windows 支援

若叢集不屬於先決條件中所列出的 Kubernetes 與平台版本其中的一個版本或更新的版本,則必須改為啟用舊版 Windows 支援。如需詳細資訊,請參閱 啟用舊版 Windows 支援

若您從未在叢集上啟用 Windows 支援,請跳至下一個步驟。

若在早於先決條件中所列 Kubernetes 或平台版本的叢集上啟用 Windows 支援,則必須先從資料平面中移除 vpc-resource-controller 和 vpc-admission-webhook。其將遭取代,且未來不再需要。

為叢集啟用 Windows 支援
  1. 若叢集中沒有 Amazon Linux 節點,並且使用 Pods 的安全群組,請跳至下一個步驟。否則,請確認 AmazonEKSVPCResourceController 受管政策會連接至叢集角色。使用您的叢集角色名稱取代 eksClusterRole

    aws iam list-attached-role-policies --role-name eksClusterRole

    範例輸出如下。

    {
        "AttachedPolicies": [
            {
                "PolicyName": "AmazonEKSClusterPolicy",
                "PolicyArn": "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
            },
            {
                "PolicyName": "AmazonEKSVPCResourceController",
                "PolicyArn": "arn:aws:iam::aws:policy/AmazonEKSVPCResourceController"
            }
        ]
    }

    如果已連接政策 (如上一個輸出所示),請略過下一個步驟。

  2. 亞馬遜 VPC ResourceController 託管策略附加到您的. Amazon EKS 叢集 IAM 角色 使用您的叢集角色名稱取代 eksClusterRole

    aws iam attach-role-policy \ --role-name eksClusterRole \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController
  3. 使用下列內容建立名為 vpc-resource-controller-configmap.yaml 的檔案。

    apiVersion: v1 kind: ConfigMap metadata: name: amazon-vpc-cni namespace: kube-system data: enable-windows-ipam: "true"
  4. ConfigMap 套用至您的叢集。

    kubectl apply -f vpc-resource-controller-configmap.yaml
  5. 確認您的 aws-auth ConfigMap 包含 Windows 節點執行個體角色的對應,以包含 eks:kube-proxy-windows RBAC 許可群組。您可以透過執行以下命令來驗證。

    kubectl get configmap aws-auth -n kube-system -o yaml

    範例輸出如下。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: aws-auth
      namespace: kube-system
    data:
      mapRoles: |
        - groups:
          - system:bootstrappers
          - system:nodes
          - eks:kube-proxy-windows # This group is required for Windows DNS resolution to work
          rolearn: arn:aws:iam::111122223333:role/eksNodeRole
          username: system:node:{{EC2PrivateDNSName}}
    [...]
    

    您應該會在群組下看到 eks:kube-proxy-windows 列出。如果未指定群組,您需要更新 ConfigMap 或建立群組以包含所需的群組。如需 aws-auth ConfigMap 的詳細資訊,請參閱 將 aws-authConfigMap 套用至您的叢集

從資料平面中移除舊版 Windows 支援

若在早於先決條件中所列 Kubernetes 或平台版本的叢集上啟用 Windows 支援,則必須先從資料平面中移除 vpc-resource-controllervpc-admission-webhook。其將遭取代,且未來不再需要,因為現已在控制平面上啟用其所提供之功能。

  1. 可使用以下命令解除安裝 vpc-resource-controller。不論最初使用哪個工具進行安裝,都請使用這個命令。使用叢集所在的 AWS 區域 取代 region-code (只有在 /manifests/ 之後的該文字其執行個體)。

    kubectl delete -f https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-resource-controller/latest/vpc-resource-controller.yaml
  2. 按照安裝時所用工具的說明來解除安裝 vpc-admission-webhook

    eksctl

    執行下列命令。

    kubectl delete deployment -n kube-system vpc-admission-webhook kubectl delete service -n kube-system vpc-admission-webhook kubectl delete mutatingwebhookconfigurations.admissionregistration.k8s.io vpc-admission-webhook-cfg
    kubectl on macOS or Windows

    執行下列命令。region-code(僅在之後的文本實例/manifests/)替換為您 AWS 區域 的集群所在的位置。

    kubectl delete -f https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml
  3. 為在控制平面上的叢集啟用 Windows 支援

停用 Windows 支援

停用叢集上的 Windows 支援
  1. 若叢集包含 Amazon Linux 節點,並且搭配使用 Pods 的安全群組,則請跳過這個步驟。

    叢集角色中移除 AmazonVPCResourceController 受管 IAM 政策。使用您的叢集角色名稱取代 eksClusterRole,再以帳戶 ID 取代 111122223333

    aws iam detach-role-policy \ --role-name eksClusterRole \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController
  2. 在中停用 Windows IPAM。amazon-vpc-cni ConfigMap

    kubectl patch configmap/amazon-vpc-cni \ -n kube-system \ --type merge \ -p '{"data":{"enable-windows-ipam":"false"}}'

部署 Pod

在將 Pod 部署到叢集時,您需要指定在執行混合節點類型時所使用的作業系統。

對於 Linux Pods,請在清單檔案中使用以下節點選取器文字。

nodeSelector: kubernetes.io/os: linux kubernetes.io/arch: amd64

對於 Windows Pods,請在清單檔案中使用以下節點選取器文字。

nodeSelector: kubernetes.io/os: windows kubernetes.io/arch: amd64

您可以部署範例應用程式來查看正在使用的節點選擇器。

啟用舊版 Windows 支援

若叢集不屬於先決條件所列出的 Kubernetes 與平台版本其中的一個版本或更新的版本,則我們建議您改為在控制平面上啟用 Windows 支援。如需詳細資訊,請參閱 啟用 Windows 支援

若叢集或平台版本早於先決條件所列的版本時,您可以參考以下步驟以協助您為 Amazon EKS 叢集的資料平面啟用舊版 Windows 支援。當叢集和平台版本為先決條件所列的版本或更新的版本時,我們建議您移除舊版 Windows 支援為控制平面啟用 Windows 支援

您可以使用 eksctl、Windows 用戶端、macOS 或 Linux 用戶端來為叢集啟用舊版 Windows 支援。

eksctl
為搭配使用 eksctl 的叢集啟用舊版 Windows 支援
先決條件

此程序需要 eksctl 版本 0.183.0 或更新版本。您可使用以下命令檢查您的版本。

eksctl version

如需安裝或升級 eksctl 的詳細資訊,請參閱 eksctl 文件中的 Installation 一節。

  1. 使用以下 eksctl 命令以為 Amazon EKS 叢集啟用 Windows 支援。使用您叢集的名稱取代 my-cluster。此命令會在 Amazon EKS 叢集上部署執行 Windows 工作負載所需的 VPC 資源控制器和 VPC 許可控制器 Webhook。

    eksctl utils install-vpc-controllers --cluster my-cluster --approve
    重要

    VPC 許可控制器 Webhook 使用憑證簽署,該憑證在發行日期後一年到期。若要避免停機時間,請務必在憑證到期之前續約憑證。如需詳細資訊,請參閱 續約 VPC 許可 Webhook 憑證

  2. 啟用 Windows 支援以後,您可以在叢集中啟動 Windows 節點群組。如需詳細資訊,請參閱 正在啟動自我管理的 Windows 節點

Windows
使用 Windows 用戶端為叢集啟用舊版 Windows 支援

在以下步驟中,以您叢集所在的 AWS 區域 取代 region-code

  1. 將 VPC 資源控制器部署到您的叢集。

    kubectl apply -f https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-resource-controller/latest/vpc-resource-controller.yaml
  2. 將 VPC 許可控制器 Webhook 部署到您的叢集。

    1. 下載必要的指令碼和部署檔案。

      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml; curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/Setup-VPCAdmissionWebhook.ps1; curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/webhook-create-signed-cert.ps1; curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/webhook-patch-ca-bundle.ps1;
    2. 安裝 OpenSSLjq

    3. 設定和部署 VPC 許可 Webhook。

      ./Setup-VPCAdmissionWebhook.ps1 -DeploymentTemplate ".\vpc-admission-webhook-deployment.yaml"
      重要

      VPC 許可控制器 Webhook 使用憑證簽署,該憑證在發行日期後一年到期。若要避免停機時間,請務必在憑證到期之前續約憑證。如需詳細資訊,請參閱 續約 VPC 許可 Webhook 憑證

  3. 判斷您的叢集是否具有必要的叢集角色繫結。

    kubectl get clusterrolebinding eks:kube-proxy-windows

    如果傳回類似下列範例輸出的輸出,則叢集具有必要的角色繫結。

    NAME AGE eks:kube-proxy-windows 10d

    如果輸出包含 Error from server (NotFound),則叢集沒有必要的叢集角色繫結。建立具有下列內容且名為 eks-kube-proxy-windows-crb.yaml 的檔案,以新增繫結。

    kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: eks:kube-proxy-windows labels: k8s-app: kube-proxy eks.amazonaws.com/component: kube-proxy subjects: - kind: Group name: "eks:kube-proxy-windows" roleRef: kind: ClusterRole name: system:node-proxier apiGroup: rbac.authorization.k8s.io

    將組態套用至叢集。

    kubectl apply -f eks-kube-proxy-windows-crb.yaml
  4. 啟用 Windows 支援以後,您可以在叢集中啟動 Windows 節點群組。如需詳細資訊,請參閱 正在啟動自我管理的 Windows 節點

macOS and Linux
使用 macOS 或 Linux 用戶端為叢集啟用舊版 Windows 支援

此程序需要將 openssl 程式庫和 jq JSON 處理器安裝在用戶端系統上。

在以下步驟中,以您叢集所在的 AWS 區域 取代 region-code

  1. 將 VPC 資源控制器部署到您的叢集。

    kubectl apply -f https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-resource-controller/latest/vpc-resource-controller.yaml
  2. 為您的叢集建立 VPC 許可控制器 Webhook 清單檔案。

    1. 下載必要的指令碼和部署檔案。

      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/webhook-create-signed-cert.sh curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/webhook-patch-ca-bundle.sh curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml
    2. 將許可新增到 Shell 指令碼,以便可以執行它們。

      chmod +x webhook-create-signed-cert.sh webhook-patch-ca-bundle.sh
    3. 建立安全通訊的密碼。

      ./webhook-create-signed-cert.sh
    4. 驗證密碼。

      kubectl get secret -n kube-system vpc-admission-webhook-certs
    5. 設定 Webhook 並建立部署檔案。

      cat ./vpc-admission-webhook-deployment.yaml | ./webhook-patch-ca-bundle.sh > vpc-admission-webhook.yaml
  3. 部署 VPC 許可 Webhook。

    kubectl apply -f vpc-admission-webhook.yaml
    重要

    VPC 許可控制器 Webhook 使用憑證簽署,該憑證在發行日期後一年到期。若要避免停機時間,請務必在憑證到期之前續約憑證。如需詳細資訊,請參閱 續約 VPC 許可 Webhook 憑證

  4. 判斷您的叢集是否具有必要的叢集角色繫結。

    kubectl get clusterrolebinding eks:kube-proxy-windows

    如果傳回類似下列範例輸出的輸出,則叢集具有必要的角色繫結。

    NAME ROLE AGE eks:kube-proxy-windows ClusterRole/system:node-proxier 19h

    如果輸出包含 Error from server (NotFound),則叢集沒有必要的叢集角色繫結。建立具有下列內容且名為 eks-kube-proxy-windows-crb.yaml 的檔案,以新增繫結。

    kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: eks:kube-proxy-windows labels: k8s-app: kube-proxy eks.amazonaws.com/component: kube-proxy subjects: - kind: Group name: "eks:kube-proxy-windows" roleRef: kind: ClusterRole name: system:node-proxier apiGroup: rbac.authorization.k8s.io

    將組態套用至叢集。

    kubectl apply -f eks-kube-proxy-windows-crb.yaml
  5. 啟用 Windows 支援以後,您可以在叢集中啟動 Windows 節點群組。如需詳細資訊,請參閱 正在啟動自我管理的 Windows 節點

續約 VPC 許可 Webhook 憑證

VPC 許可 Webhook 使用的憑證會在發行後一年到期。若要避免停機時間,請務必在其過期之前續約憑證。您可以使用以下命令檢查目前憑證的過期日期。

kubectl get secret \ -n kube-system \ vpc-admission-webhook-certs -o json | \ jq -r '.data."cert.pem"' | \ base64 -decode | \ openssl x509 \ -noout \ -enddate | \ cut -d= -f2

範例輸出如下。

May 28 14:23:00 2022 GMT

您可以使用 eksctl 或 Windows,或者是 Linux/macOS 電腦來續約憑證。請依照您原本用於裝 VPC 許可 Webhook 的工具指示進行操作。例如,如果您最初使用 eksctl 安裝 VPC 許可 Webhook,那麼您應該使用 eksctl 標籤上的指示續約憑證。

eksctl
  1. 重新安裝憑證。使用您叢集的名稱取代 my-cluster

    eksctl utils install-vpc-controllers -cluster my-cluster -approve
  2. 確認您收到下列輸出。

    2021/05/28 05:24:59 [INFO] generate received request
    2021/05/28 05:24:59 [INFO] received CSR
    2021/05/28 05:24:59 [INFO] generating key: rsa-2048
    2021/05/28 05:24:59 [INFO] encoded CSR
  3. 重新啟動 Webhook 部署。

    kubectl rollout restart deployment -n kube-system vpc-admission-webhook
  4. 若續約的憑證已過期,且您有陷於 Container creating 狀態的 Windows Pods,則您必須刪除並重新部署這些 Pods。

Windows
  1. 取得指令碼以產生新憑證。

    curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/webhook-create-signed-cert.ps1;
  2. 準備指令碼的參數。

    ./webhook-create-signed-cert.ps1 -ServiceName vpc-admission-webhook-svc -SecretName vpc-admission-webhook-certs -Namespace kube-system
  3. 重新啟動 Webhook 部署。

    kubectl rollout restart deployment -n kube-system vpc-admission-webhook-deployment
  4. 若續約的憑證已過期,且您有陷於 Container creating 狀態的 Windows Pods,則您必須刪除並重新部署這些 Pods。

Linux and macOS
先決條件

您必須在電腦上安裝 OpenSSL 和 jq

  1. 取得指令碼以產生新憑證。

    curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/webhook-create-signed-cert.sh
  2. 變更許可。

    chmod +x webhook-create-signed-cert.sh
  3. 執行指令碼。

    ./webhook-create-signed-cert.sh
  4. 重新啟動 Webhook。

    kubectl rollout restart deployment -n kube-system vpc-admission-webhook-deployment
  5. 若續約的憑證已過期,且您有陷於 Container creating 狀態的 Windows Pods,則您必須刪除並重新部署這些 Pods。

在 Windows 節點上支援更多數量的 Pod

在 Amazon EKS 中,每個 Pod 都會從您的 VPC 配置一個 IPv4 地址。因此,即使有足夠的資源可以在節點上執行更多 Pods,您能部署到節點的 Pods 數量也會受到可用 IP 地址的限制。由於 Windows 節點僅支援一個彈性網路介面,因此依預設,Windows 節點上可用 IP 地址的數量上限為:

Number of private IPv4 addresses for each interface on the node - 1

一個 IP 地址用作網路介面的主要 IP 地址,因此無法將其配置給 Pods。

您可以啟用 IP 字首委派,在 Windows 節點上啟用更多數量的 Pod。此功能可讓您將 /28 IPv4 字首指派給主要網路介面,而不是指派次要 IPv4 位址。而指派 IP 字首會將節點上可用 IPv4 地址的數量上限增加到:

(Number of private IPv4 addresses assigned to the interface attached to the node - 1) * 16

由於可用 IP 地址的數量大幅增加,可用的 IP 地址不應限制您擴展節點上 Pods 數量的能力。如需更多詳細資訊,請參閱 增加 Amazon EC2 節點的可用 IP 地址數量