Windows 支持 - Amazon EKS

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。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南 中的每个实例类型的每个网络接口的 IP 地址

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

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

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

启用 Windows 支持

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

eksctl

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

Prerequisite

此过程需要 eksctl 版本 0.58.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 支持后,必须在应用程序上指定节点选择器,以便 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 支持

在以下步骤中,将 us-west-2 替换为您的集群所在的区域。

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

    kubectl apply -f https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/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/us-west-2/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml; curl -o Setup-VPCAdmissionWebhook.ps1 https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/vpc-admission-webhook/latest/Setup-VPCAdmissionWebhook.ps1; curl -o webhook-create-signed-cert.ps1 https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/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/us-west-2/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 节点

向集群添加 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.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/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/us-west-2/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/us-west-2/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/us-west-2/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 节点

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

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

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

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

更新 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.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/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

Prerequisite

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

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

    curl -o webhook-create-signed-cert.sh \ https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/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 并重新部署。

部署 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 浏览器中加载可能需要几分钟时间。