Get Hands-on with Amazon EKS - Workshop Event Series
Whether you're taking your first steps with Kubernetes or you're an experienced practitioner looking to sharpen your skills, our Amazon EKS workshop series delivers practical, real-world experience that moves you forward. Learn directly from AWS solutions architects and EKS specialists through hands-on sessions designed to build your confidence with Kubernetes. Register now and start building with Amazon EKS!
如何在 Amazon EKS 中使用多个 CIDR 范围?
我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 中使用多个 CIDR 范围来解决我的容器组的问题。
简短描述
要在 Amazon EKS 中使用多个 CIDR 范围,请完成以下步骤:
- 添加更多 CIDR 范围以扩展您的虚拟私有云 (VPC) 网络。
- 使用新 CIDR 范围创建子网。
- 将新子网关联到路由表。
- 配置 Amazon Virtual Private Cloud (Amazon VPC) 容器网络接口 (CNI) 插件,以使用新的 CIDR 范围。
**注意:**最佳做法是使用运营商级 NAT (CGN) 空间中的 CIDR (/16),例如 100.64.0.0/10 或 198.19.0.0/16。在自定义网络中,您可以使用有效的 VPC 范围作为辅助 CIDR 范围。但是,这些范围不太可能在企业环境中使用。有关自定义网络要求的详细信息,请参阅注意事项。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
**先决条件:**您必须拥有以下配置:
- 正在运行的 Amazon EKS 集群
- 用于管理 Amazon VPC 的 AWS Identity and Access Management (IAM) 权限
- 具有创建自定义资源和编辑 DaemonSet 权限的 kubectl
- 已安装到您的系统上的某个版本的 jq
**注意:**要下载和安装 jq,请参阅 jq 网站上的 Download jq(下载 jq)。 - 带有 Bash Shell 的基于 Unix 的系统
- 已配置的 VPC
添加更多 CIDR 范围来扩展您的 VPC 网络
完成以下步骤:
- 要检索集群 VPC 的 ID 并将其存储在变量中,请运行以下 AWS CLI describe-cluster 命令:
**注意:**请将 CLUSTER_NAME 替换为您的集群名称,将 REGION_CODE 替换为您部署集群的 AWS 区域。VPC_ID=$(aws eks describe-cluster --name CLUSTER_NAME --region REGION_CODE --query "cluster.resourcesVpcConfig.vpcId" --output text) - 要将另一个 CIDR 块(范围为 100.64.0.0/16)关联到 VPC,请运行以下 associate-vpc-cidr-block 命令:
aws ec2 associate-vpc-cidr-block --vpc-id $VPC_ID --cidr-block 100.64.0.0/16
使用新 CIDR 范围创建子网
完成以下步骤:
- 要列出您所在区域中的所有可用区,请运行以下 describe-availability-zones 命令:
**注意:**请将 REGION_CODE 替换为您部署资源的区域。aws ec2 describe-availability-zones --region REGION_CODE --query 'AvailabilityZones[*].ZoneName' - 在现有子网所在的每个可用区中创建您要使用的子网。要在 VPC 下使用新 CIDR 范围创建新子网,请运行以下 create-subnet 命令。
**注意:**请将 AZ1、AZ2 和 AZ3 替换为您现有子网所在的可用区。CUST_SNET1=$(aws ec2 create-subnet --cidr-block 100.64.0.0/19 --vpc-id $VPC_ID --availability-zone AZ1 | jq -r .Subnet.SubnetId) CUST_SNET2=$(aws ec2 create-subnet --cidr-block 100.64.32.0/19 --vpc-id $VPC_ID --availability-zone AZ2 | jq -r .Subnet.SubnetId) CUST_SNET3=$(aws ec2 create-subnet --cidr-block 100.64.64.0/19 --vpc-id $VPC_ID --availability-zone AZ3 | jq -r .Subnet.SubnetId) - (可选)要设置键值对以向子网添加名称标签,请运行以下 create-tags 命令:
**注意:**请将 KEY 替换为标签键,将 VALUE 替换为标签值。aws ec2 create-tags --resources $CUST_SNET1 --tags Key=KEY,Value=VALUE aws ec2 create-tags --resources $CUST_SNET2 --tags Key=KEY,Value=VALUE aws ec2 create-tags --resources $CUST_SNET3 --tags Key=KEY,Value=VALUE
将新子网关联到路由表
默认情况下,Amazon VPC 会将新子网与 VPC 的主路由表相关联。此路由表仅允许在 VPC 中部署的资源之间进行通信。要允许与 VPC CIDR 块之外的 IP 地址进行通信,您必须为您的子网创建自己的路由表。
配置 Amazon VPC CNI 插件以使用新的 CIDR 范围
完成以下步骤:
-
确保为 Kubernetes 版本运行正确的插件版本。要验证版本,请运行以下命令:
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2如果您没有正确的插件版本,请更新 Amazon VPC CNI。
-
要激活 Amazon VPC CNI 插件的自定义网络配置,请运行以下命令:
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true -
要添加 ENIConfig 标签来标识 Worker 节点,请运行以下命令:
kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone -
要为所有子网和可用区创建 ENIConfig 自定义资源,请运行以下命令:
cat <<EOF | kubectl apply -f -apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ1 spec: securityGroups: - cluster_security_group_id subnet: $CUST_SNET1 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ2 spec: securityGroups: - cluster_security_group_id subnet: $CUST_SNET2 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ3 spec: securityGroups: - cluster_security_group_id subnet: $CUST_SNET3 EOF**注意:**请将 cluster_security_group_id 替换为要用于每个 ENIConfig 资源的现有安全组的 ID。ENIConfig 资源的名称与您创建新子网所在的可用区相同。
-
如果您使用自主管理型节点组,请启动自主管理型 Worker 节点,以便插件能够为这些节点分配 IP 地址。对于 Subnets(子网),请使用您在创建集群时选择的原始子网,而非在 ENIConfig 资源中使用的新子网。您也可以使用带有启动模板的托管节点组来启动节点。在这两种情况下,您都必须为您的实例类型确定正确的 max-pods 值。这是因为 Amazon EKS 中的自定义网络不会使用主网络接口来放置容器组。运行 max-pods-calculator.sh 脚本时,请务必添加 --cni-custom-networking-enabled 参数。
然后,运行以下命令为您的自主管理型节点指定 max-pods 值:--use-max-pods false --kubelet-extra-args '--max-pods=20'注意:请将 20 替换为您计算出的 max-pods 值。
对于托管节点组,请将以下脚本添加到用户数据中:#!/bin/bash /etc/eks/bootstrap.sh my-cluster-name --use-max-pods false --kubelet-extra-args '--max-pods=20'注意:请将 my-cluster-name 替换为您的集群名称,将 20 替换为您计算出的 max-pods 值。在启动模板中,请指定 Amazon EKS 优化型亚马逊机器映像 (AMI) ID,或基于 Amazon EKS 优化型 AMI 构建的自定义 AMI。Amazon Linux 2023 (AL2023) AMI 使用 nodeadm 进程。有关这如何更改用户数据配置的信息,请参阅“从 Amazon Linux 2 升级到 Amazon Linux 2023”。
如果您使用不带启动模板或指定的 AMI ID 的托管节点组,则托管节点组会自动计算 max-pods 值。 -
新节点就绪后,请清空之前的节点,以正常关闭容器组。有关详细信息,请参阅 Kubernetes 网站上的安全地清空一个节点。如果这些节点位于现有的托管节点组中,请运行以下命令删除该节点组:
aws eks delete-nodegroup --cluster-name CLUSTER_NAME --nodegroup-name my-nodegroup**注意:**请将 CLUSTER_NAME 替换为您的集群名称,将 my-nodegroup 替换为您的节点组名称。
-
要启动新部署以测试配置,请运行以下命令:
kubectl create deployment nginx-test --image=nginx --replicas=10 kubectl get pods -o wide --selector=app=nginx-test**注意:**上述命令会添加 10 个新容器组,并将其调度到新 Worker 节点上的新 CIDR 范围内。
**重要事项:**集群可能需要长达 5 小时才能识别您与 VPC 关联的新 CIDR 块并将其加入允许列表。在此期间,Amazon EKS 控制面板将无法与您在新子网中启动的容器组通信。如果 api-server 通过 webhook、kubectl logs 命令或 kubectl exec 命令与容器组通信,则您可能会收到以下错误消息:
"failed calling webhook "linkerd-proxy-injector.linkerd.io": failed to call webhook: Post "https://linkerd-proxy-injector.linkerd.svc:443/?timeout=10s": Address is not allowed"
- 语言
- 中文 (简体)
