如何使用Traefik,在K3S+Rancher中实现不同端口访问不同内部服务根路径(K8S同理)
参考我的这篇文章我们可以知道,通过在K3S中设置L4负载均衡,能够轻松的开放主机端口访问。如果我们的目标是修改默认端口,以及配置Ingress的话,那么已经很好用了。但是,Ingress这种资源,由于被K3S整体接管,因此,Traefik作为IngressController的话(注意噢,这里我着重说的是作为IngressController),无论你新开多少个端口,你基本上都无法做到让某个端口独
参考我的这篇文章我们可以知道,通过在K3S中设置L4负载均衡
,能够轻松的开放主机端口访问。
如果我们的目标是修改默认端口,以及配置Ingress的话,那么已经很好用了。
但是,Ingress这种资源,由于被K3S整体接管,因此,Traefik作为IngressController
的话(注意噢,这里我着重说的是作为IngressController),无论你新开多少个端口,你基本上都无法做到让某个端口独立的响应某个服务。
上面一句话稍微拗口,这里举个例子:
假设有两个服务,一个A,一个B
其中A、B都是通过根路径/
访问,这种情况下,我们其实希望能做到80访问A
、8080访问B
。但是很遗憾,如果不做特别的事儿,仅使用Ingress,是无法达成的。
因为前面说了,作为IngressController,无论你新开多少个端口,它最后都指向了IngressController,而IngressController加载Ingress规则对象,对于所有端口都是一样的效果。
也就是说,假如我们为A、B配置了/
这个规则,那么80、8080都只能访问A或B
。这个大家可以自行尝试。
如果你的服务A或B,其UI资源(比如JS、CSS)没有进行特殊的路径处理,那么当根路径资源请求的时候,通过IngressController,无法分配到对应的服务上面去请求,也就是说A可能请求到B的JS。即使你可能通过traefik.ingress.kubernetes.io/rewrite-target设置了后端请求路径重写,因为页面资源可能还是请求的根路径,那么也会有问题
好了,废话了这么多,其实简单点,我们就是想做到不同主机端口访问不同的服务根路径。有同学肯定会说,我用NodePort就行了。没错,NodePort可以,可是,假如A服务只有http,而整个集群需要通过https访问,那么NodePort方式就捉襟见肘了。
因此,我们需要有一个东西,能够将不同的端口转发到内部的服务或者POD上面,同时,这个东西还能够方便的设置https。
这个东西就是Traefik(或者Nginx)。
因为使用了K3S,K3S默认装Traefik,那么这就很方便了。
我们的目标就是:通过部署新的Traefik
,让主机端口流量指向新的Traefik
,由这个新的Traefik
作为内部负载均衡,将流量转发到服务上。在Traefik上面,我们也可以加载证书。
我们还是假设80访问A的根路径、8080访问B的根路径为例(其中A、B可能是Service、也可能是POD,无所谓)
1、找到现有的Traefik的配置映射,克隆两个出来,假设名称为Traefix-config-A和Traefix-config-B。克隆出来的配置,最最最重要的地方就是:1)去掉[kubernetes]相关的配置。为社么要去掉呢,因为前面说了一句黑体字:作为IngressController。去掉这个,就是不让它成为IngressController;2)在配置文件末尾,按照Traefik官网的file一节在末尾加上[file]然后配置[frontend]和[backend]
这里我举一个配置好的例子供参考
# traefik.toml
logLevel = "DEBUG"
[traefikLog]
filePath = "/tmp/traefik.log"
format = "json"
[accessLog]
filePath = "/tmp/access.log"
format = "json"
defaultEntryPoints = ["http","https"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[[entryPoints.https.tls.certificates]]
CertFile = "/ssl/tls.crt"
KeyFile = "/ssl/tls.key"
[entryPoints.prometheus]
address = ":9100"
[ping]
entryPoint = "http"
#[kubernetes]
# ingressClass = "traefik-usercenter"
[metrics]
[metrics.prometheus]
entryPoint = "prometheus"
[file]
# rules
[backends]
[backends.usercenter]
[backends.usercenter.servers.server1]
url = "http://usercenter.form:80"
weight = 10
[frontends]
[frontends.usercenter]
entryPoints = ["http", "https"]
passHostHeader = true
backend = "usercenter"
[frontends.usercenter.routes]
[frontends.usercenter.routes.route0]
rule = "PathPrefix:/"
其中:backend对应的http://usercenter.form:80是集群内A的服务地址
2、
克隆
两个Traefik POD。重要的是设置他们的配置映射为刚才的Traefix-config-A和Traefix-config-B。这样一来,我们就启动了两个新的、纯粹的Traefik,它不受K8S的事件控制。它现在的目标就是把配置映射种的frontend转发到backend上面
3、配置两个L4负载均衡,设定80和8080两个服务端口;并且设置其转发的目标是前一步创建的Traefik POD的对应端口(根据情况选择是否要转发到https端口上)。不明白的请参见文章开头一句。
经过以上步骤,我们就可以通过主机的80和8080分别访问到A、B的根路径。实现了不同端口访问不同服务。
其过程可以理解如下:
[80,8080]-->(主机iptables。由Klipper创建)-->[集群内Traefik POD]--->(backends)-->[A或B]
当然,80、8080的Traefik,可以通过修改其配置映射中的backends和frontends,代理到集群内其他任何POD服务中。
更多推荐
所有评论(0)