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