在 EKS 集群上部署 Windows 节点 - Amazon EKS

帮助改进此页面

想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。

在 EKS 集群上部署 Windows 节点

在部署 Windows 节点之前,请了解以下注意事项。

注意事项
  • 您可以使用 HostProcess 容器组(pod)在 Windows 节点上使用主机网络。有关更多信息,请参阅 Kubernetes 文档中的创建 Windows HostProcessPod

  • Amazon EKS 集群必须包含一个或多个 Linux 或 Fargate 节点,才能运行仅在 Linux 上运行的核心系统 Pods,如 CoreDNS。

  • kubeletkube-proxy 事件日志将重定向到 EKS Windows 事件日志,并设置为 200MB 限制。

  • 您不能将 将安全组分配到单个 pods 用于在 Windows 节点上运行的 Pods。

  • 您不能将自定义联网用于 Windows 节点。

  • 您不可以将 IPv6 与 Windows 节点一起使用。

  • Windows 节点支持每个节点一个弹性网络接口。默认情况下,每个 Windows 节点可以运行的 Pods 数等于每个弹性网络接口可用于节点实例类型的 IP 地址数减 1。有关更多信息,请参阅《Amazon EC2 用户指南》中的每种实例类型的每个网络接口的 IP 地址数

  • 在 Amazon EKS 集群中,采用负载均衡器的单个服务最多可支持 1024 个后端 Pods。每个 Pod 都有自己的唯一 IP 地址。对于从 操作系统构建 17763.2746 开始的 Windows 服务器更新,之前的 64 个 Pods 限制已经没有了。

  • Fargate 上的 Amazon EKS Pods 不支持 Windows 容器。

  • 无法从 vpc-resource-controller Pod 检索日志。以前在将此控制器部署到数据面板时则可以检索。

  • 在将 IPv4 地址分配给新容器组(pod)之前,会有一段“冷却”时间。这样可以防止流量因过时的 kube-proxy 规则而流向具有相同 IPv4 地址的旧容器组(pod)。

  • 该控制器的源代码在 GitHub 上进行管理。要为该控制器贡献代码或提交针对该控制器的问题,请访问 GitHub 上的相应项目

  • 为 Windows 托管节点组指定自定义 AMI ID 时,请将 eks:kube-proxy-windows 添加到您的 AWS IAM 身份验证器配置映射中。有关更多信息,请参阅 指定 AMI ID 时的限制和条件

  • 如果保留可用的 IPv4 地址对您的子网至关重要,请参阅 EKS Best Practices Guide - Windows Networking IP Address Management 以获取指导。

先决条件
  • 现有集群。该集群必须运行下表中列出的 Kubernetes 版本和平台版本之一。所有比所列版本更高的 Kubernetes 和平台版本也受支持。

    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 支持

为集群启用 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. AmazonEKSVPCResourceController 托管策略附加到您的 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 容器组(pod)

将 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 节点上支持更高的 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 EKS 节点分配更多 IP 地址