kubernetes traefik简单应用

本文介绍了使用traefik来暴露kubernetes集群应用。

post thumb
Kubernetes
作者 Louis 发表于 2020年7月28日

[TOC]

Traefik 是一个边缘路由器,是你整个平台的大门,拦截并路由每个传入的请求:它知道所有的逻辑和规则,这些规则确定哪些服务处理哪些请求;传统的反向代理需要一个配置文件,其中包含路由到你服务的所有可能路由,而 Traefik 会实时检测服务并自动更新路由规则,可以自动服务发现。

基本说明

首先,当启动 Traefik 时,需要定义 entrypoints(入口点),然后,根据连接到这些 entrypoints 的路由来分析传入的请求,来查看他们是否与一组规则相匹配,如果匹配,则路由可能会将请求通过一系列中间件转换过后再转发到你的服务上去。在了解 Traefik 之前有几个核心概念我们必须要了解:

  • Providers 用来自动发现平台上的服务,可以是编排工具、容器引擎或者 key-value 存储等,比如 Docker、Kubernetes、File
  • Entrypoints 监听传入的流量(端口等…),是网络入口点,它们定义了接收请求的端口(HTTP 或者 TCP)。
  • Routers 分析请求(host, path, headers, SSL, …),负责将传入请求连接到可以处理这些请求的服务上去。
  • Services 将请求转发给你的应用(load balancing, …),负责配置如何获取最终将处理传入请求的实际服务。
  • Middlewares 中间件,用来修改请求或者根据请求来做出一些判断(authentication, rate limiting, headers, …),中间件被附件到路由上,是一种在请求发送到你的服务之前(或者在服务的响应发送到客户端之前)调整请求的一种方法。

安装

我这里安装使用的镜像为traefik:v2.2.7, kuberbetes集群信息如下:

$ kubectl get nodes -owide
NAME             STATUS   ROLES    AGE    VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
dev-k8s-master   Ready    master   149m   v1.18.0   192.168.160.243   <none>        CentOS Linux 7 (Core)   4.4.228-2.el7.elrepo.x86_64   docker://19.3.12
dev-k8s-node     Ready    <none>   149m   v1.18.0   192.168.160.244   <none>        CentOS Linux 7 (Core)   4.4.228-2.el7.elrepo.x86_64   docker://19.3.9

安装 Traefik 到 Kubernetes 集群中的资源清单文件我这里提前准备好了,直接执行下面的安装命令即可: 主要是crddashboardtraefik deploymentrbac四个文件.

$ wget https://www.fenghong.tech/k8strain/traefik/all.yaml 
$ kubectl apply -f all.yaml

我们这里是通过命令行参数来做的静态配置:

 args:
   - --entrypoints.web.address=:80
   - --entrypoints.tcpep.address=:8000
   - --entrypoints.udpep.address=:9000/udp
   - --log.level=DEBUG
   - --api
   - --api.insecure
   - --providers.kubernetescrd
   - --providers.kubernetesingress

其中前三项配置是来定义 webtcpupd 这入口点的,--api 开启,就会创建一个名为 api@internal 的特殊 service,在 dashboard 中可以直接使用这个 service 来访问,然后其他比较重要的就是开启 kubernetesingresskubernetescrd 这两个 provider。这边我忽略了https的配置. 如果要配置ssl请参考其他文章.

部署完成后我们可以通过在本地 /etc/hosts 中添加上域名 traefik.domain.com 的映射即可访问 Traefik 的 Dashboard 页面了:

注: 这个是解析到 traefik正在运行的node节点ip

定义一个IngressRoute对象: 只用把域名解析到 traefik正在运行的node节点ip即可.

---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  namespace: default
  name: web-hello-world
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  routes:
  - match: Host(`helloworld.fenghong.tech`)
    kind: Rule
    services:
    - name: web-hello-world
      port: 8000

一个helloword-deployment完整示例

$ kubectl apply -f https://www.fenghong.tech/k8strain/traefik/test-helloworld.yaml

通过 entryPoints 指定了我们这个应用的入口点是 web,也就是通过 80 端口访问,然后访问的规则就是要匹配 helloworld.fenghong.tech 这个域名,才会被 web-hello-world 这个 Service 所匹配。我们可以直接创建上面的几个资源对象,然后对域名做对应的解析后,就可以访问应用了:

参考