在 Amazon EKS IPv6 集群上使用 Amazon 负载均衡器控制器 (LBC) 对应用程序进行发布和分组

在 Amazon EKS IPv6 集群上使用 Amazon 负载均衡器控制器 (LBC) 对应用程序进行发布和分组

如何在基于 IPv6 的集群上使用 Amazon 负载均衡器控制器 (LBC) 将外部流量路由到 Kubernetes 服务并管理入口资源。
发布时间:2023 年 8 月 30 日
EKS 集群设置
EKS
Kubernetes
eksctl
EBS
教程
亚马逊云科技
Olawale Olaleye
亚马逊云科技使用经验
200 - 中级
完成所需时间
30 分钟
前提条件

注册 / 登录 亚马逊云科技账户

上次更新时间
2023 年 8 月 30 日

在网络的多方面领域,管理对 Kubernetes 集群中应用程序的访问是一项复杂的工作。Amazon 负载均衡器控制器 (LBC) 尤为重要,它可以简化通过 IPv6 将流量路由到您的应用程序的过程,IPv6 协议再互联网通信中的使用也越来越多。本教程深入探讨了 Kubernetes 集群中的 IPv6,利用 Amazon LBC 管理入口(即外部流量)。本教程介绍了入口类和入口组,前者是一种基本机制,用于控制对启用 IPv6 的 Kubernetes 集群中服务的外部访问;后者是一种功能,可将多个入口资源分到一个应用程序负载均衡器 (ALB) 中,从而提高效率并加强 ALB 管理。无论是轻量的微服务还是健壮的系统,本教程都能逐步引导您实现流畅的流量管理。借助 Amazon LBC,流量管理的复杂成都大大降低,让您可以专注于应用程序,而 Amazon LBC 则负责路由。随着流量的变化,Amazon LBC 会进行调整,确保通过 IPv6 对您应用程序的访问不间断。

基于本系列第 1 部分的 Amazon EKS 集群,我们在 VPC 中部署了一个 Linux 堡垒主机。此主机充当桥梁,将外部 IPv4 网络连接到集群中启用 IPv6 的应用程序。此主机是测试和验证 IPv6 EKS 集群上运行的应用程序的连接的重要工具,可确保这些应用程序可以访问并按预期状况运行。上一教程的集群配置中还包括一个 OpenID Connect (OIDC) 端点。对于本系列的第一部分,请参阅 为全局可扩展应用程序构建基于 IPv6 的 EKS 集群

在本教程中,您将在启用 IPv6 的 Amazon EKS 集群上设置 Amazon 负载均衡器控制器 (LBC),部署示例应用程序并使用 Linux 堡垒主机对其进行访问,并创建一个入口组以将应用程序一起合并在单个应用程序负载均衡器 (ALB) 实例下。

前提条件

开始本教程学习之前,您需要:

  • 安装最新版本的 kubectl。运行以下命令检查您的 kubectl 版本:kubectl version --short。
  • 安装最新版本的 eksctl。运行以下命令检查您的 eksctl 版本:eksctl info。
  • 安装最新版本的 Helm。运行以下命令检查您的 Helm 版本:helm version。

概述

本教程是关于在支持 IPv6 联网的 Amazon EKS 集群上部署全局应用程序的系列教程的第二部分,专门介绍如何使用 Amazon 负载均衡器控制器 (LBC) 发布应用程序并创建入口组。本教程不仅展示了如何在集群外发布应用程序,还介绍了 IPv6 集群的入口类和入口组的概念。本教程包括以下部分:

  • 身份验证:在基于 Amazon EKS IPv6 的集群中利用 OpenID Connect (OIDC) 端点,实现 Kubernetes Pod 和 Amazon 服务之间的无缝通信。
  • Amazon LBC 设置:在 Amazon EKS 集群上部署 Amazon 负载均衡器控制器 (LBC),重点介绍自定义资源定义 (CRD) 和负载均衡器控制器本身的安装。升级 Amazon LBC 以支持入口类,这对于管理启用 IPv6 的 Kubernetes 集群中的网络出口至关重要。
  • 部署示例应用程序:在端口 80 上构建并发布”2048 游戏示例应用程序”,为面向互联网的应用程序负载均衡器 (ALB) 定义路由规则和注解。利用 ALB 的自定义注解,包括“scheme”注解“target-type”注解“ip-address-type” 注解,以指示 Amazon LBC 处理基于 IPv6 的集群的传入 HTTP 流量。对于入口组,使用“group.name”注解将多个入口资源合并到一个 ALB 实例下。要了解更多信息,请参阅 Amazon LBC 文档中的 入口注解

