为 Amazon EKS 集群启用 Windows 支持 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为 Amazon 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。有关更多信息,请参阅适用于 Windows 实例的 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 添加到您的 Amazon IAM 身份验证器配置映射中。有关更多信息,请参阅 指定 AMI ID 时的限制和条件

先决条件
  • 现有集群。该集群必须运行下表中列出的 Kubernetes 版本和平台版本之一。所有比所列版本更高的 Kubernetes 和平台版本也受支持。如果您的集群或平台版本早于以下版本之一,则需要在集群的数据面板上启用旧版 Windows 支持。如果您的集群为以下 Kubernetes 和平台版本之一或更高版本,您可以在控制面板上删除旧版 Windows 支持启用 Windows 支持

    Kubernetes 版本 平台版本
    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. 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 支持

如果您在早于先决条件列出的 Kubernetes 或平台版本的集群上启用了 Windows 支持,则必须先从数据面板中删除 vpc-resource-controllervpc-admission-webhook。它们已被弃用,现已不再需要,因为它们提供的功能现已在控制面板上启用。

  1. 可以使用以下命令卸载 vpc-resource-controller。无论您原来使用哪种工具安装它,现在都请使用此命令。region-code(仅 /manifests/ 之后的文本实例)替换为集群所在的 Amazon Web Services 区域。

    kubectl delete -f https://s3.cn-north-1.amazonaws.com.cn/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/ 之后的文本实例)替换为集群所在的 Amazon Web Services 区域。

    kubectl delete -f https://s3.cn-north-1.amazonaws.com.cn/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 替换为集群角色的名称,并将 111122223333 替换为您的账户 ID。

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

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

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

如果您的集群是先决条件部分中列出的 Kubernetes 和平台版本之一或更高版本,我们建议在控制面板上启用 Windows 支持。有关更多信息,请参阅 启用 Windows 支持

如果您的集群或平台版本早于先决条件部分中列出的版本,则按照以下步骤操作有助于您为 Amazon EKS 集群的数据面板启用旧版 Windows 支持。如果您的集群和平台版本是先决条件部分中列出的版本或更高版本,我们建议您删除旧版 Windows 支持为控制面板启用新版支持

您可以使用 eksctl、Windows 客户端或者 macOS 或 Linux 客户端为集群启用旧版 Windows 支持。

eksctl
使用 eksctl 为您的集群启用旧版 Windows 支持
先决条件

此过程需要 eksctl 版本 0.175.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 支持

在以下步骤中,将 region-code 替换为您的集群所在的 Amazon Web Services 区域。

  1. 将 VPC 资源控制器部署到您的集群。

    kubectl apply -f https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code/vpc-resource-controller/latest/vpc-resource-controller.yaml
  2. 将 VPC 准入控制器 Webhook 部署到您的集群。

    1. 下载所需的脚本和部署文件。

      curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml; curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/Setup-VPCAdmissionWebhook.ps1; curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/webhook-create-signed-cert.ps1; curl -O https://s3.cn-north-1.amazonaws.com.cn/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 处理器。

在以下步骤中,将 region-code 替换为您的集群所在的 Amazon Web Services 区域。

  1. 将 VPC 资源控制器部署到您的集群。

    kubectl apply -f https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code/vpc-resource-controller/latest/vpc-resource-controller.yaml
  2. 为您的集群创建 VPC 准入控制器 Webhook 清单。

    1. 下载所需的脚本和部署文件。

      curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/webhook-create-signed-cert.sh curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code/vpc-admission-webhook/latest/webhook-patch-ca-bundle.sh curl -O https://s3.cn-north-1.amazonaws.com.cn/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 的工具的说明进行操作。例如,如果您最初安装 VPC 准入 Webhook 使用的是 eksctl,那么您应该根据 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. 如果您更新的证书已过期,并且有 Windows Pods 卡在 Container creating 状态,则必须删除这些 Pods 并重新部署。

Windows
  1. 获取用于生成新证书的脚本。

    curl -O https://s3.cn-north-1.amazonaws.com.cn/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. 如果您更新的证书已过期,并且有 Windows Pods 卡在 Container creating 状态,则必须删除这些 Pods 并重新部署。

Linux and macOS
先决条件

您的计算机上必须已安装了 OpenSSL 和 jq

  1. 获取用于生成新证书的脚本。

    curl -O https://s3.cn-north-1.amazonaws.com.cn/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. 如果您更新的证书已过期,并且有 Windows Pods 卡在 Container creating 状态,则必须删除这些 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 地址数量