当前位置: 首页 > web >正文

使用 Helm 在 EKS 上管理多个 Traefik Ingress 控制器和 ALB 的流量

您准备好提升您的云和 DevOps 技能了吗?
🐥《云原生devops》专门为您打造,我们精心打造的 30 篇文章库,这些文章涵盖了 Azure、AWS 和 DevOps 方法论的众多重要主题。无论您是希望精进专业知识的资深专业人士,还是渴望学习相关知识的新手,这套资源库都能满足您的需求。

如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                   

什么是Traefik ingress controller

Traefik 是一款开源反向代理和负载均衡器,旨在管理微服务和容器化应用。作为 Kubernetes 的入口控制器,Traefik 提供了一种将传入流量路由到 Kubernetes 集群内各种服务的方法。以下是 Traefik 作为入口控制器的一些主要功能和概念:

Traefik 入口控制器的主要功能:

1. 动态配置:
- Traefik 会在新服务添加到 Kubernetes 集群时自动发现它们。它使用 Kubernetes 注解和自定义资源定义 (CRD) 来动态配置路由。

2. 轻松集成:
- Traefik 通过入口资源与 Kubernetes 无缝集成,并且还可以处理在 Docker、Mesos 或其他环境中运行的其他后端服务。

3. 负载均衡:
- 它提供开箱即用的负载均衡功能,将传入的请求均匀地分配给健康的服务实例。

4. HTTPS 支持:
- Traefik 通过 Let's Encrypt 自动配置证书,简化了 SSL 证书的管理,只需极少的配置即可为您的应用程序启用 HTTPS。

5. 中间件支持:
- Traefik 支持各种中间件组件,可用于增强请求处理。中间件可以处理身份验证、速率限制和请求修改等任务。

6. 仪表板:
- Traefik 内置仪表板,可深入了解您的路由、服务及其健康状况,从而简化监控和调试。

7. 路由规则:
- 您可以根据各种条件(例如标头、路径和方法)定义路由规则,从而实现灵活的路由策略。

Traefik 如何作为 Ingress 控制器工作:

- Ingress 资源:
- 在 Kubernetes 中,创建 Ingress 资源是为了定义如何将外部流量路由到集群内的服务。 Traefik 会监听这些 Ingress 资源并进行相应的配置。

- 流量路由:
- 配置完成后,Traefik 会根据定义的规则路由传入流量,将请求定向到合适的服务端点。

- 健康检查:
- Traefik 可以对其路由到的服务执行健康检查,确保流量仅发送到健康的实例。

用例介绍:

  • - 微服务架构:

- Traefik 特别适合频繁部署、更新或扩展服务的微服务架构。

  • - API 网关:

- Traefik 可以充当 API 网关,处理来自客户端的请求并将其分发到合适的后端服务

在本博客中,我将介绍如何在 Amazon EKS 集群上设置多个 Traefik Ingress 控制器,每个控制器都集成了各自的 AWS 应用程序负载均衡器 (ALB)。目标是通过在同一个 Kubernetes 集群中部署两个独立的 Ingress 控制器(每个控制器都关联不同的 ALB)来分离流量处理。

我使用自定义的 Helm Chart,为每个 Traefik 实例配置并部署了不同的设置,例如命名空间、Ingress 类和负载均衡器注释。这种设置可以更好地隔离流量、提高可扩展性,并更好地管理内部和外部流量。本博文提供了详细的安装、配置和验证步骤,以确保每个 Ingress 控制器正确地通过各自的 ALB 路由流量。

创建资源之前,请先检查先决条件

  • helm
  • kubectl
  • EKS 集群访问 


设置所有先决条件后,使用以下命令创建一个名为“traefik”的新图表。

helm create traefik
ninjamac@ninjamacdeMacBook-Air helm % helm create traefik 
Creating traefik
ninjamac@ninjamacdeMacBook-Air helm % tree -L 3 traefik 
traefik
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

修改Chart,yaml文件如下:

traefik:enabled: true
apiVersion: v2
name: traefik
description: A Helm chart with traefik as subchart
type: application
version: 0.1.0
appVersion: "0.1.0"
dependencies:- name: traefikversion: 35.0.0 ## replaceable repository: https://helm.traefik.io/traefikalias: traefikcondition: traefik.enabled

helm dependency update

