Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅
中国的 Amazon Web Services 服务入门
(PDF)。
为 Amazon EKS 集群启用 Windows 支持
在部署 Windows 节点之前,请了解以下注意事项。
注意事项
-
Windows 工作负载不支持 Amazon EC2 实例类型 C3
、C4
、D2
、I2
、M4
(不包括 m4.16xlarge
)、M6a.x
和 R3
实例。
-
Windows 工作负载不支持主机联网模式。
-
Amazon EKS 集群必须包含一个或多个 Linux 或 Fargate 节点,才能运行仅在 Linux 上运行的核心系统 pods,如 CoreDNS。
-
kubelet
和 kube-proxy
事件日志将重定向到 EKS
Windows 事件日志,并设置为 200MB 限制。
-
您不能将 教程:适用于 pods 的安全组 用于在 Windows 节点上运行的 pods。
-
您不能将自定义联网用于 Windows 节点。
-
您不能将 IP 前缀用于 Windows 节点。这是使用 IPv6 的要求,因此您也不能将 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 容器组(pod)不支持 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.25 |
eks.1 |
1.24 |
eks.2 |
1.23 |
eks.1 |
1.22 |
eks.1 |
1.21 |
eks.3 |
1.20 |
eks.3 |
-
您的集群必须至少有一个(我们建议至少有两个)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
从数据面板中删除旧版 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
,卸载时请按照您之前安装它时所用工具的说明操作。
- eksctl
-
运行以下命令。
kubectl delete deployment -n kube-system vpc-admission-webhook
kubectl delete service -n kube-system vpc-admission-webhook
kubectl delete mutatingwebhookconfigurations.admissionregistration.k8s.io vpc-admission-webhook-cfg
- kubectl on macOS or Windows
-
运行以下命令。将 region-code
(仅 /manifests/
之后的文本实例)替换为集群所在的 Amazon Web Services 区域。
kubectl delete -f https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code
/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml
-
在控制面板上为集群启用 Windows 支持。
禁用 Windows 支持
在集群上禁用 Windows 支持
-
如果您的集群包含 Amazon Linux 节点,并且您对这些节点使用了 pods 安全组,请跳过此步骤。
从您的集群角色中删除 AmazonVPCResourceController
这项托管的 IAM policy。将 eksClusterRole
替换为集群角色的名称,并将 111122223333
替换为您的账户 ID。
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 支持。
- eksctl
-
使用 eksctl
为您的集群启用旧版 Windows 支持
先决条件
此过程需要 eksctl
版本 0.135.0
或更高版本。可以使用以下命令来查看您的版本。
eksctl version
有关安装或升级 eksctl
的更多信息,请参阅安装或更新 eksctl。
-
使用以下 eksctl
命令为您的 Amazon EKS 集群启用 Windows 支持。将 my-cluster
替换为您的集群名称。此命令会部署 Amazon EKS 集群上运行 Windows 工作负载所需的 VPC 资源控制器和 VPC 准入控制器 Webhook。
eksctl utils install-vpc-controllers --cluster my-cluster
--approve
-
启用 Windows 支持后,您可以在集群中启动 Windows 节点组。有关更多信息,请参阅启动自行管理的 Windows 节点。
- Windows
-
使用 Windows 客户端为您的集群启用旧版 Windows 支持
在以下步骤中,将 region-code
替换为您的集群所在的 Amazon Web Services 区域。
-
将 VPC 资源控制器部署到您的集群。
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 https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code
/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml;
curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code
/vpc-admission-webhook/latest/Setup-VPCAdmissionWebhook.ps1;
curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code
/vpc-admission-webhook/latest/webhook-create-signed-cert.ps1;
curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code
/vpc-admission-webhook/latest/webhook-patch-ca-bundle.ps1;
-
安装 OpenSSL 和 jq。
-
设置和部署 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 节点。
- macOS and Linux
-
使用 macOS 或 Linux 客户端为您的集群启用旧版 Windows 支持
此过程要求在客户端系统上安装 openssl
库和 jq
JSON 处理器。
在以下步骤中,将 region-code
替换为您的集群所在的 Amazon Web Services 区域。
-
将 VPC 资源控制器部署到您的集群。
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 https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code
/vpc-admission-webhook/latest/webhook-create-signed-cert.sh
curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code
/vpc-admission-webhook/latest/webhook-patch-ca-bundle.sh
curl -O 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 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
-
启用 Windows 支持后,您可以在集群中启动 Windows 节点组。有关更多信息,请参阅启动自行管理的 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
选项卡上的说明来更新证书。
- eksctl
-
-
重新安装证书。将 my-cluster
替换为您的集群名称。
eksctl utils install-vpc-controllers -cluster my-cluster
-approve
-
验证您是否收到了以下输出。
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
-
重新启动 Webhook 部署。
kubectl rollout restart deployment -n kube-system vpc-admission-webhook
-
如果您更新的证书已过期,并且有 Windows pods 卡在 Container creating
状态,则必须删除这些 pods 并重新部署。
- Windows
-
-
获取用于生成新证书的脚本。
curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code
/vpc-admission-webhook/latest/webhook-create-signed-cert.ps1;
-
为脚本准备参数。
./webhook-create-signed-cert.ps1 -ServiceName vpc-admission-webhook-svc -SecretName vpc-admission-webhook-certs -Namespace kube-system
-
重新启动 Webhook 部署。
kubectl rollout restart deployment -n kube-system vpc-admission-webhook-deployment
-
如果您更新的证书已过期,并且有 Windows pods 卡在 Container creating
状态,则必须删除这些 pods 并重新部署。
- Linux and macOS
-
先决条件
您的计算机上必须已安装了 OpenSSL 和 jq
。
-
获取用于生成新证书的脚本。
curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/manifests/region-code
/vpc-admission-webhook/latest/webhook-create-signed-cert.sh
-
更改权限。
chmod +x webhook-create-signed-cert.sh
-
运行脚本。
./webhook-create-signed-cert.sh
-
重启 Webhook。
kubectl rollout restart deployment -n kube-system vpc-admission-webhook-deployment
-
如果您更新的证书已过期,并且有 Windows pods 卡在 Container creating
状态,则必须删除这些 pods 并重新部署。