在 EKS 集群上部署 Windows 节点
在部署 Windows 节点之前,请了解以下注意事项。
-
您可以使用
HostProcess
容器组(pod)在 Windows 节点上使用主机网络。有关更多信息,请参阅 Kubernetes 文档中的创建 Windows HostProcessPod。 -
Amazon EKS 集群必须包含一个或多个 Linux 或 Fargate 节点,才能运行仅在 Linux 上运行的核心系统 Pods,如 CoreDNS。
-
kubelet
和kube-proxy
事件日志将重定向到EKS Windows
事件日志,并设置为 200MB 限制。 -
您不能将 Assign security groups to individual pods 用于在 Windows 节点上运行的 Pods。
-
您不能将自定义联网用于 Windows 节点。
-
您不能将
IPv6
与 Windows 节点结合使用。 -
Windows 节点支持每个节点一个弹性网络接口。默认情况下,每个 Windows 节点可以运行的Pods数等于每个弹性网络接口可用于节点实例类型的 IP 地址数减 1。有关更多信息,请参阅《Amazon EC2 用户指南》中的每种实例类型的每个网络接口的 IP 地址数。
-
在 Amazon EKS 集群中,采用负载均衡器的单个服务最多可支持 1024 个后端 Pods。每个 Pod 都有自己的唯一 IP 地址。对于从 操作系统构建 17763.2746
开始的 Windows 服务器更新 ,之前的 64 个 Pods 限制已经没有了。 -
Fargate 上的 Amazon EKS Pods 不支持 Windows 容器。
-
无法从
vpc-resource-controller
容器组(pod)检索日志。以前在将此控制器部署到数据面板时则可以检索。 -
在将
IPv4
地址分配给新容器组(pod)之前,会有一段“冷却”时间。这样可以防止流量因过时的kube-proxy
规则而流向具有相同IPv4
地址的旧容器组(pod)。 -
该控制器的源代码在 GitHub 上进行管理。要为该控制器贡献代码或提交针对该控制器的问题,请访问 GitHub 上的相应项目
。 -
为 Windows 托管节点组指定自定义 AMI ID 时,请将
eks:kube-proxy-windows
添加到您的 AWS IAM 身份验证器配置映射中。有关更多信息,请参阅 指定 AMI ID 时的限制和条件。 -
如果保留可用的 IPv4 地址对您的子网至关重要,请参阅 EKS Best Practices Guide - Windows Networking IP Address Management
以获取指导。 -
现有集群。该集群必须运行下表中列出的 Kubernetes 版本和平台版本之一。所有比所列版本更高的 Kubernetes 和平台版本也受支持。
Kubernetes 版本 平台版本 1.31
eks.4
1.30
eks.2
1.29
eks.1
1.28
eks.1
1.27
eks.1
1.26
eks.1
1.25
eks.1
1.24
eks.2
-
您的集群必须至少有一个(我们建议至少有两个)Linux 节点或 Fargate Pod 才能运行 CoreDNS。如果您启用旧版 Windows 支持,则必须使用 Linux 节点(不能使用 Fargate Pod)来运行 CoreDNS。
启用 Windows 支持
-
如果您的集群中没有 Amazon Linux 节点并且对Pods使用了安全组,请跳至下一步。否则,请确认
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" } ] }
如果像前面的输出中那样已经附加了策略,请跳过下一步。
-
将 AmazonEKSVPCResourceController 托管策略附加到您的 Amazon EKS 集群 IAM 角色。请将
eksClusterRole
替换为集群角色的名称。aws iam attach-role-policy \ --role-name eksClusterRole \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController
-
创建名为
vpc-resource-controller-configmap.yaml
的文件,具有以下内容。apiVersion: v1 kind: ConfigMap metadata: name: amazon-vpc-cni namespace: kube-system data: enable-windows-ipam: "true"
-
将
ConfigMap
应用于集群。kubectl apply -f vpc-resource-controller-configmap.yaml
-
验证
aws-auth
ConfigMap
是否包含 Windows 节点的实例角色映射,以包含eks:kube-proxy-windows
RBAC 权限组。您可以通过运行以下命令进行验证。kubectl get configmap aws-auth -n kube-system -o yaml
示例输出如下。
apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - groups: - system:bootstrappers - system:nodes - eks:kube-proxy-windows # This group is required for Windows DNS resolution to work rolearn: arn:aws:iam::111122223333:role/eksNodeRole username: system:node:{{EC2PrivateDNSName}} [...]
您应该会看到组下面列出的
eks:kube-proxy-windows
。如果未指定组,则需要更新ConfigMap
或进行创建,以包含所需的组。有关aws-auth
ConfigMap
的更多信息,请参阅 将 aws-authConfigMap 应用到集群。
部署 Windows 容器组(pod)
将容器组(pod)部署到集群时,如果您运行的是多种不同类型的节点,则需要指定这些容器组(pod)所用的操作系统。
对于 Linux Pods,请使用清单中的以下节点选择器文本。
nodeSelector: kubernetes.io/os: linux kubernetes.io/arch: amd64
对于 Windows Pods,请使用清单中的以下节点选择器文本。
nodeSelector: kubernetes.io/os: windows kubernetes.io/arch: amd64
可以部署一款示例应用程序,以查看正在使用的节点选择器。
在 Windows 节点上支持更高的 Pod 密度
在 Amazon EKS 中,每个 Pod 都会从您的 VPC 分配一个 IPv4
地址。因此,即使有足够的资源可以在节点上运行更多 Pods,可以部署到该节点的 Pods 数量也受到可用 IP 地址的限制。由于 Windows 节点仅支持一个弹性网络接口,因此默认情况下,Windows 节点上可用 IP 地址的最大数量等于:
Number of private IPv4 addresses for each interface on the node - 1
一个 IP 地址用作网络接口的主要 IP 地址,因此无法将其分配给Pods。
通过启用 IP 前缀委派,可以在 Windows 节点上启用更高的 Pod 密度。此功能使您可以为主网络接口分配 /28
IPv4
前缀,而不是分配辅助 IPv4
地址。分配 IP 前缀会将节点上的最大可用 IPv4
地址数增加到:
(Number of private IPv4 addresses assigned to the interface attached to the node - 1) * 16
由于可用 IP 地址的数量要多得多,可用的 IP 地址不应限制您在节点上扩展Pods数量的能力。有关更多信息,请参阅 为带前缀的 Amazon EKS 节点分配更多 IP 地址。