现在将服务类型更改为 NodePort,只有当用户不需要经典负载均衡器时才需要这样做。

service:enabled: truetype: NodePort
kubectl create ns traefik
helm install traefik-ingress-a --namespace=traefik .

现在,使用以下命令检查所有资源信息。

kubectl get all -n traefik
 kubectl get ingressclass
NAME                CONTROLLER                      PARAMETERS   AGE
traefik-ingress-a   traefik.io/ingress-controller   <none>       86s

这些是将为第一个入口控制器创建的资源:

Deployment/replicaset/pod
service
ingressclass


如您所见,我们创建了一个 Traefik 入口控制器。现在,我们将创建具有相同配置的第二个 Traefik 入口控制器。

使用以下命令在我们创建的 Traefik Chart 中配置第二个控制器。

helm install traefik-ingress-b --namespace=traefik .
kubectl get ingressclass
NAME                CONTROLLER                      PARAMETERS   AGE
traefik-ingress-a   traefik.io/ingress-controller   <none>       12m
traefik-ingress-b   traefik.io/ingress-controller   <none>       3m45s

现在,返回并创建一个 ingress 目录。

cd ..
mkdir ingress
cd ingress/


注意:这非常重要,要配置 ALB 负载均衡器,您需要在 EKS 集群内配置 ALB 控制器。

现在,创建一个 traefik-ingress-a.yaml 文件并添加以下内容。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: traefik-ingress-anamespace: traefikannotations:kubernetes.io/ingress.class: albalb.ingress.kubernetes.io/scheme: internet-facingalb.ingress.kubernetes.io/target-type: ipalb.ingress.kubernetes.io/load-balancer-name: traefik-ingress-a
spec:rules:- host: a.traefiktest.comhttp:paths:- path: /pathType: Prefixbackend:service:name: traefik-ingress-aport:number: 80

添加后,使用以下命令为 traefik 入口控制器创建应用程序负载均衡器

kubectl apply -f traefik-ingress-a.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: traefik-ingress-bnamespace: traefikannotations:kubernetes.io/ingress.class: albalb.ingress.kubernetes.io/scheme: internet-facingalb.ingress.kubernetes.io/target-type: ipalb.ingress.kubernetes.io/load-balancer-name: traefik-ingress-b
spec:rules:- host: b.traefiktest.comhttp:paths:- path: /pathType: Prefixbackend:service:name: traefik-ingress-bport:number: 80

用同样的方法创建第二个ingress 控制器

kubectl apply -f traefik-ingress-b.yaml

设置好所有入口后,您需要为创建的域创建 Route 53 路由。

注意:您也可以使用本地 /etc/host 文件。在本教程中,我们将使用 /etc/hosts 文件方法。

现在,设置就完成了。

您可以使用下面的 ingress-object 文件进行配置,并检查 Ingress 控制器是否正常工作。

traefik-ingress-a.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: traefik-ingress-test-anamespace: testannotations:kubernetes.io/ingress.class: traefik-ingress-atraefik.frontend.rule.type: PathPrefixStrip
spec:rules:- host: a.traefiktest.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-aport:number: 80

注意:以下注释需要正确设置。

kubernetes.io/ingress.class: <INGRESS-CLASS-NAME>

为不同的 ingressClass 指定相同的创建 ingress 对象。

traefik-ingress-b.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: traefik-ingress-test-bnamespace: testannotations:kubernetes.io/ingress.class: traefik-ingress-btraefik.frontend.rule.type: PathPrefixStrip
spec:rules:- host: b.traefiktest.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-bport:number: 80

创建两个测试的ingress:

kubectl apply -f traefik-ingress-test-a.yaml
kubectl apply -f traefik-ingress-test-b.yaml

现在,配置好 Ingress 后,我们将创建测试应用资源

nginx-deployment-a.yaml:

