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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Windows 支持

本主题介绍如何向 Amazon EKS 集群添加 Windows 支持。

Considerations

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

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

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

  • Amazon EKS 集群必须包含一个或多个 Linux 节点,才能运行仅在 Linux 上运行的核心系统 Pod(如coredns和 VPC 资源控制器。

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

  • 您不能使用窗格的安全组,并在 Windows 节点上运行窗格。

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

  • 低于 1.16 版本的 Amazon EKS 不支持 Windows Pod 和容器的组托管服务账户 (GMSA)。您可以按照 Kubernetes 文档中的说明在 1.16 之前的集群上启用和测试此 Alpha 功能。

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

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

启用 Windows 支持

以下步骤可帮助您为 Amazon EKS 集群启用 Windows 支持。您可以使用eksctl、Windows 客户端或 macOS 或 Linux 客户端,以便为您的集群启用 Windows 支持。

eksctl

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

Prerequisite

此过程需要 eksctl 版本 0.47.0 或更高版本。可以使用以下命令来查看您的版本。

eksctl version

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

  1. 使用以下命令为 Amazon EKS 集群启用 Windows 支持eksctl命令。Replace my-cluster 替换为您集群的名称。此命令部署在 Amazon EKS 集群上运行 Windows 工作负载所需的 VPC 资源控制器和 VPC 准入控制器 Webhook。

    eksctl utils install-vpc-controllers --cluster my-cluster --approve
  2. 启用 Windows 支持后,您可以在集群中启动 Windows 节点组。有关更多信息,请参阅 启动自行管理的 Windows 节点

向集群添加 Windows 支持后,必须在应用程序上指定节点选择器,以便 Pod 位于具有相应操作系统的节点上。对于 Linux Pod,请在清单中使用以下节点选择器文本。

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

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

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

使用 Windows 客户端为您的集群启用 Windows 支持

在以下步骤中,将cn-north-1与您的集群所在的区域一起使用。

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

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

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

      curl -o vpc-admission-webhook-deployment.yaml https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/cn-north-1/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml; curl -o Setup-VPCAdmissionWebhook.ps1 https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/cn-north-1/vpc-admission-webhook/latest/Setup-VPCAdmissionWebhook.ps1; 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; curl -o webhook-patch-ca-bundle.ps1 https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/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"
  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 节点

向集群添加 Windows 支持后,必须在应用程序上指定节点选择器,以便 Pod 位于具有相应操作系统的节点上。对于 Linux Pod,请在清单中使用以下节点选择器文本。

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

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

nodeSelector: kubernetes.io/os: windows kubernetes.io/arch: amd64
macOS and Linux

使用 macOS 或 Linux 客户端为您的集群启用 Windows 支持

此过程要求在客户端系统上安装 openssl 库和 jq JSON 处理器。

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

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

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

    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 curl -o webhook-patch-ca-bundle.sh https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/cn-north-1/vpc-admission-webhook/latest/webhook-patch-ca-bundle.sh curl -o vpc-admission-webhook-deployment.yaml https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/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
  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 节点

向集群添加 Windows 支持后,必须在应用程序上指定节点选择器,以便 Pod 位于具有相应操作系统的节点上。对于 Linux Pod,请在清单中使用以下节点选择器文本。

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

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

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

部署 Windows 示例应用程序

部署 Windows 示例应用程序

  1. 创建一个名为的文件 窗口-服务器-Iis.yaml ,其中包含以下内容。

    apiVersion: apps/v1 kind: Deployment metadata: name: windows-server-iis spec: selector: matchLabels: app: windows-server-iis tier: backend track: stable replicas: 1 template: metadata: labels: app: windows-server-iis tier: backend track: stable spec: containers: - name: windows-server-iis image: mcr.microsoft.com/windows/servercore:1809 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent command: - powershell.exe - -command - "Add-WindowsFeature Web-Server; Invoke-WebRequest -UseBasicParsing -Uri 'https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.6/ServiceMonitor.exe' -OutFile 'C:\\ServiceMonitor.exe'; echo '<html><body><br/><br/><marquee><H1>Hello EKS!!!<H1><marquee></body><html>' > C:\\inetpub\\wwwroot\\default.html; C:\\ServiceMonitor.exe 'w3svc'; " nodeSelector: kubernetes.io/os: windows --- apiVersion: v1 kind: Service metadata: name: windows-server-iis-service namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: windows-server-iis tier: backend track: stable sessionAffinity: None type: LoadBalancer
  2. 将应用程序部署到集群。

    kubectl apply -f windows-server-iis.yaml
  3. 获取 Pod 的状态。

    kubectl get pods -o wide --watch

    等待 Pod 过渡到 Running 状态。

  4. 在您的集群中查询这些服务并等到填充 服务的 External IP (外部 IP)windows-server-iis-service 列。

    注意

    IP 地址可能需要几分钟才能变为可用。

    kubectl get services -o wide
  5. 在您的外部 IP 地址可用后,将 Web 浏览器指向该地址以查看 IIS 主页。

    注意

    DNS 传播和示例应用程序在 Web 浏览器中加载可能需要几分钟时间。