使用 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: traefik
    version: 35.0.0 ## replaceable 
    repository: https://helm.traefik.io/traefik
    alias: traefik
    condition: traefik.enabled

helm dependency update

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

service:
  enabled: true
  type: 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-a
  namespace: traefik
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/load-balancer-name: traefik-ingress-a
spec:
  rules:
    - host: a.traefiktest.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: traefik-ingress-a
                port:
                  number: 80

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

kubectl apply -f traefik-ingress-a.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: traefik-ingress-b
  namespace: traefik
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/load-balancer-name: traefik-ingress-b
spec:
  rules:
    - host: b.traefiktest.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: traefik-ingress-b
                port:
                  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-a
  namespace: test
  annotations:
    kubernetes.io/ingress.class: traefik-ingress-a
    traefik.frontend.rule.type: PathPrefixStrip
spec:
  rules:
    - host: a.traefiktest.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-a
                port:
                  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-b
  namespace: test
  annotations:
    kubernetes.io/ingress.class: traefik-ingress-b
    traefik.frontend.rule.type: PathPrefixStrip
spec:
  rules:
    - host: b.traefiktest.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-b
                port:
                  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-a
  labels:
    app: nginx-a
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    volumeMounts:
    - name: html-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html-volume
    configMap:
      name: custom-html-a
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-a
spec:
  selector:
    app: nginx-a
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: 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-b
  labels:
    app: nginx-b
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    volumeMounts:
    - name: html-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html-volume
    configMap:
      name: custom-html-b
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-b
spec:
  selector:
    app: nginx-b
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP

kubectl apply -f nginx-deployment-b.yaml

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云攀登者-望正茂

你的鼓励是我前进的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值