---
apiVersion: v1
kind: ConfigMap
metadata:name: custom-html-a
data:index.html: |<html><head><title>Blue Background Page</title><style>body {background-color: #a5d8ff;color: black;display: flex;justify-content: center;align-items: center;height: 100vh;font-family: Arial, sans-serif;font-size: 2em;margin: 0;}</style></head><body><h1>The traffic is routing through <b>traefik-ingress-a</b> controller!</h1></body></html>
---
apiVersion: v1
kind: Pod
metadata:name: nginx-custom-alabels:app: nginx-a
spec:containers:- name: nginximage: nginx:latestports:- containerPort: 80volumeMounts:- name: html-volumemountPath: /usr/share/nginx/htmlvolumes:- name: html-volumeconfigMap:name: custom-html-a
---
apiVersion: v1
kind: Service
metadata:name: nginx-a
spec:selector:app: nginx-aports:- protocol: TCPport: 80targetPort: 80type: ClusterIP

 

同样,为应用程序部署 b 创建资源。

nginx-deployment-b.yaml

---
apiVersion: v1
kind: ConfigMap
metadata:name: custom-html-b
data:index.html: |<html><head><title>Blue Background Page</title><style>body {background-color: #96f2d7;color: black;display: flex;justify-content: center;align-items: center;height: 100vh;font-family: Arial, sans-serif;font-size: 2em;margin: 0;}</style></head><body><h1>The traffic is routing through <b>traefik-ingress-b</b> controller!</h1></body></html>
---
apiVersion: v1
kind: Pod
metadata:name: nginx-custom-blabels:app: nginx-b
spec:containers:- name: nginximage: nginx:latestports:- containerPort: 80volumeMounts:- name: html-volumemountPath: /usr/share/nginx/htmlvolumes:- name: html-volumeconfigMap:name: custom-html-b
---
apiVersion: v1
kind: Service
metadata:name: nginx-b
spec:selector:app: nginx-bports:- protocol: TCPport: 80targetPort: 80type: ClusterIP

kubectl apply -f nginx-deployment-b.yaml

注意:Endpoint/URL 取决于客户端设置,例如,如果您使用的是在 Route 53 中配置的域名,或者您手动配置了 /etc/hosts 文件。

在 EKS 集群中设置多个 Traefik Ingress 控制器并配置单独的 ALB,可以提供一种简洁的方式来管理不同类型的流量——例如外部应用程序与内部应用程序、不同的环境(例如开发环境与生产环境)或不同的安全策略。
每个 Traefik 控制器都分配有一个唯一的 IngressClass,这使得 Kubernetes 资源(Ingress 对象)可以明确指定哪个控制器应该处理其流量。
这确保了清晰的流量路由,避免了冲突,并能够更精细地控制集群内流量的流动方式和位置。使用单独的控制器、ALB 和 IngressClass 可以提高灵活性、安全性和可扩展性,从而随着集群规模的增长,更轻松地管理复杂的工作负载。

http://www.xdnf.cn/news/3592.html

相关文章:

  • 前端应用开发技术历程的简要概览
  • 第 5 篇:红黑树:工程实践中的平衡大师
  • 如何提升自我情绪管理的能力?
  • cpper 转 java
  • 现代健康养生全攻略
  • 4.2 math模块
  • 镜像和容器的深度介绍和关系
  • kaggle人工智能竞赛:通过声纹识别生物种类
  • DiT:文档图像Transformer 的自监督预训练
  • 数据结构之平衡二叉树
  • Linux 常用命令合集
  • 文献阅读篇#7:5月一区好文阅读,BFA-YOLO,用于建筑信息建模!(下)
  • 同构字符串(简单)
  • LeetCode 热题 100:普通数组
  • 在 Windows 中安装 Pynini 的记录
  • java 进阶 1.0
  • 阿里云服务器防御是怎么做出来的?服务器攻击方式有几种?
  • PMP-第九章 项目资源管理(二)
  • 深度学习与 PyTorch 基础
  • 【AI论文】WebThinker:赋予大型推理模型深度研究能力
  • 数字智慧方案5860丨智慧机场整体解决方案(41页PPT)(文末有下载方式)
  • 《C#数据结构与算法》—201线性表
  • n8n 工作流画布上下左右移动的操作方法
  • AimRT从入门到精通 - 02执行器Executor
  • 【2025年五一数学建模竞赛】A题 完整论文 模型建立与求解
  • kubernetes中离线业务编排详解JobCronJob之Job 应用
  • 泰迪杯特等奖案例学习资料:基于时空图卷积网络的物流车辆路径动态优化系统
  • 创意效率双提升,AIGC让增长更轻盈
  • LeetCode算法题 (移除链表元素)Day15!!!C/C++
  • 基于STM32的带恒温系统智能外卖柜设计