本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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 资源控制器。 -
kubelet
和kube-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 支持。您可以使用 eksctl、Windows 客户端或 macOS 或 Linux 客户端为集群启用 Windows 支持。
使用 eksctl
为您的集群启用 Windows 支持
此过程仅适用于使用 eksctl
创建的集群,并假定您的 eksctl
版本为 0.35.0
或更高版本。可以使用以下命令来查看您的版本。
eksctl version
有关安装或升级 eksctl
的更多信息,请参阅安装或升级 eksctl。
-
使用以下
eksctl
命令为您的 Amazon EKS 集群启用 Windows 支持。此命令部署在 Amazon EKS 集群上运行 Windows 工作负载所需的 VPC 资源控制器和 VPC 准入控制器 Webhook。eksctl utils install-vpc-controllers --cluster <cluster_name> --approve
-
启用 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> 替换为您的集群所在的区域。
-
使用与集群所在的区域对应的命令将 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
-
-
将 VPC 准入控制器 Webhook 部署到您的集群。
-
下载与集群所在的区域对应的所需脚本和部署文件。
-
和 中国(北京) 之外的所有区域中国 (宁夏)
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;
-
-
设置和部署 VPC 准入 Webhook。
./Setup-VPCAdmissionWebhook.ps1 -DeploymentTemplate ".\vpc-admission-webhook-deployment.yaml"
-
-
确定您的集群是否具有所需的集群角色绑定。
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
-
启用 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> 替换为您的集群所在的区域。
-
使用与集群所在的区域对应的命令将 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
-
-
为您的集群创建 VPC 准入控制器 Webhook 清单。
-
为您的集群所在的区域下载所需的脚本和部署文件。
-
和 中国(北京) 之外的所有区域中国 (宁夏)
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
-
-
向 Shell 脚本添加权限,以便可以执行它们。
chmod +x webhook-create-signed-cert.sh webhook-patch-ca-bundle.sh
-
创建安全通信的密钥。
./webhook-create-signed-cert.sh
-
验证此密钥。
kubectl get secret -n kube-system vpc-admission-webhook-certs
-
配置 Webhook 并创建部署文件。
cat ./vpc-admission-webhook-deployment.yaml | ./webhook-patch-ca-bundle.sh > vpc-admission-webhook.yaml
-
-
部署 VPC 准入 Webhook。
kubectl apply -f vpc-admission-webhook.yaml
-
确定您的集群是否具有所需的集群角色绑定。
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
-
启用 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-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
-
将应用程序部署到集群。
kubectl apply -f windows-server-iis.yaml
-
获取 Pod 的状态。
kubectl get pods -o wide --watch
等待 Pod 过渡到
Running
状态。 -
在您的集群中查询这些服务并等到填充 服务的 External IP (外部 IP)
windows-server-iis-service
列。注意 IP 地址可能需要几分钟才能变为可用。
kubectl get services -o wide
-
在您的外部 IP 地址可用后,将 Web 浏览器指向该地址以查看 IIS 主页。
注意 DNS 传播和示例应用程序在 Web 浏览器中加载可能需要几分钟时间。