

 **協助改進此頁面** 

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

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

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

# 在 EKS 叢集上部署 Windows 節點
<a name="windows-support"></a>

了解如何啟用及管理對 Amazon EKS 叢集的 Windows 支援，以便同時執行 Linux 容器與 Windows 容器。

## 考量事項
<a name="_considerations"></a>

部署 Windows 工作節點之前，請注意下列考量事項。
+ EKS 自動模式不支援 Windows 節點
+ 您可以透過 `HostProcess` Pod 在 Windows 節點上使用主機聯網。如需詳細資訊，請參閱 Kubernetes 文件中的[建立 Windows HostProcessPod](https://kubernetes.io/docs/tasks/configure-pod-container/create-hostprocess-pod/)。
+ Amazon EKS 叢集必須包含一或多個 Linux 或 Fargate 節點，才能執行只在 Linux 上執行的核心系統 Pod，例如 CoreDNS。
+ `kubelet` 和 `kube-proxy` 事件日誌會重新導向至 `EKS Windows` 事件日誌，且其限制會設定為 200 MB。
+ 您不能對在 Windows 節點上執行 Pod 使用[指派安全群組給個別 Pod](security-groups-for-pods.md)。
+ 您不能將[自訂聯網](cni-custom-network.md)與 Windows 節點搭配使用。
+ 您不能將 `IPv6` 與 Windows 節點搭配使用。
+ Windows 節點支援每個節點一個彈性網路介面。依預設，每個 Windows 節點可以執行的 Pod 數量，等於節點執行個體類型的每個彈性網路介面可用的 IP 位址數量減去一。如需詳細資訊，請參閱 *Amazon EC2 使用者指南*中的[每個執行個體類型每個網路介面的 IP 位址](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/using-eni.html#AvailableIpPerENI)。
+ 在 Amazon EKS 叢集中，具有負載平衡器的單一服務最多可支援 1024 個後端 Pod。每個 Pod 都有自己的唯一 IP 地址。自 [OS Build 17763.2746](https://support.microsoft.com/en-us/topic/march-22-2022-kb5011551-os-build-17763-2746-preview-690a59cd-059e-40f4-87e8-e9139cc65de4) 起的 [Windows Server 更新](https://github.com/microsoft/Windows-Containers/issues/93)後，過去的 64 個 Pod 限制已不存在。
+ Windows 容器不支援 Fargate 上的 Amazon EKS Pod。
+ Windows 作為主機的作業系統時，您不能使用 Amazon EKS 混合節點。
+ 無法從 `vpc-resource-controller` Pod 擷取日誌。您先前在將控制器部署到資料平面時可以這麼做。
+ 在將 `IPv4` 地址指派給新的 Pod 之前，有一段冷卻期間。這可以防止流量因 `kube-proxy` 規則過時而流動到具有相同 `IPv4` 地址的較舊 Pod。
+ 在 GitHub 上管理控制器的來源。若要對控制器做出貢獻或提出問題，請造訪 GitHub 上的[專案](https://github.com/aws/amazon-vpc-resource-controller-k8s)。
+ 為 Windows 受管節點群組指定自訂 AMI ID 時，請將 `eks:kube-proxy-windows`新增至您的 AWS IAM Authenticator 組態映射。如需詳細資訊，請參閱[指定 AMI ID 時的限制和條件](launch-templates.md#mng-ami-id-conditions)。
+ 若保留您的可用 IPv4 位址對於子網路非常重要，請參閱 [EKS 最佳實務指南 - Windows 網路 IP 位址管理](https://aws.github.io/aws-eks-best-practices/windows/docs/networking/#ip-address-management)來獲取指引。
+ EKS 存取項目考量
  + 若搭配 Windows 節點使用存取項目，需要使用類型 `EC2_WINDOWS`。如需詳細資訊，請參閱[建立存取項目](creating-access-entries.md)。

    如需建立適用於 Windows 節點的存取項目：

    ```
    aws eks create-access-entry --cluster-name my-cluster --principal-arn arn:aws: iam::111122223333:role/<role-name> --type EC2_Windows
    ```

## 先決條件
<a name="_prerequisites"></a>
+ 現有的叢集。
+ 叢集必須至少有一個 (建議至少有兩個) Linux 節點或 Fargate Pod，才能執行 CoreDNS。如果啟用舊式 Windows 支援，則必須使用 Linux 節點 (不能使用 Fargate Pod) 來執行 CoreDNS。
+ 現有的 [Amazon EKS 叢集 IAM 角色](cluster-iam-role.md)。

## 啟用 Windows 支援
<a name="enable-windows-support"></a>

1. 如果叢集中沒有 Amazon Linux 節點，並且使用 Pod 的安全群組，請跳至下一個步驟。否則，請確認 `AmazonEKSVPCResourceController` 受管政策會連接至[叢集角色](cluster-iam-role.md)。使用叢集角色名稱取代 *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"
           }
       ]
   }
   ```

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

1. 連接 **[AmazonEKSVPCResourceController](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKSVPCResourceController.html)** 受管政策至您的 [Amazon EKS 叢集 IAM 角色](cluster-iam-role.md)。使用叢集角色名稱取代 *eksClusterRole*。

   ```
   aws iam attach-role-policy \
     --role-name eksClusterRole \
     --policy-arn arn:aws: iam::aws:policy/AmazonEKSVPCResourceController
   ```

1. 更新 VPC CNI ConfigMap 以啟用 Windows IPAM。請注意，若使用 Helm Chart 在叢集上安裝 VPC CNI，或作為 Amazon EKS 附加元件，可能無法直接修改 ConfigMap。若要了解設定 Amazon EKS 附加元件的相關資訊，請參閱 [確定您可為 Amazon EKS 附加元件自訂的欄位](kubernetes-field-management.md)。

   1. 使用下列內容，建立名為 *vpc-resource-controller-configmap.yaml* 的檔案。

      ```
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: amazon-vpc-cni
        namespace: kube-system
      data:
        enable-windows-ipam: "true"
      ```

   1. 將 `ConfigMap` 套用至您的叢集。

      ```
      kubectl apply -f vpc-resource-controller-configmap.yaml
      ```

1. 若叢集的驗證模式已設定為啟用 `aws-auth` configmap：
   + 請確認您的 `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-auth` `ConfigMap` 套用至您的叢集](auth-configmap.md#aws-auth-configmap)。

1. 若叢集的驗證模式已設定為停用 `aws-auth` configmap，則您可使用 EKS 存取項目。建立新的節點角色，以便與 Windows 執行個體配合使用，並且 EKS 將自動建立類型為 `EC2_WINDOWS` 的存取項目。

## 部署 Windows Pod
<a name="windows-support-pod-deployment"></a>

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

對於 Linux Pod，請在清單檔案中使用下列節點選取器文字。

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

對於 Windows Pod，請在清單檔案中使用下列節點選取器文字。

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

您可以部署[範例應用程式](sample-deployment.md)來查看正在使用的節點選擇器。

## 在 Windows 節點上支援更多數量的 Pod
<a name="windows-support-pod-density"></a>

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

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

一個 IP 位址用作網路介面的主要 IP 位址，因此無法將其配置給 Pod。

您可以啟用 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 位址不應限制您擴展節點上 Pod 數量的能力。如需詳細資訊，請參閱[將更多 IP 位址指派給具有字首的 Amazon EKS 節點](cni-increase-ip-addresses.md)。