写点什么

在 EKS 平台上合并 ALB Ingress Controller

  • 2019-12-16
  • 本文字数:4235 字

    阅读完需:约 14 分钟

在 EKS 平台上合并 ALB Ingress Controller
## 1. 背景


Kubernetes Ingress 是一种 API 对象,借助它可以管理对集群中运行的 Kubernetes 服务的外部(或)内部 HTTPS访问,通过ALB ingress controller可以在kubernetes上部署服务时自动触发创建 ALB 以及必要的 AWS 支持资源。下图详细描述了用户定义了 Ingress 资源时 aws-alb-ingress-controller 将会创建的 AWS 组件。
[](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform1.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform1.jpg)


当客户在EKS上部署微服务时,他们发现AWS ALB Ingress Controller会为每个入口资源创建一个新的ALB。 当客户有数百个微服务时,也会生成数百个ALB,从管理和经济成本上分析,可能会让客户的使用成本变得非常高。 所以支持跨ingress资源重用ALB是客户的一个重要需求。 此外,每个帐户ALB的数量限制为50个,如果超过此限制需要不断的提升ALB的数量,这增加了客户运维的风险和负担。因此,针对这个现状,结合开源项目实现了一套合并ALB ingress controller的方法来解决客户的问题,其原理是:合并Ingress Controller并允许创建ingress资源,这些ingress资源将被组合在一起以创建将由同一控制器管理的新入口资源,工作流程见下图:
[](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform2.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform2.jpg)




## 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过程
**创建安装目录(可选)**
YAML
复制代码


   $mkdir -p ~/.kube
复制代码


#### 安装kubectl:
YAML
复制代码


   $sudo curl --silent --location -o /usr/local/bin/kubectl " https://storage.googleapis.com/kubernetes-release/release/v1.14.9/bin/linux/amd64/kubectl" sudo chmod +x /usr/local/bin/kubectl
复制代码


#### 安装AWS IAM Authenticator(或升级到AWS CLI 的版本 1.16.232 或更高版本中):
YAML
复制代码


   $ go get -u -v github.com/kubernetes-sigs/aws-iam-authenticator/cmd/aws-iam-authenticator
sudo mv ~/go/bin/aws-iam-authenticator /usr/local/bin/aws-iam-authenticator
复制代码


#### 注: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


