Ingress选型及Traefik环境部署
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
目录
一.Ingress简介
1.Ingress简介
Ingress是kubernetes API中标准资源类型之一,Ingress实现的功能是在应用层对客户端请求的host域名或请求的URL路径把请求转发到指定的service资源的规则,即用于将kubernetes集群外部的请求资源转发至集群内部的service,再被service转发至pod处理客户端请求。
Inress资源需要指定监听地址,请求的host和URL等配置,然后根据这些规则的匹配机制将客户端的请求进行转发,这种能够为ingress配置资源监听并转发流量的组件称为Ingress控制器(Ingress controller),Ingress Controller是kubernetes的一个附件,类似于dashboard或者flannel一样,需要单独部署。
官方文档:
https://kubernetes.io/zh/docs/concepts/services-networking/ingress
https://kubernetes.io/zh/docs/concepts/services-networking/ingress-controllers
2.Ingress选型
参考链接:
https://kubernetes.io/zh/docs/concepts/services-networking/ingress-controllers
- AKS
应用程序网关 Ingress 控制器 是一个配置 Azure 应用程序网关 的 Ingress 控制器。
参考链接:
https://learn.microsoft.com/zh-cn/azure/application-gateway/tutorial-ingress-controller-add-on-existing
- 阿里云 MSE Ingress:
是一个 Ingress 控制器,它负责配置阿里云原生网关, 也是 Higress 的商业版本。
参考链接:
https://www.alibabacloud.com/help/zh/mse/user-guide/overview-of-mse-ingress-gateways/
- Apache APISIX Ingress 控制器:
是一个基于 Apache APISIX 网关 的 Ingress 控制器。
参考链接:
https://github.com/apache/apisix-ingress-controller
- Avi Kubernetes Operator:
使用 VMware NSX Advanced Load Balancer 提供第 4 到第 7 层的负载均衡。
参考链接:
https://github.com/vmware/load-balancer-and-ingress-services-for-kubernetes
- BFE Ingress 控制器:
是一个基于 BFE 的 Ingress 控制器。
参考链接:
https://github.com/bfenetworks/ingress-bfe
- Cilium Ingress 控制器:
是一个由 Cilium 出品支持的 Ingress 控制器。
参考链接:
https://docs.cilium.io/en/stable/network/servicemesh/ingress/
- Citrix Ingress 控制器:
可以用来与 Citrix Application Delivery Controller 一起使用。
参考链接:
https://github.com/netscaler/netscaler-k8s-ingress-controller#readme
- Contour:
是一个基于 Envoy 的 Ingress 控制器。
参考链接:
https://projectcontour.io/
- Emissary-Ingress API 网关:
是一个基于 Envoy 的入口控制器。
参考链接:
https://www.getambassador.io/products/api-gateway
- EnRoute:
是一个基于 Envoy 的 API 网关,可以用作 Ingress 控制器。
参考链接:
https://www.saaras.io/
- Easegress IngressController:
是一个基于 Easegress 的 API 网关,可以用作 Ingress 控制器。
参考链接:
https://megaease.com/docs/easegress/04.cloud-native/4.1.kubernetes-ingress-controller/
- F5 BIG-IP:
用于 Kubernetes 的容器 Ingress 服务 让你能够使用 Ingress 来配置 F5 BIG-IP 虚拟服务器。
参考链接:
https://clouddocs.f5.com/products/connectors/k8s-bigip-ctlr/v1.11/
- FortiADC Ingress 控制器:
支持 Kubernetes Ingress 资源,并允许你从 Kubernetes 管理 FortiADC 对象。
参考链接:
https://docs.fortinet.com/document/fortiadc/7.0.0/fortiadc-ingress-controller/742835/fortiadc-ingress-controller-overview
- Gloo:
是一个开源的、基于 Envoy 的 Ingress 控制器,能够提供 API 网关功能。
参考链接:
https://gloo.solo.io/
- HAProxy Ingress:
是一个针对 HAProxy 的 Ingress 控制器。
参考链接:
https://haproxy-ingress.github.io/
- Higress:
是一个基于 Envoy 的 API 网关, 可以作为一个 Ingress 控制器运行。
参考链接:
https://github.com/alibaba/higress
- 用于Kubernetes 的 HAProxy Ingress 控制器:
也是一个针对 HAProxy 的 Ingress 控制器。
参考链接:
https://github.com/haproxytech/kubernetes-ingress#readme
- Istio Ingress:
是一个基于 Istio 的 Ingress 控制器。
参考链接:
https://istio.io/latest/zh/docs/tasks/traffic-management/ingress/kubernetes-ingress/
- 用于 Kubernetes 的 Kong Ingress 控制器:
是一个用来驱动 Kong Gateway 的 Ingress 控制器。
参考链接:
https://github.com/Kong/kubernetes-ingress-controller#readme
- Kusk Gateway
是一个基于 Envoy 的、 OpenAPI 驱动的 Ingress 控制器。
参考链接:
https://kusk.kubeshop.io/
- 用于 Kubernetes 的 NGINX Ingress 控制器:
能够与 NGINX 网页服务器(作为代理)一起使用。
参考链接:
https://www.f5.com/products/nginx/nginx-ingress-controller
- ngrok Kubernetes Ingress 控制器:
是一个开源控制器,通过使用 ngrok 平台为你的 K8s 服务添加安全的公开访问权限。
参考链接:
https://github.com/ngrok/kubernetes-ingress-controller
- OCI Native Ingress Controller:
是一个适用于 Oracle Cloud Infrastructure 的 Ingress 控制器,可帮助你管理 OCI 负载均衡。
参考链接:
https://github.com/oracle/oci-native-ingress-controller#readme
- OpenNJet Ingress Controller:
是一个基于 OpenNJet 的 Ingress 控制器。
参考链接:
https://gitee.com/njet-rd/open-njet-kic
- Pomerium Ingress 控制器
基于 Pomerium,能提供上下文感知的准入策略。
参考链接:
https://www.pomerium.com/docs/deploy/k8s/ingress
- Skipper :
HTTP 路由器和反向代理可用于服务组装,支持包括 Kubernetes Ingress 这类使用场景,是一个用以构造你自己的定制代理的库。
参考链接:
https://opensource.zalando.com/skipper/kubernetes/ingress-controller/
Traefik Kubernetes Ingress:
提供程序 是一个用于 Traefik 代理的 Ingress 控制器。
参考链接:
https://doc.traefik.io/traefik/providers/kubernetes-ingress/
Tyk Operator:
使用自定义资源扩展 Ingress,为之带来 API 管理能力。Tyk Operator 使用开源的 Tyk Gateway & Tyk Cloud 控制面。
参考链接:
https://github.com/TykTechnologies/tyk-operator
Voyager:
是一个针对 HAProxy 的 Ingress 控制器。
参考链接:
https://voyagermesh.com/
Wallarm Ingress Controller:
是提供 WAAP(WAF) 和 API 安全功能的 Ingress Controller。
参考链接:
https://www.wallarm.com/solutions/kubernetes-api-security
3.主流ingress实现功能对比
如上图所示,展现了主流ingress实现功能对比。我们后期在工作中应该关注的Ingress Class。
二.helm部署traefik实战
1.traefik特性
Træfɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。
它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。
Træfɪk特性如下:
- 1.它非常快;
- 2.无需安装其他依赖,通过Go语言编写的单一可执行文件;
- 3.支持 Rest API;
- 4.多种后台支持:Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, 并且还会更多
- 5.后台监控, 可以监听后台变化进而自动化应用新的配置文件设置;
- 6.配置文件热更新。无需重启进程;
- 7.正常结束http连接;
- 8.后端断路器;
- 9.轮询,rebalancer 负载均衡;
- 10.Rest Metrics;
- 11.支持最小化 官方 docker 镜像
- 12.后台支持SSL
- 13.前台支持SSL(包括SNI)
- 14.清爽的AngularJS前端页面
- 15.支持Websocket
- 16.支持HTTP/2
- 17.网络错误重试
- 18.支持Let’s Encrypt (自动更新HTTPS证书)
- 19.高可用集群模式
参考链接:
https://traefik.cn/
https://docs.traefik.cn/
2.traefik核心概念
Traefik所示一个边缘路由器,它会拦截外部的请求并根据逻辑规则选择不同的操作方式,这些规则决定着这些请求到底该如何处理。
Traefik提供自动发现能力,会实时检测服务,并自动更新路由规则。
如上图所示,请求首先会链接到"entrypoint(入口点)","frontends(前端)"和"backends(后端)"
- entrypoint(入口点):
请求在入口点处结束, 顾名思义, 它们是Træfɪk的网络入口(监听端口, SSL, 流量重定向...)。
Entrypoints是Traefik的网络入口,它定义接受请求的接口,以及是否监听TCP或者UDP。
- frontends(前端):
之后流量会导向一个匹配的前端。 前端是定义入口点到后端之间的路由的地方。
路由是通过请求字段(Host, Path, Headers...) 来定义的,它可以匹配或否定一个请求。
- backends(后端):
前端将会把请求发送到后端。后端可以由一台或一个通过负载均衡策略配置后的多台服务器组成。
最后, 服务器将转发请求到对应私有网络的微服务当中去。
这涉及到以下几个重要核心组件:
- Providers
Providers是基础组件,Traefik的配置发现是通过它来实现的,它可以是协调器,容器引擎,云提供商或者键值存储。
Traefik通过查询Provides的API来查询路由的相关信息,一旦检测到变化,就会动态的更新路由。
- Routers
Routess主要用于分析请求,并负责将这些请求连接到对应的服务上去。
在这个过程中,Routers还可以使用Middlewares来更新请求,比如:在把请求发到服务之前添加一些Headers。
- Middlewares
Middlewarees用来修改请求或者根据请求来做出一些判断(authentiacation,rate limiting,headers,...),
中间件被附加到路由上,是一种在请求发送到你的服务之前(或者在服务的响应发送到客户端之前)调整请求的一种方法。
- Services
Servers负责配置如何到达最终将处理传入的实际服务。
3.部署helm环境
1.下载helm软件包
[root@master241 ~]# wget http://192.168.14.253/Resources/Kubernetes/Add-ons/helm/softwares/helm-v3.17.3-linux-amd64.tar.gz
2.解压软件包
[root@master241 ~]# tar xf helm-v3.17.3-linux-amd64.tar.gz -C /usr/local/bin/ linux-amd64/helm --strip-components=1
[root@master241 ~]#
[root@master241 ~]# ll /usr/local/bin/helm
-rwxr-xr-x 1 1001 fwupd-refresh 58155160 Apr 10 01:49 /usr/local/bin/helm*
[root@master241 ~]#
3.配置自动补全功能
[root@master241 ~]# helm completion bash > /etc/profile.d/helm.sh
[root@master241 ~]# source /etc/profile.d/helm.sh
[root@master241 ~]#
[root@master241 ~]# helm
completion (generate autocompletion scripts for the specified shell)
create (create a new chart with the given name)
dependency (manage a chart's dependencies)
env (helm client environment information)
get (download extended information of a named release)
help (Help about any command)
history (fetch release history)
install (install a chart)
lint (examine a chart for possible issues)
list (list releases)
package (package a chart directory into a chart archive)
plugin (install, list, or uninstall Helm plugins)
pull (download a chart from a repository and (optionally) unpack it in local directory)
push (push a chart to remote)
registry (login to or logout from a registry)
repo (add, list, remove, update, and index chart repositories)
rollback (roll back a release to a previous revision)
search (search for a keyword in charts)
show (show information of a chart)
status (display the status of the named release)
template (locally render templates)
test (run tests for a release)
uninstall (uninstall a release)
upgrade (upgrade a release)
verify (verify that a chart at the given path has been signed and is valid)
version (print the client version information)
[root@master241 ~]# helm
4.基于helm部署Traefik
1.添加helm仓库
[root@master241 ~]# helm repo add traefik https://traefik.github.io/charts
"traefik" has been added to your repositories
[root@master241 ~]#
2.更新仓库
[root@master241 ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "traefik" chart repository
Update Complete. ⎈Happy Helming!⎈
[root@master241 ~]#
3.查询支持按照Traefik的版本
[root@master241 ~]# helm search repo traefik -l
NAME CHART VERSION APP VERSION DESCRIPTION
traefik/traefik 35.4.0 v3.4.0 A Traefik based Kubernetes ingress controller
traefik/traefik 35.3.0 v3.4.0 A Traefik based Kubernetes ingress controller
traefik/traefik 35.2.0 v3.3.6 A Traefik based Kubernetes ingress controller
traefik/traefik 35.1.0 v3.3.6 A Traefik based Kubernetes ingress controller
traefik/traefik 35.0.1 v3.3.6 A Traefik based Kubernetes ingress controller
traefik/traefik 35.0.0 v3.3.5 A Traefik based Kubernetes ingress controller
traefik/traefik 34.5.0 v3.3.4 A Traefik based Kubernetes ingress controller
...
4.下载软件包
[root@master241 traefik]# helm pull traefik/traefik --version v35.4.0
[root@master241 traefik]#
[root@master241 traefik]# tar xf traefik-35.4.0.tgz
[root@master241 traefik]#
[root@master241 traefik]# ll
total 260
drwxr-xr-x 3 root root 4096 Jun 3 10:38 ./
drwxr-xr-x 3 root root 4096 May 30 18:45 ../
drwxr-xr-x 4 root root 4096 Jun 3 10:38 traefik/
-rw-r--r-- 1 root root 253640 Jun 3 10:38 traefik-35.4.0.tgz
[root@master241 traefik]#
[root@master241 traefik]#
5.安装Traefik
[root@master241 traefik]# vim traefik/values.yaml
...
ingressRoute:
dashboard:
...
enabled: true
[root@master241 traefik]# helm install jiege-traefik traefik -n kube-public
NAME: jiege-traefik
LAST DEPLOYED: Tue Jun 3 10:40:31 2025
NAMESPACE: kube-public
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
jiege-traefik with docker.io/traefik:v3.4.0 has been deployed successfully on kube-public namespace !
[root@master241 traefik]#
6.查看安装信息
[root@master241 traefik]# helm -n kube-public list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
jiege-traefik kube-public 1 2025-06-01 10:40:31.009559797 +0800 CST deployed traefik-35.4.0 v3.4.0
[root@master241 traefik]#
7.查看Pod信息
[root@master241 traefik]# kubectl get all -n kube-public -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/jiege-traefik-557f7595b6-2z5jj 1/1 Running 0 38s 10.100.207.18 worker243 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/jiege-traefik LoadBalancer 10.207.103.168 10.0.0.150 80:30493/TCP,443:32342/TCP 38s app.kubernetes.io/instance=jiege-traefik-kube-public,app.kubernetes.io/name=traefik
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/jiege-traefik 1/1 1 1 38s jiege-traefik docker.io/traefik:v3.4.0 app.kubernetes.io/instance=jiege-traefik-kube-public,app.kubernetes.io/name=traefik
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/jiege-traefik-557f7595b6 1 1 1 38s jiege-traefik docker.io/traefik:v3.4.0 app.kubernetes.io/instance=jiege-traefik-kube-public,app.kubernetes.io/name=traefik,pod-template-hash=557f7595b6
[root@master241 traefik]#
[root@master241 traefik]#
温馨提示:
如果报错缺少自定义资源,则需要使用自己的自定义资源哟。
1.创建自定义资源
[root@master241 traefik]# wget https://raw.githubusercontent.com/traefik/traefik/v3.4/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml
[root@master241 traefik]# kubectl apply -f kubernetes-crd-definition-v1.yml
2.创建自定义资源的RBAC
[root@master241 traefik]# wget https://raw.githubusercontent.com/traefik/traefik/v3.4/docs/content/reference/dynamic-configuration/kubernetes-crd-rbac.yml
[root@master241 traefik]# kubectl apply -f kubernetes-crd-rbac.yml
5.暴露Traefik的dashboard
1.编写Server资源清单
[root@master241 traefik]# cat jiege-traefik-dashboard.yaml
apiVersion: v1
kind: Service
metadata:
name: jiege-traefik-dashboard
namespace: kube-public
spec:
ports:
- name: dashboard
port: 8080
selector:
app.kubernetes.io/name: traefik
type: LoadBalancer
[root@master241 traefik]#
2.创建资源
[root@master241 traefik]# kubectl apply -f jiege-traefik-dashboard.yaml
service/jiege-traefik-dashboard created
[root@master241 traefik]#
[root@master241 traefik]# kubectl get -f jiege-traefik-dashboard.yaml
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jiege-traefik-dashboard LoadBalancer 10.205.166.47 10.0.0.151 8080:30989/TCP 5s
[root@master241 traefik]#
3.访问Traefik的WebUI(如上图所示)
http://10.0.0.151:8080/dashboard/#/
本文来自博客园,作者:尹正杰,转载请注明原文链接:https://www.cnblogs.com/yinzhengjie/p/18906593,个人微信: "JasonYin2020"(添加时请备注来源及意图备注,有偿付费)
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。