使用 Amazon Load Balancer Controller 对 Amazon EKS IPv4 集群中的应用程序进行公开和分组

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

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

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

在错综复杂的网络领域中,管理 Kubernetes 集群中的应用程序访问需要面临的多方面的挑战。Amazon Load Balancer Controller (LBC) 至关重要,它有助于通过 IPv4(主要的互联网协议)将流量定向到您的应用程序。本教程重点讨论 Kubernetes 集群中的 IPv4 流量,利用 Amazon LBC 监督外部流量。并着重介绍入口组。该功能可将多个入口资源整合到一个应用程序负载均衡器 (ALB) 中,从而提高效率和 ALB 利用率。无论是使用灵活的微服务还是单体系统,都可以按照本教程中的指导操作实现流量无缝传输。使用 Amazon LBC,可以显著降低流量控制的复杂性。Amazon LBC 可帮您管理路由,因此您可以专注于您的应用程序开发和维护。随着流量的变化,Amazon LBC 会自动调整,确保您的应用程序的持续可用性。

基于本教程系列第 1 部分建立的 Amazon EKS 集群基础上,本教程将深入探讨如何设置 Amazon Load Balancer Controller (LBC)。在前一教程中,配置集群时,配置了用于 Amazon LBC 的服务账户的 IAM 角色和 OpenID Connect (OIDC) 端点。有关本课程系列的第一部分,请参阅构建预配置运行高流量微服务的 Amazon EKS 集群。或者,要在现有集群中设置本教程所需的组件,请按照 Amazon EKS 官方文档中的创建 IAM OpenID Connect (OIDC) 端点和创建服务账户的 IAM 角色 (IRSA) 中的说明进行操作。

在本试验中,您将在启用了 IPv4 的 Amazon EKS 集群上设置 Amazon Load Balancer Controller (LBC),部署示例应用程序,并创建入口组将应用程序划分到单个应用程序负载均衡器 (ALB) 实例。

前提条件

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

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

概述

本教程是使用 Amazon EKS 管理高流量微服务应用系列的第二部分,专门介绍如何通过 Amazon Load Balancer Controller (LBC) 公开应用程序并创建入口组。本教程不仅展示如何在集群外公开应用程序,还将介绍入口组的概念。本教程包括以下部分:

  • 身份验证:利用预配置的适用于 Amazon Load Balancer Controller (LBC) 的服务账户的 IAM 角色 (IRSA) 和 OpenID Connect (OIDC) 端点,确保 Kubernetes Pod 和亚马逊云科技服务之间安全通信。
  • Amazon LBC 设置:在 Amazon EKS 集群上部署 Amazon Load Balancer Controller (LBC)。本教程重点介绍自定义资源定义 (CRD) 和如何安装 Load Balancer Controller。
  • 示例应用程序部署:在端口 80 上构建并公开 2048 游戏应用程序,并为面向互联网的应用程序负载均衡器 (ALB) 定义路由规则和注解。利用 ALB 的自定义注解,特别是scheme 注解target-type 注解,指示 Amazon LBC 处理基于 IPv4 的集群上的入站 HTTP 流量。对于入口组,使用group.name 注解将多个入口资源合并到一个 ALB 实例下。要了解更多信息,请参阅 Amazon LBC 文档中的 入口注解
 
注意:应用程序负载均衡器 (ALB) 不包括在亚马逊云科技免费套餐内,因此 ALB 资源会产生费用。
 

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

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

  • 首先,确认集群环境。这样可以确保任何后续命令都被发送到预期的 Kubernetes 集群。您可以通过执行以下命令来验证当前环境:
kubectl config current-context
  • 定义 CLUSTER_NAME 环境变量指定 EKS 集群。请将 region 的值替换为实际值。
export CLUSTER_NAME=$(aws eks describe-cluster --region us-east-2 --name managednodes-quickstart --query "cluster.name" --output text)
  • 定义 CLUSTER_REGION 环境变量指定 EKS 集群所属区域。请将 region 的值替换为实际值。
