想写下这篇文章主要是想记录一下最近自己一直在弄的一个东西。相对来说这个东西现在是属于比较新的吧,网上基本找不到有用的资料。

以前我在学习的过程中k8s进行服务名的暴露我使用的是Ingress-nginx。他的本质也就是一个封装了的Nginx,当我们通过yaml文件编写对应的匹配规则时,他也就会把规则写入他的conf文件,进行反代。

但是我到了工作之后发现,根本没用这东西了,取而代之的是一个我没听说过的东西——Traefik。Traefik对K8的兼容那是没得说,所以为什么Ingress-nginx会被他取代也是显而易见的,总结来说我认为主要是有以下几点:

* 功能繁多,支持很多种中间件

* Ingress通过Ingress-control与Api-server进行通信,而Traefik能够直接与Api进行通信,实时感知K8集群的变化

* 自带友好的dashboard界面

* 支持四层和七层进行代理,Ingress只能使用四层进行代理

 

回归正题,我们都知道Nginx是强大的web服务器的同时还是负载均衡器。在上面可以配置很多功能,一定程度上以保障我们服务器的安全。所以很多公司选择了使用Nginx顶在内网的最前端,那么当我们使用Nginx来代理Traefik进行服务名发现时,需要注意的是要对Nginx转发请求头进行设置,也就是proxy_set_header,如何进行设置我就不比比来来了,相信能看到这里的都知道该怎么去整。

那么我们为什么要进行设置呢?下面两张图解答你的疑惑

这是对Nginx转发请求头进行了设置的报文

Traefik还是nginx traefik nginx_nginx

 

 

这是没设置的报文

Traefik还是nginx traefik nginx_请求头_02

 

 

Nginx进行反代时候,由于他有自己的报文头参数,所以会对转发后的报文进行重写。如果我们不加以设置,如上所示,比如说我前端浏览器访问的是http://www.baidu.com 到了Nginx转发之后如果没有进行加以设置,那么转发过后变成了我们virtualhost的名字。在Nginx进行转发过程中,我们的访问域名(Traefik所允需服务名)丢失了。那么到达我们后端对应的node上,Traefik自然无法通过服务名来匹配相应的svc找到pod进行服务,所以就会“404 Not Found.”