k8s与监控--引入traefik作后端服务的反代

前言

对于监控这块,咱们基于prometheus实现,固然作了大量的优化,包括前面所讲到的配置接口化。咱们整个监控的UI部分,没有采用社区流行的grafana,而是本身实现了一套。咱们后端的服务按照功能拆分了几大块,例如拓扑,网络流量,配置,元数据等等。拆分的好处就是能够解耦,各个模块功能的升级不影响其余模块。可是对于前端来讲,只暴露一个入口,引入一个反代便可。
刚开始选用了nginx,后期因为要加入鉴权的功能,nginx就不能知足咱们的需求了。这个时候基本上需求就变为选择一个可编程的反代。固然我在作电商的时候,咱们常常采用openresty,结合nginx和lua,能够实现。并且社区基于openresty实现了kong和orange等api网关。
可是考虑咱们的场景,整个项目并无特别高的并发和性能要求,并且咱们团队最熟悉的是golang和python。因此选择了traefik。咱们能够在后期,能够写各类的插件来知足咱们的需求。前端

traefik简介

Træfɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。python

图片描述
简单总结一下我认为traefik的特色:nginx

  1. 官方测试traefik有nginx 85%的性能。这个性能对于通常项目足够了,换来的是强大的编程能力,来从容应对各类需求。并且golang编写,无依赖。
  2. 配置热更新,支持多种后端。
  3. 支持集群模式
  4. 提供了一个web UI

结合项目写demo

咱们的项目目前基本两个需求,鉴权和反代。golang

配置文件

对于反代。主要讲一些配置相关。咱们采用的是file。traefik对这种静态文件支持watcher。依旧无需重启进程。web

主配置文件traefik.tomldocker

################################################################
# Global configuration
################################################################

# Enable debug mode
#
# Optional
# Default: false
#
# debug = true

# Log level
#
# Optional
# Default: "ERROR"
#
# logLevel = "ERROR"

# Entrypoints to be used by frontends that do not specify any entrypoint.
# Each frontend can specify its own entrypoints.
#
# Optional
# Default: ["http"]
#
# defaultEntryPoints = ["http", "https"]

# Entrypoints definition
#
# Optional
# Default:
[entryPoints]
    [entryPoints.http]
    address = ":8000"

# Traefik logs
# Enabled by default and log to stdout
#
# Optional
#
# [traefikLog]

# Sets the filepath for the traefik log. If not specified, stdout will be used.
# Intermediate directories are created if necessary.
#
# Optional
# Default: os.Stdout
#
# filePath = "log/traefik.log"

# Format is either "json" or "common".
#
# Optional
# Default: "common"
#
# format = "common"

# Enable access logs
# By default it will write to stdout and produce logs in the textual
# Common Log Format (CLF), extended with additional fields.
#
# Optional
#
# [accessLog]

# Sets the file path for the access log. If not specified, stdout will be used.
# Intermediate directories are created if necessary.
#
# Optional
# Default: os.Stdout
#
# filePath = "/path/to/log/log.txt"

# Format is either "json" or "common".
#
# Optional
# Default: "common"
#
# format = "common"

################################################################
# Web configuration backend
################################################################

# Enable web configuration backend
[web]

# Web administration port
#
# Required
#
address = ":8080"

################################################################
# Docker configuration backend
################################################################

# Enable Docker configuration backend
# [docker]

# Docker server endpoint. Can be a tcp or a unix socket endpoint.
#
# Required
# Default: "unix:///var/run/docker.sock"
#
# endpoint = "tcp://10.10.10.10:2375"

# Default domain used.
# Can be overridden by setting the "traefik.domain" label on a container.
#
# Optional
# Default: ""
#
# domain = "docker.localhost"

# Expose containers by default in traefik
#
# Optional
# Default: true
#
# exposedbydefault = true


################################################################
# File configuration backend
################################################################
[file]
  filename = "rules.toml"
  watch = true

注意filename = "rules.toml",这个时候我把全部的代理规则写到一个rules.toml文件中,也算一种解耦的思路。
固然traefik也支持多文件。就是你能够指定一个路径,而后会将该路径下全部rule文件加载编程

[file]
  directory = "/path/to/config/"

下面是demo中的rules.tomljson

[backends]
  [backends.trend]
    [backends.trend.servers]
      [backends.trend.servers.server1]
      url = "http://api.domain.com:8812"
      weight = 1
    [backends.trend.healthcheck]
      path = "/"
      interval = "10s"
# Frontends
[frontends]
  [frontends.trend]
  backend = "trend"
   [frontends.trend.routes.router1]
    rule = "PathPrefixStrip:/trend"

启动traefik

执行后端

./traefik --c  traefik.toml

实际效果

访问ui:
图片描述api

对于鉴权:
traefik在中间件中支持了几种auth

  1. basic auth
  2. forward

目前forward基本能知足咱们的需求。将请求转发到统一认证服务。
固然oauth,jwt等之类是目前不支持的,可是实现起来很简单,增长一个中间件而已。

总结

没有最好的技术,只有合适的场景。

相关文章
相关标签/搜索