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

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

Windows 支持

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

Considerations

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

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

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

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

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

  • 您不能将 Pod 的安全组 与 Windows 节点上运行的 Pod 一起使用。

  • Windows 节点支持每个节点一个弹性网络接口。每个 Windows 节点可以运行的 Pod 数等于每个弹性网络接口对于节点的实例类型可用的 IP 地址数减 1。有关更多信息,请参阅 https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI 中的每个实例类型的每个网络接口的 IP 地址Amazon EC2 用户指南(适用于 Linux 实例)。

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

启用 Windows 支持

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

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

此过程仅适用于使用 eksctl 创建的集群,并假定您的 eksctl 版本为 0.35.0 或更高版本。可以使用以下命令来查看您的版本。

eksctl version

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

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

    eksctl utils install-vpc-controllers --cluster <cluster_name> --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 支持

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

  1. 使用与集群所在的区域对应的命令将 VPC 资源控制器部署到集群。

    • 和 中国(北京) 之外的所有区域中国 (宁夏)

      kubectl apply -f https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/<region-code>/vpc-resource-controller/latest/vpc-resource-controller.yaml
    • 中国(北京) 和 中国 (宁夏)

      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 vpc-admission-webhook-deployment.yaml https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/<region-code>/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml; curl -o Setup-VPCAdmissionWebhook.ps1 https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/<region-code>/vpc-admission-webhook/latest/Setup-VPCAdmissionWebhook.ps1; curl -o webhook-create-signed-cert.ps1 https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/<region-code>/vpc-admission-webhook/latest/webhook-create-signed-cert.ps1; curl -o webhook-patch-ca-bundle.ps1 https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/<region-code>/vpc-admission-webhook/latest/webhook-patch-ca-bundle.ps1;
      • 中国(北京) 和 中国 (宁夏)

        curl -o vpc-admission-webhook-deployment.yaml https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/<region-code>/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/<region-code>/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/<region-code>/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/<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"
  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 或 Linux 客户端为集群启用 Windows 支持

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

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

  1. 使用与集群所在的区域对应的命令将 VPC 资源控制器部署到集群。

    • 和 中国(北京) 之外的所有区域中国 (宁夏)

      kubectl apply -f https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/<region-code>/vpc-resource-controller/latest/vpc-resource-controller.yaml
    • 中国(北京) 和 中国 (宁夏)

      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 webhook-create-signed-cert.sh https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/<region-code>/vpc-admission-webhook/latest/webhook-create-signed-cert.sh curl -o webhook-patch-ca-bundle.sh https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/<region-code>/vpc-admission-webhook/latest/webhook-patch-ca-bundle.sh curl -o vpc-admission-webhook-deployment.yaml https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/<region-code>/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml
      • 中国(北京) 和 中国 (宁夏)

        curl -o webhook-create-signed-cert.sh https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/<region-code>/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/<region-code>/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/<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
  4. 确定您的集群是否具有所需的集群角色绑定。

    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
  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. 使用以下内容创建名为 windows-server-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 浏览器中加载可能需要几分钟时间。