亚马逊AWS官方博客
在 EKS 平台上合并 ALB Ingress Controller
1. 背景
Kubernetes Ingress 是一种 API 对象,借助它可以管理对集群中运行的 Kubernetes 服务的外部(或)内部 HTTPS访问,通过ALB ingress controller可以在kubernetes上部署服务时自动触发创建 ALB 以及必要的 AWS 支持资源。下图详细描述了用户定义了 Ingress 资源时 aws-alb-ingress-controller 将会创建的 AWS 组件。
当客户在EKS上部署微服务时,他们发现AWS ALB Ingress Controller会为每个入口资源创建一个新的ALB。 当客户有数百个微服务时,也会生成数百个ALB,从管理和经济成本上分析,可能会让客户的使用成本变得非常高。 所以支持跨ingress资源重用ALB是客户的一个重要需求。 此外,每个帐户ALB的数量限制为50个,如果超过此限制需要不断的提升ALB的数量,这增加了客户运维的风险和负担。因此,针对这个现状,结合开源项目实现了一套合并ALB ingress controller的方法来解决客户的问题,其原理是:合并Ingress Controller并允许创建ingress资源,这些ingress资源将被组合在一起以创建将由同一控制器管理的新入口资源,工作流程见下图:
2. 合并过程
1) 前置条件
- Create an AWS account
- Create a Workspace
- Create an SSH key
- Install Kubernetes Tools
- Create an IAM role for your Workspace
- Attach the IAM role to your Workspace
- Update IAM settings for your Workspace
Note: 前置条件过程可以参考链接: https://eksworkshop.com/eksctl/
2) 安装kubectl过程
创建安装目录(可选)
安装kubectl:
安装AWS IAM Authenticator(或升级到AWS CLI 的版本 1.16.232 或更高版本中):
注:AWS CLI 的版本 1.16.232 或更高版本中可用的 aws eks get-token 命令支持客户端安全令牌创建
,所以也可以升级当前的AWS cli到最新版本,可以参考如下链接:
https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/install-cliv2-linux.html
安装JQ:
sudo yum -y install jq
下载与安装 eksctl :
3) 创建EKS 集群(命令行中的AWS_REGION换成真实region)并开启访问alb-ingress权限
4) 部署Ingress_controller
5) 安装Ingress-Merge
6) 部署demo application 2048
7) 部署demo application echoserver
Note: 修改echoserver相关的yaml文件中的namespace为同一个.
8) 创建configmap
9) 创建Merge ingress
$kubectl apply -f ingress.yaml
10) 检查生成的ALB和对应的规则
11) 访问这个服务来验证,出现如下内容即表示成功
第一个是echoserver:
第二个是2048:
注:请自行修改nginx中对于path的处理逻辑。
12) 总结
通过ingress-merge-controller将服务对应的rules附加到ALB上,这样我们完成了原来需要两个ALB合并成一个ALB的目的,减少了客户管理的ALB的数量并由此可以降低成本。
需要提醒大家以下几点:
- Ingress controller 只支持http 和Https协议;
- 服务只支持nodeport和Loadbalancer 类型,即:Type=NodePort 或Service.Type=LoadBalancer
13) 参考资料
https://github.com/jakubkulhan/ingress-merge
https://github.com/kubernetes-sigs/aws-alb-ingress-controller