

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 在 EKS 集群上部署 Windows 节点
启用 Windows 支持

了解如何为 Amazon EKS 集群启用和管理 Windows 支持，以便同时运行 Windows 容器和 Linux 容器。

## 注意事项


在部署 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` 事件日志，并设置为 200MB 限制。
+ 您不能对在 Windows 节点上运行的容器组（pod）使用[将安全组分配到单个容器组（pod）](security-groups-for-pods.md)。
+ 您不能对 Windows 节点使用[自定义联网](cni-custom-network.md)。
+ 您不能将 `IPv6` 与 Windows 节点结合使用。
+ Windows 节点支持每个节点一个弹性网络接口。默认情况下，每个 Windows 节点可以运行的容器组（pod）数等于每个弹性网络接口可用于节点实例类型的 IP 地址数减 1。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[每种实例类型的每个网络接口的 IP 地址数](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/using-eni.html#AvailableIpPerENI)。
+ 在 Amazon EKS 集群中，采用负载均衡器的单个服务最多可支持 1024 个后端容器组（pod）。每个 Pod 都有自己的唯一 IP 地址。对于从 [OS 内部版本 17763.2746](https://support.microsoft.com/en-us/topic/march-22-2022-kb5011551-os-build-17763-2746-preview-690a59cd-059e-40f4-87e8-e9139cc65de4) 开始的 [Windows 服务器更新](https://github.com/microsoft/Windows-Containers/issues/93)，之前的 64 个 容器组（pod）限制已经没有了。
+ Fargate 上的 Amazon EKS 容器组（pod）不支持 Windows 容器。
+ 不能使用将 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 身份验证器配置映射中。有关更多信息，请参阅 [指定 AMI ID 时的限制和条件](launch-templates.md#mng-ami-id-conditions)。
+ 如果保留可用的 IPv4 地址对您的子网至关重要，请参阅 [EKS Best Practices Guide - Windows Networking IP Address Management](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
    ```

## 先决条件

+ 现有集群。
+ 您的集群必须至少有一个（我们建议至少有两个）Linux 节点或 Fargate 容器组（pod）才能运行 CoreDNS。如果您启用旧版 Windows 支持，则必须使用 Linux 节点而非 Fargate 容器组（pod）来运行 CoreDNS。
+ 现有 [Amazon EKS 集群 IAM 角色](cluster-iam-role.md)。

## 启用 Windows 支持


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 图表或作为 Amazon EKS 附加组件将 VPC CNI 安装在您的集群上，则可能无法直接修改 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）


将容器组（pod）部署到集群时，如果您运行的是多种不同类型的节点，则需要指定这些容器组（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）密度


在 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）数量的能力。有关更多信息，请参阅 [为带前缀的 Amazon EKS 节点分配更多 IP 地址](cni-increase-ip-addresses.md)。