本文主要介绍AWS EKS和AWS Elastic Load Balancing的集成;我们可以通过AWS ELB将运行在EKS中的服务暴露出去,提供互联网可访问的API。
AWS ELB提供的负载均衡,高可用,按流量自动弹性和自带的安全性服务(比如基础版的AWS Shield)给为我们的网络服务提供了高质量的保证。虽然我们也可以直接让K8S Service服务直接以public ip的方式来对外服务,但是一般技术和成本等综合来考虑不如AWS ELB。
如下图,AWS ELB充当运行在AWS上的动态API服务的总入口,LB可以将流量分布到后面的多种计算平台,并在多个AWS可用区和计算节点间分配网络流量以提高应用程序可扩展性和可靠性。

安装Load Balancer Controller
我们可以参考Installing the AWS Load Balancer Controller add-on和aws-load-balancer-controller
权限设置
下载iam_policy.json
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy.json
用下载好的iam_policy.json创建policy
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json
截图如下
创建ServiceAccount
为ELB创建service account,其中你需要将<eks-cluster-name>和<aws-account>替换为你自己实际的值。
eksctl create iamserviceaccount \
--cluster=<eks-cluster-name> \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=arn:aws:iam::<aws-account>:policy/AWSLoadBalancerControllerIAMPolicy \
--approve
截图如下
安装cert-manager add-on
我们需要安装cert-manager以便将证书配置注入Webhook,最简单的方式就是在AWS EKS插件商店中国进行可视化安装。
在AWS EKS插件商店进行安装
检查cert-manager已经正常运行
如果你更喜欢命令行操作也可以执行下面的命令来安装cert-manager
kubectl apply \
--validate=false \
-f https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
安装Load Balancer Controller add-on
下载AWS Load Balancer Controller的配置文件
curl -Lo v2_14_1_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.14.1/v2_14_1_full.yaml
编辑v2_14_1_full.yaml,将下面的内容从v2_14_1_full.yaml中删除
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: aws-load-balancer-controller
name: aws-load-balancer-controller
namespace: kube-system
---
继续编辑v2_14_1_full.yaml,将文件中的your-cluster-name替换为你自己实际的EKS集群名称
继续编辑v2_14_1_full.yaml,在为AWS后续启用的IMDSv2环境下补充VPC和region信息,这非常建议你设置,因为IMDS(IMDSv1)后续将会默认被IMDSv2替代,在Amazon Linux 2023等新操作系统中默认会使用IMDSv2!
--aws-vpc-id=xxxxx
--aws-region=xxxxx
应用v2_14_1_full.yaml
kubectl apply -f v2_14_1_full.yaml
下载IngressClass和IngressClassParams manifest文件并应用
# 下载
curl -Lo v2.14.1_ingclass.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.14.1/v2_14_1_ingclass.yaml
# 应用
kubectl apply -f v2_14_1_ingclass.yaml
安装后我们可以进行检查,出现aws-load-balancer-controller 1/1字样就证明安装成功了
kubectl get deployment -n kube-system aws-load-balancer-controller
截图如下
为AWS ELB显式public subnet tag
参考Route application and HTTP traffic with Application Load Balancers,我们最好为AWS ELB显式设置public subnet的tag,明确指示EKS将ELB创建在我们设置的子网中。同时我们最好也为AWS ELB显式设置安全组的tag
为public subnet设置tag
将<my-cluster>替换为你自己实际的EKS集群名称
| tag key | tag value |
|---|---|
kubernetes.io/cluster/<my-cluster> | shared |
kubernetes.io/role/elb | 1 |
一般AWS上网络设计是3AZ,我们需要为每个AZ中的public subnet设置tag,我这里有3个public subnet,每个我都进行了设置。注意:AWS ELB的创建至少要有2个AZ中的子网被打上标签才行,这是为了高可用。
为security group设置tag
将<my-cluster>替换为你自己实际的EKS集群名称
| tag key | tag value |
|---|---|
kubernetes.io/cluster/<my-cluster> | shared |
一般我们为public subnet设置了专用的对外的安全组,我一般命名为public-sg
功能测试
我们可以按照自己的需求使用AWS ALB和AWS NLB。ALB和NLB都隶属于AWS ELB,区别在ALB专注于L7,NLB专注于L4;ALB是我们使用HTTP协议时首选,NLB是我们使用自定义协议、MQTT等非HTTP协议的首选,NLB可以同时满足L4/L7的负载需求,但是ALB只能用于L7。
我们可以参考Application load balancing on Amazon EKS和Network load balancing on Amazon EKS来进行功能测试
比如按照Application load balancing on Amazon EKS,
我们部署后可以检查下是否正常运行
kubectl get ingress/ingress-2048 -n game-2048
我最终得到了一个2048页游
关于AWS EKS和AWS ELB的集成的一些建议
我们可以在kubernetes-sigs AWS Load Balancer Controller进一步查看EKS+LB相关的yaml详细设置。
一般我们在写好LB相关的yaml后,应用yaml会自动创建一个LB,这在大多数全新上线的部署场景是非常方便的;但是如果我们已经有了一个LB用于普通的EC2应用或者EKS已经给我创建了一个LB,我们现在想复用现有的LB,那么我们可以考虑TargetGroupBinding,它的原理是我们只需要提前设置好TargetGroup和LB的关系,然后我们只需要在yaml中将自己的服务和TargetGroup绑定即可。