hb.wind

  • 文章
  • 技术栈
  • 联系我
  • 工具

hb.wind

Traefik v2配置说明和注意事项

2019-10-13

明确职责:

[providers] 提供者发现您的基础环境上存在的服务(它们的IP,运行状况等)
[entryPoints]入口点侦听传入流量(端口等)
[http.routers]路由器分析请求(主机,路径,headers,SSL等)
[http.middlewares]服务将请求转发到您的服务(负载均衡,...)
[http.services]中间件可以更新请求或根据请求做出决策(身份验证,速率限制,标头等)。

和之前的版本一样,Traefik v2 中的配置依然可以使用两种不同的方式:

静态配置:不经常修改的启动配置
包含提供者定义,并定义 Treafik 将要监听的入口点。
动态配置:可经常修改的路由配置
包含定义系统如何处理请求的所有配置内容。这些配置是可以改变的,而且是无缝热更新的,没有任何请求中断或连接损耗。

配置优先级

静态配置有如下三种不同的互斥方式(您只能同时使用一种),可以在Traefik中定义静态配置选项:

  1. 在配置文件中
  2. 在命令行参数
  3. 作为环境变量
    如果三种同时有在用,则按上面列出的顺序进行优先级评估。

如果没有为给定选项提供任何值,那么将应用默认值。此外,如果选项具有子选项,并且未指定任何这些子选项,则默认值也将适用。

例如,--providers.docker这个父选项只要存在,即使没有设置--providers.docker.endpoint这个子选项,该父选项本身也足以启用docker提供程序,并默认设置了--providers.docker.endpoint = "unix:///var/run/docker.sock"。因为父选项--providers.docker将设置(并重置)所有子选项的默认值。

编辑docker-compose.yml

由于完全采用traefik.toml文件的方式来配置,所以docker这边没有用到labels标签,这样做的好处是更加安全,也方便管理。

version: "3.7"
services:  
  traefik_proxy:
    hostname: traefik
    image: traefik:v2.0
    container_name: proxy-traefik
    restart: always
    networks:
      - traefik
      - internal
    ports:
      - "80:80"
      - "443:443"
      - "8090:8080"
    volumes:
      - ./traefik/traefik.toml:/etc/traefik/traefik.toml #用文件的方式来配置
      - ./traefik/log:/var/log
      - ./traefik/dynamic_conf.toml:/dynamic_conf.toml #加载动态配置
      - ./traefik/ssl:/ssl  #导入ssl证书
  web_hbxin:
    hostname: hbxin
    image: nginx
    container_name: web-hbxin
    restart: always
    command: [nginx, '-g', 'daemon off;']    
    networks:
      - traefik
      - internal
    volumes:
      - ./nginx/conf/conf.d:/etc/nginx/conf.d      
      - ./nginx/html:/usr/share/nginx/html
      - ./share/wwwroot:/usr/share/nginx/wwwroot
      - ./share/rewrite:/usr/share/nginx/rewrite
  api_iqiar:
    hostname: iqiar
    build: ./go
    container_name: api-iqiar
    restart: always
    networks:
      - traefik
      - internal
    depends_on:
      - mysql
networks:
  traefik:
    name: traefik
  internal:
    name: internal

创建traefik.toml

#声明入口点
[entryPoints]
  [entryPoints.http]
    address = ":80"
  [entryPoints.https]
    address = ":443"
  [entryPoints.traefik]
    address = ":8080"
#声明提供者
[providers]
    #docker作为提供者,默认配置需要共享套接字,因此会不安全,所以这里注释掉了,没有启用    
  #[providers.docker]
    #exposedByDefault = false #关闭对Docker容器的自动发现,默认是true
        #关闭后需要在docker-compose里面单独对某个容器加入- "traefik.enable=true" 标签,容器才能被发现。
    #endpoint = "unix:///var/run/docker.sock"
  #文件作为提供者
    [providers.file]
    filename = "dynamic_conf.toml" #加载动态文件配置
    watch = true #允许Traefik自动监视文件更改
[api]
  dashboard = true #开启WEB面板
  insecure = true  #开启不安全模式
  #debug = true
[log]
  #level = "DEBUG"
  filePath = "/var/log/debug.log"  