**下载与安装** ****[](https://eksctl.io/) **:**
YAML
复制代码


   $curl --silent --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
$sudo mv -v /tmp/eksctl /usr/local/bin
$eksctl version
复制代码


### 
### 3) 创建EKS 集群(命令行中的AWS_REGION换成真实region)并开启访问alb-ingress权限
YAML
复制代码


   $eksctl create cluster --name=eksworkshop-eksctl --nodes=3 --node-ami=auto --region=${AWS_REGION} --alb-ingress-access
$kubectl get nodes
复制代码


### 
### 4) 部署Ingress_controller
YAML
复制代码


   $kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/rbac-role.yaml
$ curl -sS "https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/alb-ingress-controller.yaml" > alb-ingress-controller.yaml


Note:Change the parameter of alb-ingress-controller.yaml:–cluster-name = cluster-name
$ kubectl apply -f alb-ingress-controller.yaml
$kubectl logs -n kube-system $(kubectl get po -n kube-system | egrep -o alb-ingress[a-zA-Z0-9-]+)
复制代码


### 5)  安装Ingress-Merge
YAML
复制代码


   $helm install --namespace kube-system --name ingress-merge ./helm
复制代码


### 
### 6) 部署demo application 2048
YAML
复制代码


   $curl -sS "https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/2048/2048-namespace.yaml" > 2048-namespace.yaml
$ curl -sS "https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/2048/2048-deployment.yaml " > 2048-deployment.yaml
$ curl -sS "https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.3/docs/examples/2048/2048-service.yaml" > 2048-service.yaml
$kubectl apply -f 2048-namespace.yaml
$kubectl apply -f 2048-deployment.yaml
$kubectl apply -f 2048-service.yaml
复制代码


### 7)  部署demo application echoserver
YAML
复制代码


   $ curl -sS "https://github.com/kubernetes-sigs/aws-alb-ingress-controller/blob/master/docs/examples/echoservice/echoserver-deployment.yaml" > echoserver-deployment.yaml
$ curl -sS "https://github.com/kubernetes-sigs/aws-alb-ingress-controller/blob/master/docs/examples/echoservice/echoserver-service.yaml" > echoserver-service.yaml
复制代码


#### **Note**: 修改echoserver相关的yaml文件中的namespace为同一个.
###
### 8) 创建configmap
YAML
复制代码


   $ cat merge-ingress-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: merged-ingress
namespace: game
data:
annotations: |
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
$kubectl apply -f merge-ingress-cm.yaml
复制代码


### 9)  创建Merge ingress
YAML
复制代码


   $ cat merge-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echoserver-ingress
namespace: game
annotations:
kubernetes.io/ingress.class: merge
merge.ingress.kubernetes.io/config: merged-ingress
labels:
app: echoserver-ingress
spec:
rules:
- http:
paths:
- path: /echo
backend:
serviceName: echoserver
servicePort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: "2048-ingress"
namespace: "game"
annotations:
kubernetes.io/ingress.class: merge
merge.ingress.kubernetes.io/config: merged-ingress
labels:
app: 2048-ingress
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: "service-2048"
servicePort: 80
$kubectl apply -f merge-ingress.yaml


$ cat ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: merged-ingress
namespace: game
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
spec:
rules:
- http:
paths:
- path: /echo
backend:
serviceName: echoserver
servicePort: 8080
- path: /game
backend:
serviceName: service-2048
servicePort: 80
复制代码


$kubectl apply -f ingress.yaml


### 10) 检查生成的ALB和对应的规则
[](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform3.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform3.jpg) [](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform4.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform4.jpg)
###
### 11) 访问这个服务来验证,出现如下内容即表示成功
第一个是echoserver:
[](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform5.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform5.jpg)


第二个是2048:
[](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform6.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/merging-alb-progress-controller-on-the-eks-platform6.jpg)


#### 注:请自行修改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
复制代码


作者介绍:



    ### [](https://amazonaws-china.com/cn/blogs/china/tag/%E7%8E%8B%E5%BB%BA%E5%88%A9/)
王建利,AWS解决方案架构师,主要负责企业级大客户的上云工作,服务客户涵盖从能源,互联网,传统生产制造,擅长DevOps和容器领域。具备 15 年 IT 专业服务经验,历任程序设计师、项目经理、解决方案架构师。</footer>
复制代码


本文转载自 AWS 技术博客。


原文链接:https://amazonaws-china.com/cn/blogs/china/merging-alb-progress-controller-on-the-eks-platform/


2019-12-16 15:491296

评论

发布
暂无评论
发现更多内容

聊聊什么是厂商绑定

冯骐

开源 供应链 战略思考 技术 优化体系 厂商绑定

Databend 开源周报第 113 期

Databend

用 TDengine 3.0 碰到“内存泄露”?定位问题原因很关键

TDengine

时序数据库 内存泄漏 ​TDengine

欢迎体验

开源物联卡管理平台-设备管理

物联网 IoT 国际化 通信系统 通信平台

线程的五种状态

程序员万金游

Java】 #java #java程序员 #java面试

数字时代 低代码赋能新零售系统

力软低代码开发平台

HarmonyOS应用窗口管理(Stage模型)

HarmonyOS开发者

HarmonyOS

代码检查过程中为什么需要涉及到编译呢?

云计算 软件开发 华为云 代码检查

什么是K-均值算法

小魏写代码

深入浅出MySQL MRR(Multi-Range Read)

Java随想录

Java MySQL

这款可视化拖拽式低代码平台,真香!

树上有只程序猿

低代码平台 JNPF

TE智库|《刻画未来的道路:中国服务机器人产业研究报告》发布

TE智库

服务机器人

OpenHarmony组件内状态变量使用:@State装饰器

OpenHarmony开发者

OpenHarmony

六个为Rust构建的IDE

树上有只程序猿

rust语言

精彩议程抢先看 | 第四届 CID 大会线下参会报名启动!

OpenAnolis小助手

云计算 架构 深圳 龙蜥社区 CID

源码, AST, IR, CFG之间的关系梳理

云计算 软件开发 华为云

Hugging "Hugging Face"

数由科技

低代码 huggingface 大语言模型 huggingfists 多模态模型

全国5000家金融单位将加入信创建设大军,未来数年发展关键期

没有用户名丶

如何正确使用多线程和锁机制来构建可靠的程序

华为云开发者联盟

后端 多线程 开发 华为云 华为云开发者联盟

Eclipse、IntelliJ IDEA、PyCharm三种IDE区别

小齐写代码

C4D梦幻色彩的3种表现方法

Finovy Cloud

C4D

当 FineReport 遇见 CnosDB

CnosDB

开源 时序数据库 CnosDB FineReport

80、90童年回忆之小霸王游戏机网页版

echeverra

小霸王

从问界单日7000台,聊聊智能汽车成熟时

脑极体

问界

Python 元组完全指南2

小万哥

Python 程序员 软件 后端 开发

Programming abstractions in C阅读笔记:p166-p175

codists

音视频关键技术盘点!小白入行指南

X2Rtc

音视频 RTC

软件测试/测试开发丨App自动化测试-弹窗异常处理

测试人

Python 软件测试 异常处理 弹窗

运维 | Nginx Proxy Manager反向代理工具

Appleex

运维 nginx反向代理

在 EKS 平台上合并 ALB Ingress Controller_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章