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

为 Amazon EKS 集群启用 Windows 支持

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

注意事项
  • Windows 工作负载不支持 Amazon EC2 实例类型 C3C4D2I2M4(不包括 m4.16xlarge)、M6a.xR3 实例。

  • Windows 工作负载不支持主机联网模式。

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

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

  • 您不能将 教程:适用于 pods 的安全组 用于在 Windows 节点上运行的 pods。

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

  • 您不能将 IP 前缀用于 Windows 节点。这是使用 IPv6 的要求,因此您也不能将 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 容器组(pod)不支持 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.25 eks.1
    1.24 eks.2
    1.23 eks.1
    1.22 eks.1
    1.21 eks.3
    1.20 eks.3
  • 您的集群必须至少有一个(我们建议至少有两个)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

从数据面板中删除旧版 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 policy。将 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.135.0 或更高版本。可以使用以下命令来查看您的版本。

eksctl version

有关安装或升级 eksctl 的更多信息,请参阅安装或更新 eksctl

  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 并重新部署。