为 Amazon EKS 集群启用 Windows 支持
在部署 Windows 节点之前,请了解以下注意事项。
注意事项
-
您可以使用
HostProcess
容器组(pod)在 Windows 节点上使用主机网络。有关更多信息,请参阅 Kubernetes 文档中的创建 WindowsHostProcess
Pod。 -
Amazon EKS 集群必须包含一个或多个 Linux 或 Fargate 节点,才能运行仅在 Linux 上运行的核心系统 Pods,如 CoreDNS。
-
kubelet
和kube-proxy
事件日志将重定向到EKS
Windows 事件日志,并设置为 200MB 限制。 -
您不能将 Pods 的安全组 用于在 Windows 节点上运行的 Pods。
-
您不能将自定义联网用于 Windows 节点。
-
您不可以将
IPv6
与 Windows 节点一起使用。 -
Windows 节点支持每个节点一个弹性网络接口。默认情况下,每个 Windows 节点可以运行的 Pods 数等于每个弹性网络接口可用于节点实例类型的 IP 地址数减 1。有关更多信息,请参阅适用于 Windows 实例的 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
添加到您的 Amazon IAM 身份验证器配置映射中。有关更多信息,请参阅 指定 AMI ID 时的限制和条件。
先决条件
-
现有集群。该集群必须运行下表中列出的 Kubernetes 版本和平台版本之一。所有比所列版本更高的 Kubernetes 和平台版本也受支持。如果您的集群或平台版本早于以下版本之一,则需要在集群的数据面板上启用旧版 Windows 支持。如果您的集群为以下 Kubernetes 和平台版本之一或更高版本,您可以在控制面板上删除旧版 Windows 支持并启用 Windows 支持。
Kubernetes 版本 平台版本 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。
-
已有一个 Amazon EKS 集群 IAM 角色。
启用 Windows 支持
如果您的集群不是先决条件部分中列出的 Kubernetes 和平台版本之一或更高版本,则您必须改而启用旧版 Windows 支持。有关更多信息,请参阅 启用旧版 Windows 支持。
如果从未在集群上启用 Windows 支持,请跳到下一步。
如果您在早于先决条件列出的 Kubernetes 或平台版本的集群上启用了 Windows 支持,则必须先从数据面板中删除 vpc-resource-controller 和 vpc-admission-webhook。这两者已被弃用,现已不再需要。
为集群启用 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 支持
如果您在早于先决条件列出的 Kubernetes 或平台版本的集群上启用了 Windows 支持,则必须先从数据面板中删除 vpc-resource-controller
和 vpc-admission-webhook
。它们已被弃用,现已不再需要,因为它们提供的功能现已在控制面板上启用。
-
可以使用以下命令卸载
vpc-resource-controller
。无论您原来使用哪种工具安装它,现在都请使用此命令。将
(仅region-code
/manifests/
之后的文本实例)替换为集群所在的 Amazon Web Services 区域。kubectl delete -f https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/
region-code
/vpc-resource-controller/latest/vpc-resource-controller.yaml -
卸载
vpc-admission-webhook
,卸载时请按照您之前安装它时所用工具的说明操作。 -
在控制面板上为集群启用 Windows 支持。
禁用 Windows 支持
在集群上禁用 Windows 支持
-
如果您的集群包含 Amazon Linux 节点,并且您对这些节点使用了 Pods 安全组,请跳过此步骤。
从您的集群角色中删除
AmazonVPCResourceController
这项托管的 IAM policy。将
替换为集群角色的名称,并将eksClusterRole
替换为您的账户 ID。111122223333
aws iam detach-role-policy \ --role-name
eksClusterRole
\ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController -
在
amazon-vpc-cni
ConfigMap 中禁用 Windows IPAM。kubectl patch configmap/amazon-vpc-cni \ -n kube-system \ --type merge \ -p '{"data":{"enable-windows-ipam":"false"}}'
部署 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 支持
如果您的集群是先决条件部分中列出的 Kubernetes 和平台版本之一或更高版本,我们建议在控制面板上启用 Windows 支持。有关更多信息,请参阅 启用 Windows 支持。
如果您的集群或平台版本早于先决条件部分中列出的版本,则按照以下步骤操作有助于您为 Amazon EKS 集群的数据面板启用旧版 Windows 支持。如果您的集群和平台版本是先决条件部分中列出的版本或更高版本,我们建议您删除旧版 Windows 支持并为控制面板启用新版支持。
您可以使用 eksctl
、Windows 客户端或者 macOS 或 Linux 客户端为集群启用旧版 Windows 支持。
更新 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
选项卡上的说明来更新证书。
在 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 EC2 节点的可用 IP 地址数量。