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

Windows 支持

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

注意事项

  • Amazon EC2 实例类型 C3、C4、D2、I2、M4(不包括 m4.16xlarge)、M6a.x 和 R3 实例不支持 Windows 工作负载。

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

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

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

  • 您不能将 适用于 Pod 的安全组 和在 Windows 节点上运行的 Pod 结合使用。

  • 无法对 Windows 节点使用自定义联网

  • 无法对 Windows 节点使用 IP 前缀。这是使用 IPv6 的要求,因此无法将 IPv6 与 Windows 节点一起使用。

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

  • 在 Amazon EKS 集群中,采用负载均衡器的单个服务最多可支持 64 个后端 Pod。每个 Pod 都有自己的唯一 IP 地址。这是 Amazon EC2 节点上 Windows 操作系统的限制。

  • 您无法部署 Windows 托管节点或 Fargate 节点。您只能创建自行管理的 Windows 节点。有关更多信息,请参阅 启动自行管理 Windows 节点

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

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

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

先决条件

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

    Kubernetes 版本 平台版本
    1.21 eks.3
    1.20 eks.3
    1.19 eks.7
    1.18 eks.9
    1.17 eks.10

    您的集群必须至少有一个(我们建议至少有两个)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 节点并且对 Pod 使用安全组,请跳至下一步。否则,请确认 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。无论您原来使用哪种工具安装它,现在都请使用此命令。将 cn-north-1(仅 /manifests/ 之后的文本实例)替换为集群所在的区域。

    kubectl delete -f https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/manifests/cn-north-1/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

    运行以下命令。将 cn-north-1(仅 /manifests/ 之后的文本实例)替换为集群所在的区域。

    kubectl delete -f https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/manifests/cn-north-1/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml
  3. 在控制面板上为集群启用 Windows 支持

禁用 Windows 支持

在集群上禁用 Windows 支持

  1. 如果您的集群包含 Amazon Linux 节点,并且您对这些节点使用 Pod 安全组,请跳过此步骤。

    从您的集群角色中删除 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 Pod,请在清单中使用以下节点选择器文本。

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

对于 Windows Pod,请使用清单中的以下节点选择器文本。

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

可以部署一款示例应用程序,以查看正在使用的节点选择器。

启用旧式 Windows 支持

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

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

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

eksctl

使用 eksctl 为您的集群启用旧式 Windows 支持

先决条件

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

在以下步骤中,将 cn-north-1 替换为集群所在的区域。

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

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

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

      curl -o vpc-admission-webhook-deployment.yaml https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/manifests/cn-north-1/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml; curl -o Setup-VPCAdmissionWebhook.ps1 https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/manifests/cn-north-1/vpc-admission-webhook/latest/Setup-VPCAdmissionWebhook.ps1; curl -o webhook-create-signed-cert.ps1 https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/manifests/cn-north-1/vpc-admission-webhook/latest/webhook-create-signed-cert.ps1; curl -o webhook-patch-ca-bundle.ps1 https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/manifests/cn-north-1/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 替换为您的集群所在的区域。

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

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

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

      curl -o webhook-create-signed-cert.sh https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/manifests/cn-north-1/vpc-admission-webhook/latest/webhook-create-signed-cert.sh curl -o webhook-patch-ca-bundle.sh https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/manifests/cn-north-1/vpc-admission-webhook/latest/webhook-patch-ca-bundle.sh curl -o vpc-admission-webhook-deployment.yaml https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/manifests/cn-north-1/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. 重新安装证书。将 <cluster-name>(包括 <>)替换为您集群的名称。

    eksctl utils install-vpc-controllers -cluster <cluster-name> -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 Pod 卡在 Container creating 状态,则必须删除这些 Pod 并重新部署。

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

    curl -o webhook-create-signed-cert.ps1 https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/cn-north-1/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 Pod 卡在 Container creating 状态,则必须删除这些 Pod 并重新部署。

Linux and macOS

先决条件

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

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

    curl -o webhook-create-signed-cert.sh \ https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/cn-north-1/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 Pod 卡在 Container creating 状态,则必须删除这些 Pod 并重新部署。