traefik初探——ingressroute用法

半日闲 2020年11月16日 32次浏览

经过翻译的中文官方文档(重点只介绍了以dockerkubernetesprovider的部分)

https://www.qikqiak.com/traefik-book/

ingress介绍

官方解释ingress

​ 管理对集群中的服务(通常是HTTP)的外部访问的API对象。Ingress可以提供负载平衡、SSL终端和基于名称的虚拟主机

简单来说,ingress就是路由的配置规则。但是日常中提及ingress往往是包括2方面,1是ingress资源本身,2是ingress controller,其中ingresskubernetes本身自带的资源,但是ingress controller确是由很多中实现方案,其中最好的2种就是nginxtraefik,以nginx作为实现方案的controller是开源社区官方认可方案,文档较多,使用也较为广泛,而以traefik为实现方案的是第三方来实现的,而traefik本身的特性,极其贴合微服务的架构,性能也极好,因此都很著名,本文测试的ingresstraefik,因为在nginx ingress的实现方案中,需要拉取gcr.io的镜像,但是,天朝屏蔽了该地址。。。。。。。。

traefik架构介绍

image-20201116171204011

针对于从集群外进来的请求,有traefik处理后,可以根据pathhostnameheader等的不同,将请求转发到对应的后端,traefik支持的后端(provider)非常多,如下

image-20201116171500962

对于traefik来讲,其结构,有entrypointsproviderroutermiddlewaresservice,解释图如下

image-20201116171556856

  • Providers 来发现基础设施上存在的服务(它们的 IP、运行状况等...)
  • Entrypoints 监听传入的流量(端口等...)
  • Routers 分析请求(host, path, headers, SSL, ...)
  • Services 将请求转发到你的服务(load balancing, ...)
  • Middlewares 中间件,用来修改请求或者根据请求来做出一些判断 (authentication, rate limiting, headers, ...)

image-20201116171733655

traefik部署

配置官方helm仓库

helm repo add traefik https://helm.traefik.io/traefik && helm repo update && helm search repo traefik

可以搜索到最新的traefikchart

image-20201116172155923

由于本次只是尝鲜的原因,因此不在意安全问题的话,可以打开dashboard,即修改chart中的values.yaml文件中关于dashboardingressroute部分即可

image-20201116172400070

安装traefik

cd traefik
helm install traefik .

部署后,可查看到如下

image-20201116172741097

可以看到traefikhttp端口监听在30080,其https端口监听在30443

开启了dashboardingreeroutes,因此默认会出现2个ingressroutes,其中的simpleingressroute是我另外创建的

可以看到traefik监听在本机的39000端口,30080端口,30443端口,

浏览器hostip:39000/dashboard/即可访问dashboard,可以看到有3个entrypoints

image-20201116173016063这3个entrypointstraefikcontainer暴露的端口

查看traefik deployyaml可以查看到entrypoints的定义

kubectl get deploy traefik -o yaml 

可以看到如下的traefikdeploy中有如下的定义,

image-20201116173310856

可以看到定义中的端口和名称与dashboard中看到的entrypoints一致

ingressroute测试

ingressroutetraefik自定义的kubernetes资源,如下,可以查看到traefik创建的所有资源

kubectl api-resources | grep traefik

可以查看到

image-20201116193557289

准备测试服务

本次测试使用的web服务,为自行编译的docker镜像,非官方的busybox镜像(在busybox中开启了httpd服务),其中deployyaml文件如下

image-20201116193926774

由于将镜像推送到了阿里云的镜像仓库中,因此对涉及隐私的地方,打了标记,因为是私有仓库,因此在yaml中增加了imagePullSecrets字段(其中包含私有仓库的usernamepassword

secret如何进行创建,可以参考以下链接

https://kengdie.xyz/archives/kubernetes%E9%9B%86%E7%BE%A4%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98#docker%E9%95%9C%E5%83%8Fpull%E6%80%BB%E6%98%AFtimeout%E5%A6%82%E4%B8%8B

busyboxpod创建svc,其中svcyaml文件如下

image-20201116194346277

创建busyboxdeploysvc,如下

kubectl apply -f busybox-httpd-deploy.yaml
kubectl apply -f busybox-httpd-svc.yaml

创建后,直接使用curl命令显示可以访问成功,如下

image-20201116194828493

可以看到无论是直接访问podip还是,访问的相应的svc都是可以访问成功

创建ingressroute

创建ingressrouteyaml文件如下

image-20201116195130009

没有使用tls,因此指定的entrypoint是名为web,其中match字段指定匹配的规则,services指定的后端的
svc以及相应的port

创建ingressroute服务

kubectl apply busybox-httpd-ingressroute.yaml

可以查看到创建的ingressroute

image-20201116195516406

在本机的/etc/hosts文件中写入httpd.a.b对应ip

image-20201116195608441

通过treafikloadbalancer指定的30080端口访问服务

image-20201116195659460

显示访问成功