为全球可扩展的应用程序构建基于 IPv6 的 Amazon EKS 集群
随着互联网的迅猛发展以及支持互联网的应用程序数量急剧增加,对可路由 IP 地址的需求一直在稳步上升。考虑到 IPv4 地址空间中的可用 IP 地址越来越少,各行业已开始转为使用 IPv6。受 IPv4 地址空间的大小所限,许多在 Amazon EKS 上运行容器化应用程序的企业都遇到了 IP 耗尽的问题。像基于 IPv4 的自定义网络或使用私有 NAT 网关这样的临时解决方案需要进行复杂的路由配置。在 EKS IPv6 的支持下,各企业现在可以创建 EKS 集群,为 Pod 分配全球可路由的 IPv6 地址,从而能够在无需占用有限的私有 IPv4 地址空间的情况下轻松扩展应用程序。IPv6 具有 128 位的地址空间,可提供 3.4 x 10^38 个 IP 地址,因而无需复杂的路由机制便能够真正解决 IP 耗尽的问题,同时还能够提高网络性能。全球可路由的 IPv6 地址可用于直接与 Amazon VPC、本地网络或公共互联网中的任何 IPv6 端点进行通信,通过 Amazon VPC CNI 插件启用,该插件与 EC2 网络堆栈集成,具有高性能和可靠性。
本教程将介绍如何使用 eksctl“quickstart”模板创建基于托管节点组的 Amazon EKS 集群。这个针对特定使用场景的模板将创建并设置一个集群,该集群为启用 IPv6 的应用程序进行了优化,确保就 IP 耗尽问题提供一个可扩展且有效的解决方案,并且配置后的集群会增强网络性能和扩大全球覆盖范围。
请注意,如果您仍处于刚开始的为期 12 个月的亚马逊云科技免费套餐期限内,托管节点组的某些 Amazon EC2 实例和其他亚马逊云科技服务可能不包含在免费套餐的范围内,因此,根据您的使用量,系统可能会产生费用。
前提条件
开始本教程学习之前,您需要:
概述
本教程是部署启用 IPv6 的 Amazon EKS 集群系列的第一部分,该集群旨在满足需要大量 IP 地址的超大规模现代应用程序的需求。利用提供的 eksctl 集群模板,您将构建可扩展且安全稳定的 Amazon EKS 集群,该集群包含托管节点组,并针对 IPv6 工作负载进行了优化。本教程将指导您如何选择 Amazon EC2 Nitro Amazon Linux 2 实例类型作为工作节点。您还将进行配置以部署 Amazon IPv6 虚拟私有云 (VPC),为此,您需要安装“1.10.1”版本或更高版本的 Amazon VPC CNI 附加组件。您将对以下组件进行配置:
- 公有/私有网络:您将配置集群以使用 IPv6 IP 地址系列,进而提供广泛的全球可路由 IP 地址。默认情况下,Amazon EKS 为托管的 Kubernetes API 服务器设置公网连接地址,允许通过 kubectl 等工具进行访问。如果想要增强安全性,您可以选择将集群 API 端点配置为私有端点。这会将节点与 API 服务器之间的所有通信限制在虚拟私有云 (VPC) 内,从而避免直接接触公共互联网。在 IPv6 的支持下,这种设置可提供灵活的网络环境,以便满足各种访问控制需求:公共访问、VPC 内的私有访问或这两种访问方式都需要的情况。
- 附加组件:以下附加组件的最新版本:“vpc-cni”用于启用 Amazon VPC CNI;“coredns”用于促进 DNS 解析;“kube-proxy”用于维护每个 Amazon EC2 节点上的网络规则。
- 身份验证:OpenID Connect (OIDC) 端点用于 Amazon EKS 集群内的身份验证,以实现 Kubernetes Pod 和亚马逊云科技服务之间的通信。
- 节点生命周期管理:托管节点组简化了 Amazon EC2 实例的处理流程,将它们注册为 Kubernetes 节点。此配置采用 m6i.xlarge 和 m6a.xlarge Amazon Linux 2 (AL2) 实例类型,针对 Amazon Linux 2 (AL2) 进行了优化。此配置实现了资源均衡,指定了卷大小“100”和类型“gp3”。节点组量身定制,最小值设为“1”,最大值设为“3”,便于手动扩缩。卷加密增强了安全性,而自定义标签(如 os-distribution: amazon-linux-2)增强了可管理性,不仅支持对节点进行识别和分类,还确保了与预期的 AL2 发行版保持一致。
步骤 1:配置集群
这一步将配置 Amazon EKS 集群以支持 IPv6 网络,从而满足对全球可路由 IP 地址日益增长的需求。您将创建以下 cluster-config.yaml 文件,以定义 IPv6 网络、公共和私有访问、托管节点组、基本附加组件以及卷加密等安全功能的设置。这些配置对于确保安全稳定且灵活的集群来说必不可少,可为集群优化性能,以长期解决 IP 耗尽的问题并实现资源的高效管理。
创建集群配置
1. 创建 cluster-config.yaml 文件,并粘贴以下内容。请将 region 的示例值替换为实际值。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: ipv6-quickstart
version: "1.27"
region: us-east-2
kubernetesNetworkConfig:
ipFamily: IPv6
vpc:
clusterEndpoints:
publicAccess: true
privateAccess: true
iam:
withOIDC: true
addons:
- name: vpc-cni
version: latest
- name: coredns
version: latest
- name: kube-proxy
version: latest
managedNodeGroups:
- name: x86-al2-on-demand-xl
amiFamily: AmazonLinux2
instanceTypes: [ "m6i.xlarge", "m6a.xlarge" ]
minSize: 1
desiredCapacity: 2
maxSize: 3
volumeSize: 100
volumeType: gp3
volumeEncrypted: true
labels:
os-distribution: amazon-linux-2
步骤 2:创建集群
现在,我们已做好创建 Amazon EKS 集群的准备。此过程需要几分钟才能完成。如果您想监测集群创建状态,可以登录 Amazon CloudFormation 控制台。
运行以下命令,使用 cluster-config.yaml 创建 EKS 集群:
eksctl create cluster -f cluster-config.yaml
注意:如果响应中显示“Error: checking AWS STS access”(错误:检查 Amazon STS 访问权限),请务必检查当前 shell 会话是否使用了正确的用户身份。要检查当前用户身份,请在终端上运行 aws sts get-caller-identity。根据您配置 Amazon CLI 的方式,可能还需要指定一个命名配置文件(如 --profile clusteradmin)。
创建完成后,输出结果应该如下所示:
2023-08-26 13:10:23 [✔] EKS cluster "ipv6-quickstart" in "us-east-2" region is ready
步骤 3:验证集群节点和 Pod 运行状况
您现已成功创建了具有 IPv6 网络的 EKS 集群,接下来最好确保集群节点和 Pod 处于正常状态。这是为了确保集群正常运行,为部署应用程序做好准备。
kubectl get pods -n kube-system -o wide
列出的 Pod 应处于 Running 或 Completed 状态,不应有任何 Pod 处于 Error 或 CrashLoopBackOff 状态。您还要确认 kube-system 命名空间中的默认 Pod 分配了 IPv6 地址。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
aws-node-5cc8x 1/1 Running 0 41m 2600:1f16:1cc8:4002:bdb2:7cde:e292:5f19 ip-192-168-92-106.us-east-2.compute.internal <none><none>
aws-node-rnc2g 1/1 Running 0 41m 2600:1f16:1cc8:4001:c4bd:a35b:9a08:6c6b ip-192-168-48-127.us-east-2.compute.internal <none><none>
coredns-85dbc867bc-22qvz 1/1 Running 0 38m 2600:1f16:1cc8:4002:f92b::2 ip-192-168-92-106.us-east-2.compute.internal <none><none>
coredns-85dbc867bc-x8dz5 1/1 Running 0 38m 2600:1f16:1cc8:4001:9b29:: ip-192-168-48-127.us-east-2.compute.internal <none><none>
kube-proxy-9bntj 1/1 Running 0 38m 2600:1f16:1cc8:4001:c4bd:a35b:9a08:6c6b ip-192-168-48-127.us-east-2.compute.internal <none><none>
kube-proxy-hv2d8 1/1 Running 0 38m 2600:1f16:1cc8:4002:bdb2:7cde:e292:5f19 ip-192-168-92-106.us-east-2.compute.internal <none><none>
使用以下命令验证是否所有节点都处于 Ready 状态。您还需要注意节点是否分配了 IPv6 内部地址。
kubectl get node -o wide
输出结果应该如下所示:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-192-168-26-20.us-east-2.compute.internal Ready <none> 50m v1.27.1-eks-2f008fe 2600:1f16:3bf:5f00:9bf1:c33c:16e7:d724 <none> Amazon Linux 2 5.10.184-175.731.amzn2.x86_64 containerd://1.6.19
ip-192-168-40-126.us-east-2.compute.internal Ready <none> 50m v1.27.1-eks-2f008fe 2600:1f16:3bf:5f01:202e:f3c1:dd02:c74 <none> Amazon Linux 2 5.10.184-175.731.amzn2.x86_64 containerd://1.6.19
此外,您需要检查默认服务是否分配了 IPv6 地址。
kubectl get services -n kube-system -o wide
输出结果应该如下所示:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kube-dns ClusterIP fdde:a64b:91a6::a <none> 53/UDP,53/TCP 51m k8s-app=kube-dns
步骤 4:使用 Linux 堡垒机实现连接
在使用 IPv6 的 EKS 集群中,系统将为 Pod 和服务分配 IPv6 地址。这可确保存量 IPv4 端点能够连接 IPv6 集群上运行的服务,Pod 也能够连接集群外的存量 IPv4 端点。EKS 集群内所有 Pod 之间的通信都是通过 IPv6 实现的。为了测试与 IPv6 EKS 集群上所运行的应用程序是否连通,我们将在名为 eksctl-ipv6-quickstart-cluster/VPC 的 VPC 中部署一个 Linux 堡垒机,该 VPC 是在最初设置 EKS 集群时创建的。
创建 Linux EC2 堡垒机
打开 Amazon EC2 控制台。
在 Launch instance(启动实例)下,点击 Launch instance(启动实例)按钮。
3. 输入以下信息以自定义实例:
- 在 Name(名称)中输入 ipv6-bastion。
- 对于 Instance type(实例类型),选择 t2.micro(如果在新区域中不可用,则选择 t3.micro)。
- 保留其他实例配置的默认选项,包括 Amazon Linux AMI。
4. 在 Network(网络)下,输入以下信息:
- 点击 Edit(编辑)。对于 VPC,选择 eksctl-ipv6-quickstart-cluster/VPC。
- 保留其他网络设置的默认选项,包括子网和安全组。
点击 Launch instance(启动实例),选择 Proceed without key pair(继续操作,不使用密钥对),点击 Proceed without key pair(继续操作,不使用密钥对),然后点击 Launch instance(启动实例)。
连接到 Linux EC2 堡垒机
1. 您的实例启动后,选择该实例(如 i-0a001fe6790332b87)。
2. 选择您的实例后,点击 Connect(连接)按钮。
3. 在 Connect to instance(连接到实例)页面上:
- 保留网络设置的默认选项,包括 Connect using EC2 Instance Connect(使用 EC2 Instance Connect 进行连接)和 User name(用户名)。
- 点击 Connect(连接)。
您应当会看到以下连接终端:
恭喜您!您现已拥有一个具有 IPv6 网络且完全运行的 Amazon EKS 集群,能够应对全球可扩展应用程序不断增长的需求。使用 IPv6 这一转变为不断发展的未来网络环境奠定了基础,能够支持互联网应用程序的指数级增长。
(可选)步骤 5:部署示例应用程序
我们现已准备好启动一个示例应用程序,并使用 Application Load Balancer (ALB) 让示例应用程序可通过互联网进行访问。若需详细的操作步骤,请查看在 EKS IPv6 集群上使用 Amazon Load Balancer Controller (LBC) 对应用程序进行分布和分组中的教程。该教程将指导您完成 Amazon LBC 所需的入口注解,这是一种用于控制对 EKS 集群内的服务进行外部访问的基本机制。您还会了解先进的入口分组功能,该功能可将多项入口资源合并到一个 ALB 中,从而提高效率并加强 ALB 管理。
清理资源
为避免持续产生费用,建议您删除在学习本教程的过程中创建的资源。运行以下命令删除 EKS 集群:
eksctl delete cluster -f ./cluster-config.yaml
删除成功后,输出结果应该如下所示:
2023-08-26 17:26:44 [✔] all cluster resources were deleted