请注意,如果您仍在最初的 12 个月亚马逊云科技免费套餐期限内,也请知悉应用程序负载均衡器 (ALB) 不在亚马逊云科技免费套餐范围内,因此使用可能会产生额外费用。

步骤 1:配置集群环境变量

在使用 Helm 或其他命令行工具与 Amazon EKS 集群交互之前,必须定义封装集群详细信息的特定环境变量。这些变量将在后续命令中使用,确保它们以正确的集群和资源为目标。

1. 首先,确认您在正确的集群上下文中进行操作。这样可以确保任何后续命令都能发送到预期的 Kubernetes 集群。您可以通过执行以下命令来验证当前上下文:

kubectl config current-context

2. 为您的 EKS 集群定义 CLUSTER_NAME 环境变量。替换集群 region 的示例值。

export CLUSTER_NAME=$(aws eks describe-cluster --region us-east-2 --name ipv6-quickstart --query "cluster.name" --output text)

3. 为您的 EKS 集群定义 CLUSTER_REGION 环境变量。替换集群 region 的示例值。

export CLUSTER_REGION=$(aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.arn" --output text | cut -d: -f4)

4. 为您的 EKS 集群定义 CLUSTER_VPC 环境变量。

export CLUSTER_VPC=$(aws eks describe-cluster --name ${CLUSTER_NAME} --region ${CLUSTER_REGION} --query "cluster.resourcesVpcConfig.vpcId" --output text)

5. 为与您的 EKS 集群关联的账户定义 ACCOUNT_ID 环境变量。

export ACCOUNT_ID=$(aws eks describe-cluster --name ${CLUSTER_NAME} --region ${CLUSTER_REGION} --query "cluster.arn" --output text | cut -d':' -f5)

步骤 2:创建服务账户的 IAM 角色 (IRSA)

本系列第一部分中的 IPv6 集群当前未设置服务账户的 IAM 角色 (IRSA)。使用本节中的步骤创建服务账户名称为“aws-load-balancer-controller”的 IAM 角色。

1. 下载 IAM 角色策略:

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json

2. 创建 IAM 角色策略:

aws iam create-policy \
 --policy-name AWSLoadBalancerControllerIAMPolicy \
 --policy-document file://iam_policy.json

3. 创建 Amazon LBC 的服务账户的 IAM 角色 (IRSA)。

eksctl create iamserviceaccount \ 
 --cluster=${CLUSTER_NAME} \ 
 --namespace=kube-system \ 
 --name=aws-load-balancer-controller \ 
 --role-name AmazonEKSLoadBalancerControllerRole \ 
 --attach-policy-arn=arn:aws:iam::${ACCOUNT_ID}:policy/AWSLoadBalancerControllerIAMPolicy \ 
 --approve

步骤 3:安装负载均衡器控制器 (LBC)

在这一步中,您将在 EKS 集群上安装 Amazon 负载均衡器控制器 (LBC)。LBC 利用自定义资源定义 (CRD) 来管理 Amazon 弹性负载均衡器 (ELB)。这些 CRD 定义自定义资源,例如负载均衡器和 TargetGroupBindings,使 Kubernetes 集群能够对其进行识别和管理。

1. 使用 Helm 将 EKS 图表Chart 存储库添加到 Helm 中。

helm repo add eks https://aws.github.io/eks-charts

2. 更新存储库以确保 Helm 了解图表的最新版本:

helm repo update eks

3. 运行以下 Helm 命令以同时安装 Amazon 负载均衡器控制器 (Amazon LBC) 的自定义资源定义 (CRD) 和主控制器。要跳过 CRD 安装,请传递 --skip-crds 参数。如果已安装 CRD、需要特定版本兼容性或在具有严格的访问控制和自定义需求的环境中,这么做可能有用。

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ 
 --namespace kube-system \ 
 --set clusterName=${CLUSTER_NAME} \ 
 --set serviceAccount.create=false \ 
 --set region=${CLUSTER_REGION} \ 
 --set vpcId=${CLUSTER_VPC} \ 
 --set serviceAccount.name=aws-load-balancer-controller

您应当会看到以下输出结果:

NAME: aws-load-balancer-controller
LAST DEPLOYED: Thu Aug 17 19:43:12 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
AWS Load Balancer controller installed!

步骤 4:将 Ingress Class(入口类)用于 IPv6 集群

在这一步中,您将升级 Amazon 负载均衡器控制器 (LBC) 以使用入口类。对于管理对启用 IPv6 的 Kubernetes 集群中服务的外部访问,入口类是关键组件。入口类允许您定义入站连接的处理和路由方式,从而对进入集群的流量进行统一管理。

1. 运行以下命令升级 Amazon LBC 以使用入口类。

helm upgrade aws-load-balancer-controller eks/aws-load-balancer-controller \ 
 --namespace kube-system \ 
 --set clusterName=${CLUSTER_NAME} \ 
 --set serviceAccount.create=false \ 
 --set serviceAccount.name=aws-load-balancer-controller \ 
 --set createIngressClassResource=true

输出结果应该如下所示:

Release "aws-load-balancer-controller" has been upgraded. Happy Helming!
NAME: aws-load-balancer-controller
LAST DEPLOYED: Mon Aug 14 22:54:27 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 3
TEST SUITE: None
NOTES:
AWS Load Balancer controller installed!

步骤 5:部署 2048 游戏示例应用程序

设置了负载均衡器后,需要为集群中的容器化应用程序启用外部访问。这一步将引导您完成将流行的 2048 游戏作为示例应用程序部署在集群中的各个步骤。提供的清单包括应用程序负载均衡器 (ALB) 的自定义注解,即“scheme”注解“target-type”注解“ip-address-type“注解。这些注解与 Amazon 负载均衡器控制器 (LBC) 集成并指示其将传入 HTTP 流量作为“internet-facing”进行处理,并使用目标类型“ip”将这些流量路由到“game-2048”命名空间中的相应服务。此外,注解还将 ip-address-type 指定为 dualstack,这样便允许 ALB 预置有启用 IPv6 的子网,使其可以通过 IPv6 集群访问。这种双栈配置可确保应用程序可通过 IPv4 和 IPv6 访问,从而增强了与各种客户端设备和网络的连接性和兼容性。有关更多注释,请参阅 Amazon LBC 文档中的注解

1. 使用 --save-config 参数创建名为 game-2048 的Kubernetes 命名空间。

kubectl create namespace game-2048 --save-config

输出结果应该如下所示:

namespace/game-2048 created

2. 部署 2048 游戏示例应用程序。

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.6.0/docs/examples/2048/2048_full_dualstack.yaml

输出结果应该如下所示:

namespace/game-2048 configured
deployment.apps/deployment-2048 created
service/service-2048 created
ingress.networking.k8s.io/ingress-2048 created

步骤 6:访问已部署的应用程序

部署应用程序和负载均衡器后,请等待几分钟,让必要的组件进行初始化并开始运行。在此期间,系统会在“game-2048”命名空间中准备入口资源。

1. 若要检索入口资源的详细信息,请运行以下命令:

kubectl get ingress -A

输出结果应该如下所示:

NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
game-2048 ingress-2048 alb * k8s-game2048-ingress2-4406ad7f91-1137451950.us-east-2.elb.amazonaws.com 80 45s

2. 运行以下命令以检索有关 game-2048 命名空间中所有 Pod 的信息,包括其他详细信息,例如每个 Pod 运行的节点。

kubectl get po -n game-2048 -o wide

3. 在 IP 中复制以下任意一个 STATUS 为 “Running” 的 IP 地址,以便进行下一步。输出结果应该如下所示:

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deployment-2048-7ccfd8fdd6-4nst5 1/1 Running 0 8m23s 2600:1f16:1cc8:4001:9b29::5 ip-192-168-48-127.us-east-2.compute.internal <none><none>
deployment-2048-7ccfd8fdd6-8q8zd 1/1 Running 0 8m23s 2600:1f16:1cc8:4001:9b29::3 ip-192-168-48-127.us-east-2.compute.internal <none><none>
deployment-2048-7ccfd8fdd6-k6zgg 1/1 Running 0 8m23s 2600:1f16:1cc8:4002:f92b::1 ip-192-168-92-106.us-east-2.compute.internal <none><none>
deployment-2048-7ccfd8fdd6-mr88r 1/1 Running 0 8m23s 2600:1f16:1cc8:4002:f92b::5 ip-192-168-92-106.us-east-2.compute.internal <none><none>
deployment-2048-7ccfd8fdd6-nxs86 1/1 Running 0 8m23s 2600:1f16:1cc8:4002:f92b::4 ip-192-168-92-106.us-east-2.compute.internal <none><none>

4. 从 Amazon EC2 控制台打开 Linux EC2 堡垒主机实例,然后运行以下 curl 命令以访问游戏应用程序的 IPv6 IP 地址。将示例值替换为上一步中的 IP。

curl -g -6 http://\[2600:1f16:1cc8:4001:9b29::5\]

应该可以看到应用程序的 HTML 输出。输出结果应该如下所示:

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>2048</title>
 ...
 <p class="game-explanation">
 <strong class="important">How to play:</strong> Use your <strong>arrow keys</strong> to move the tiles. When two tiles with the same number touch, they <strong>merge into one!</strong>
 </p>
 <hr>
 <p>
 <strong class="important">Note:</strong> This site is the official version of 2048. You can play it on your phone via <a href="http://git.io/2048">http://git.io/2048.</a> All other apps or sites are derivatives or fakes, and should be used with caution.
 </p>
 <hr>
 <p>
 Created by <a href="http://gabrielecirulli.com" target="_blank">Gabriele Cirulli.</a> Based on <a href="https://itunes.apple.com/us/app/1024!/id823499224" target="_blank">1024 by Veewo Studio</a> and conceptually similar to <a href="http://asherv.com/threes/" target="_blank">Threes by Asher Vollmer.</a>
 </p>
 </div>
 ...
</body>
</html>

如果遇到任何输出问题,可能需要手动配置公有子网才能自动发现子网。要了解更多信息,请参阅 如何标记 Amazon EKS 集群中的 Amazon VPC 子网以便负载均衡器或入口控制器自动发现子网?

步骤 7:创建 Ingress Group(入口组)

在这一步中,我们将通过引入入口组来更新现有的入口对象。要实现这一点,我们需要在入口对象的元数据中添加 group.name 注解。当不同的入口资源同时使用该组名时,Amazon 负载均衡器控制器 (LBC) 会将它们归为同一组,从而对其进行统一管理。这种方法的优点是能允许多个入口资源整合到单个应用程序负载均衡器 (ALB) 实例下。这不仅简化了这些资源的管理,还优化了 ALB 的利用率。通过此注解将这些资源组合在一起,您可以创建一个紧凑且高效的结构,从而简化负载均衡需求的编排过程。

1. 完整复制以下示例,并在 Linux EC2 堡垒主机的终端窗口中运行。

cat<<EoF>updated-ingress-2048.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 namespace: game-2048
 name: ingress-2048
 annotations:
 alb.ingress.kubernetes.io/scheme: internet-facing
 alb.ingress.kubernetes.io/target-type: ip
 alb.ingress.kubernetes.io/ip-address-type: dualstack
 alb.ingress.kubernetes.io/group.name: my-group # Adds this line to create the Ingress group
spec:
 ingressClassName: alb
 rules:
 - http:
 paths:
 - path: /
 pathType: Prefix
 backend:
 service:
 name: service-2048
 port:
 number: 80
<EoF> 

2. 在 updated-ingress-2048.yaml 中部署 Kubernetes 资源:

kubectl apply -f updated-ingress-2048.yaml

这样会使用新的注解更新现有的入口对象,创建一个名为“my-group”的入口组。部署该入口组后,请等待几分钟,让必要的组件进行初始化并开始运行。输出结果应该如下所示:

2. 在 updated-ingress-2048.yaml 中部署 Kubernetes 资源:

ingress.networking.k8s.io/ingress-2048 configured

3. 在 Linux EC2 堡垒主机终端窗口中,用以下命令以使用 curl 访问应用程序的 IPv6 IP 地址。

curl -g -6 http://\[2600:1f16:1cc8:4001:9b29::5\]

应该可以看到应用程序的 HTML 输出。要查看您的应用程序负载均衡器 (ALB) 实例,请在 Amazon EC2 控制台上打开负载均衡器页面。

清理资源

完成本教程后,为了更好地管理资源,您可能希望删除您创建的特定资源。

# Delete the Namespace, Deployment, Service, and Ingress
kubectl delete namespace game-2048

# Delete the AWS Load Balancer Controller
helm uninstall aws-load-balancer-controller -n kube-system

# Remove IAM Roles for Service Accounts (IRSA)
eksctl delete iamserviceaccount --cluster=${CLUSTER_NAME} --namespace=kube-system --name=aws-load-balancer-controller

总结

完成本教程标志着您已成功在 Amazon EKS 集群上配置了 Amazon 负载均衡器控制器 (LBC) 来管理 IPv6 高流量平台。通过发布应用程序并创建入口组,您成功实现了一种整合多个入口资源的方法,该方法完全符合基于 IPv6 的集群的最佳实践。本教程引导您使用服务账户的 IAM 角色 (IRSA) 来简化身份验证、在 Amazon EKS 集群上设置 Amazon LBC,并部署了“2048 游戏示例应用程序”。您还了解了 ALB 的自定义注解,具体而言是基于 IPv6 的集群的自定义注解,并了解了入口组的概念。为了将其他应用程序关联到同一个 ALB 实例,您需要使用”group.name“注解指定同一个组(即 my-group)。要通过部署有状态工作负载来继续进行下一步,您需要设置数据存储,例如 EBS CSI Driver 或 EFS CSI Driver。这些最后的安装将为您提供一个强大、功能齐全的环境,为部署无状态和有状态应用程序做好准备。