export CLUSTER_REGION=$(aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.arn" --output text | cut -d: -f4)
  • 定义 CLUSTER_VPC 环境变量指定集群所属 VPC。
export CLUSTER_VPC=$(aws eks describe-cluster --name ${CLUSTER_NAME} --region ${CLUSTER_REGION} --query "cluster.resourcesVpcConfig.vpcId" --output text)
  • 定义 ACCOUNT_ID 环境变量指定与 EKS 集群关联的账户。
export ACCOUNT_ID=$(aws eks describe-cluster --name ${CLUSTER_NAME} --region ${CLUSTER_REGION} --query "cluster.arn" --output text | cut -d':' -f5)

步骤 2:验证或创建 IAM 角色和服务账户

确认您已在集群的 kube-system 命名空间中正确设置了 aws-load-balancer-controller 服务账户。

kubectl get sa aws-load-balancer-controller -n kube-system -o yaml

输出结果应如下所示:

apiVersion: v1
kind: ServiceAccount
metadata:
 annotations:
 eks.amazonaws.com/role-arn: arn:aws:iam::01234567890:role/AmazonEKSLoadBalancerControllerRole
 creationTimestamp: "2023-08-15T01:53:29Z"
 labels:
 app.kubernetes.io/managed-by: eksctl
 name: aws-load-balancer-controller
 namespace: kube-system
 resourceVersion: "23721"
 uid: 2491b69e-449e-44ea-affd-1d1c2d7437cf

(可选)如果您还没有设置 IAM 角色,或者收到报错提示,可以使用以下命令创建 IAM 角色和服务账户,并将服务账户命名为 aws-load-balancer-controller。请注意,在运行这些命令之前,您的集群必须已经关联了一个 OpenID Connect (OIDC) 端点

首先,下载 IAM 策略:

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

创建 IAM 角色策略:

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

最后,创建服务账户。

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:安装 Load Balancer Controller (LBC)

在 EKS 集群上安装 Amazon Load Balancer Controller (LBC)。LBC 利用自定义资源定义 (CRD) 来管理 Amazon 弹性负载均衡器 (ELB)。这些 CRD 定义自定义资源,例如负载均衡器和 TargetGroupBindings,使 Kubernetes 集群能够识别和管理这些资源。

  • 使用 Helm 将 EKS 图表存储库添加到 Helm。
helm repo add eks https://aws.github.io/eks-charts
  • 更新存储库,确保 Helm 获取图表的最新版本:
helm repo update eks
  • 运行以下 Helm 命令,同时安装 Amazon Load Balancer Controller (LBC) 的主控制器和自定义资源定义 (CRD)。如果已安装 CRD、需要兼容特定的版本或在具有严格的访问控制和自定义需求的环境中,想要跳过 CRD 安装,请传入 --skip-crds 标志。
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:部署 2048 游戏作为示例应用程序

现在,已经设置了负载均衡器,下面需要为集群中已容器化的应用程序启用外部访问。这一步,我们将热门的 2048 游戏作为示例应用程序部署在集群中。提供的清单中包括应用程序负载均衡器的自定义注解,包括 scheme 注解 target-type 注解。这些注解与 Amazon Load Balancer Controller (LBC) 集成并指示其将入站 HTTP 流量作为“面向互联网”的流量进行处理,并通过目标类型 ip 将这些流量路由到 game-2048 命名空间中的相应服务。有关更多注解,请参阅 Amazon LBC 文档中的注解

  • 使用 --save-config 标志创建名为 game-2048 的Kubernetes 命名空间。
kubectl create namespace game-2048 --save-config
namespace/game-2048 created

部署 2048 游戏作为示例应用程序。

输出结果应如下所示:

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

输出结果应如下所示:

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

步骤 5:访问应用程序

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

  • 运行以下命令查询入口资源的详细信息:
kubectl get ingress -n game-2048

输出结果应如下所示:

  • 打开浏览器,并输入上一步中获取的 ADDRESS 值,访问应用程序。例如,k8s-game2048-ingress2-eb379a0f83-378466616.us-east-2.elb.amazonaws.com。您应当会看到以下 2048 游戏:
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-2048 alb * k8s-game2048-ingress2-eb379a0f83-378466616.us-east-2.elb.amazonaws.com 80 31s
如果遇到响应问题,可能需要手动配置需要自动发现的公有子网。要了解更多信息,请参阅 如何标记 Amazon EKS 集群中的 Amazon VPC 子网以便负载均衡器或入口控制器自动发现子网?

步骤 6:创建入口组

通过引入入口组来更新现有的入口对象。在入口对象的元数据中添加 group.name 注解来添加入口组。如果入口组的名称被应用于不同的入口资源,Amazon Load Balancer Controller (LBC) 会将它们识别为同一个组的组成部分,从而对其进行统一管理。这种方法的优点是,能够将多个入口资源整合到单个应用程序负载均衡器 (ALB) 实例下。这不仅简化了资源管理,而且优化了 ALB 的利用率。通过此注解将资源组合在一起,您可以创建一个紧凑且高效的结构,从而简化负载均衡需求的编排过程。

  • 创建一个名为 updated-ingress-2048.yaml 的 Kubernetes 清单,并粘贴以下内容。
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/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
  • 部署 updated-ingress-2048.yaml 中定义的 Kubernetes 资源:
kubectl apply -f updated-ingress-2048.yaml

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

ingress.networking.k8s.io/ingress-2048 configured
  • 运行以下命令查询新入口资源的详细信息:
kubectl get ingress -n game-2048

输出结果应如下所示:

NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-2048 alb * k8s-mygroup-d7adaa7af2-1349935440.us-east-2.elb.amazonaws.com 80 4d1h
  • 打开浏览器,输入 game-2048 的 ADDRESS 值,访问该应用程序。例如,k8s-mygroup-d7adaa7af2-1349935440.us-east-2.elb.amazonaws.com。

您应当会看到 2048 游戏界面。要查看您的应用程序负载均衡器 (ALB) 实例,请在 Amazon EC2 控制台上打开Load balancers(负载均衡器)页面。

清理资源

完成本试验后,请及时删除实验过程中创建的资源。

# 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

总结

您已成功在 Amazon EKS 集群上配置了 Amazon Load Balancer Controller (LBC),从而能够精确控制和管理 Kubernetes 服务的外部流量。您公开了应用程序并创建了入口组,并整合了多个入口资源。这完全符合最佳实践的做法。此次试验中,您使用服务账户的 IAM 角色 (IRSA) 简化了身份验证,在 Amazon EKS 集群上设置了 Amazon LBC,并成功部署了 2048 游戏示例应用程序。另外,还使用了 ALB 的自定义注解,并了解了入口组的概念。要将其他应用程序关联到同一个 ALB 实例,您需要使用 group.name 注解指定同一个组(例如 my-group)。若要继续您的学习之旅:部署有状态的工作负载,您需要设置数据存储,例如 EBS CSI 驱动程序或 EFS CSI 驱动程序。这将为您提供一个强大的功能齐全的环境,为部署无状态和有状态应用程序做好准备。