如何使用Traefik,在K3S+Rancher中实现不同端口访问不同内部服务根路径(K8S同理)

参考我的这篇文章我们可以知道,通过在K3S中设置L4负载均衡,能够轻松的开放主机端口访问。

如果我们的目标是修改默认端口,以及配置Ingress的话,那么已经很好用了。

但是,Ingress这种资源,由于被K3S整体接管,因此,Traefik作为IngressController的话(注意噢,这里我着重说的是作为IngressController),无论你新开多少个端口,你基本上都无法做到让某个端口独立的响应某个服务。

上面一句话稍微拗口,这里举个例子:

假设有两个服务,一个A,一个B
其中A、B都是通过根路径/访问,这种情况下,我们其实希望能做到80访问A8080访问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服务中。

你可能感兴趣的:(随笔,docker)