[accessLog]
  filePath = "/var/log/access.log"
  bufferingSize = 100 #文件自动分割

创建dynamic_conf.toml

[[tls.certificates]]
     #这里文件名需注意,要与域名匹配
    certFile = "./ssl/api.huangbin.xin.pem"
    keyFile = "./ssl/api.huangbin.xin.key" 
[[tls.certificates]]
     # 这里文件名需注意,要与域名匹配
    certFile = "./ssl/huangbin.xin.pem"
    keyFile = "./ssl/huangbin.xin.key" 
#路由配置
[http.routers]
        #API网站
        #声明一个名为api_dev的路由,主要用于本地调试
    [http.routers.api_dev] 
                #未指明入口点,则默认针对全部入口点
                #路由规则是匹配特定域名
        rule = "Host(`api.localhost`)"
                #路由指向一个名为service-api的服务
        service = "service-api"
                
        #声明一个名为api_prod_tls的路由,针对https,并开启TLS
    [http.routers.api_prod_tls]
                #针对名为https的入口点
        entryPoints = ["https"]
        rule = "Host(`api.huangbin.xin`)"
        service = "service-api"
                #针对这个路由开启TLS
        [http.routers.api_prod_tls.tls]
                
        #声明一个名为api_prod的路由,与上面同样的域名,但会强制将http请求重定向跳转到上面定义的https入口点
    [http.routers.api_prod]
                #针对名为http的入口点
        entryPoints = ["http"]
                #相比上文的路由,这里加了一个中间件,处理重定向
        middlewares = ["tls-redirect"]
        rule = "Host(`api.huangbin.xin`)"
        service = "service-api"                
    
    [http.routers.web_default]        
        rule = "Host(`localhost`)"
        service = "service-web"
        
        #坑点一个,以下同一个域名同时面对两个规则,优先级priority的值默认都是0,那么取规则最长的路由
        [http.routers.web_dev_long]
        rule = "HostRegexp(`*.localhost`)"
        service = "service-web"
                priority = 0
    [http.routers.web_dev]        
        rule = "Host(`hb.localhost`)"
        service = "service-web"
                priority = 0
                
        #主站,配置与上文大同小异,进修改了域名和服务名
    [http.routers.web_prod_tls]
        #由于下文已经存在了TLS节点,所以这里即使不写entryPoints = ["https"],也仍然会只处理https请求,忽略http请求,而且Traefik将终止SSL连接,直接将解密的数据发送到services
        rule = "Host(`huangbin.xin`)"
        service = "service-web"    
        [http.routers.web_prod_tls.tls]
    [http.routers.web_prod]
        entryPoints = ["http"]
        middlewares = ["tls-redirect"]
        rule = "Host(`huangbin.xin`)"
        service = "service-web"
                
#中间件配置
[http.middlewares]
        #重定向方案,将http强制跳转到https
    [http.middlewares.tls-redirect.redirectScheme]
                #重定向到入口点https
        scheme = "https"
                #开启301永久重定向
                permanent = true
#服务配置
[http.services]
        #声明一个名为service-api的服务
    [http.services.service-api]
        #声明一组负载均衡器
                [http.services.service-api.loadBalancer]
                        #声明一台服务器
            [[http.services.service-api.loadBalancer.servers]]
                url = "http://api_iqiar/"     #官方文档没有讲明白,注意这里需填写可以被traefik访问到的url地址,这里api_iqiar是我的docker容器名称,还可以改为服务器host或者ip
                        #再声明另一台服务器,组成负载均衡
                        [[http.services.service-api.loadBalancer.servers]]
                url = "http://api_iqiar_2/"
    [http.services.service-web]
        [http.services.service-web.loadBalancer]
            [[http.services.service-web.loadBalancer.servers]]
                url = "http://web_hbxin/"

使用docker标签配置,需要共享套接字,这会不安全,如果非要使用,可以参考下文链接:
开一个socat节点:https://blog.mikesir87.io/2018/07/letting-traefik-run-on-worker-nodes/
使用客户端证书进行身份验证:https://docs.docker.com/engine/security/https/

©2019 Powered by Aiddit.com | Theme – hb.wind | 鄂ICP备18029942号-2
Top