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/#/
posted @ 2025-06-01 23:10  尹正杰  阅读(258)  评论(0)    收藏  举报