使用 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 可以提高灵活性、安全性和可扩展性,从而随着集群规模的增长,更轻松地管理复杂的工作负载。