一、简介
- 容器和云原生友好,与Docker、K8s深度集成,非常适合微服务架构
- 动态服务发现与自动更新路由规则
- 内置自签证书,也设置自动申请和续订 Let's Encrypt的HTTPS证书
- 丰富的中间件支持,如请求重定向、身份认证、限流等
- 开源地址可参考:https://github.com/traefik/traefik
二、安装与使用(Docker示例)
1. 创建一个自定义Docker桥接网络
docker network create --driver bridge traefik
2. 配置启动traefik
2.1 搭建示例一,使用内置tls证书
新建docker-compose.yml配置文件,注意提前把你的域名指向部署的服务器ip,如下的traefik.aimm.site替换为你的域名,内容如下:
version: '3' services: reverse-proxy: # The official v2 Traefik docker image image: traefik:v2.11 # Enables the web UI and tells Traefik to listen to docker command: - --api.insecure=true #启用不安全的 Traefik Dashboard(仅在内部网络中使用,生产环境请配置安全访问) - --providers.docker=true #启用 Docker 提供程序,以监控 Docker 容器的变化 - --providers.docker.exposedbydefault=false #默认不暴露所有容器,需要在容器中手动设置标签 - --entrypoints.web.address=:80 #定义 HTTP 的入口点 - --entrypoints.websecure.address=:443 #定义 HTTPS 的入口点 - --entrypoints.websecure.http.tls=true #默认是false,需要开启,为 HTTPS 入口点启用 TLS labels: #启用traefik服务 - "traefik.enable=true" #1设置路由,这里设置域名指向traefik的管理后台服务api@internal - "traefik.http.routers.traefik.rule=Host(`traefik.aimm.site`)" - "traefik.http.routers.traefik.service=api@internal" - "traefik.http.routers.traefik-ssl.rule=Host(`traefik.aimm.site`)" - "traefik.http.routers.traefik-ssl.service=api@internal" #1开启https访问,myresolver为上面traefik设置的acme证书申请配置名称 - "traefik.http.routers.traefik.entrypoints=web" - "traefik.http.routers.traefik-ssl.entrypoints=websecure" - "traefik.http.routers.traefik-ssl.tls=true" #使用自定义证书 #1使用自定义auth等中间件 - "traefik.http.routers.traefik.middlewares=redirect-to-https,auth" - "traefik.http.routers.traefik-ssl.middlewares=auth" #设置授权中间件auth,这里设置的账号密码都是admin,是由命令htpasswd -nb admin admin生成,htpasswd命令自行安装 - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$2bksvLvd$$WErOGWfUNl6YSaU5PRdb51" # 基于中间件的重定向 - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" ports: # The HTTP port - "80:80" - "443:443" # The Web UI (enabled by --api.insecure=true) #- "8080:8080" volumes: # 使得Traefik可以监听Docker事件 - /var/run/docker.sock:/var/run/docker.sock networks: - traefik networks: traefik: external: true
一键启动命令如下:
docker-compose up -d
启动成功后,可以访问域名进入相应的服务系统
浏览器认为自签证书的网站不安全,点击继续即可
由于设置了授权中间件,所以输入basic认证的账号密码来登录
成功进入管理后台,可以看到路由和负载情况
2.2 搭建示例二,使用Let's Encrypt证书
- 新建docker-compose.yml配置文件,主要调整自动申请使用Let's Encrypt颁发的https证书,配置内容如下:
注意:acme.json为保存自动申请证书的一些配置信息,避免每次启动都重新申请一次证书。这个文件需要提前创建,并且设置权限为600,可以执行:touch acme.json && chmod 0600 acme.jsonversion: '3' services: reverse-proxy: # The official v2 Traefik docker image image: traefik:v2.11 # Enables the web UI and tells Traefik to listen to docker command: - --api.insecure=false - --providers.docker=true - --providers.docker.exposedbydefault=false #默认不暴露所有容器,需要在容器中手动设置标签 - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 # Let's Encrypt配置,基于80端口的校验申请证书,如果报错,可查看docker-compose logs查看详情,最好email修改为可用的邮箱地址 - --certificatesresolvers.myresolver.acme.httpchallenge=true - --certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web - --certificatesresolvers.myresolver.acme.email=123456@qq.com - --certificatesresolvers.myresolver.acme.storage=/acme.json labels: #启用traefik服务 - "traefik.enable=true" #1设置路由 - "traefik.http.routers.traefik.rule=Host(`traefik.aimm.site`)" - "traefik.http.routers.traefik.service=api@internal" - "traefik.http.routers.traefik-ssl.rule=Host(`traefik.aimm.site`)" - "traefik.http.routers.traefik-ssl.service=api@internal" #1开启https访问,myresolver为上面traefik设置的acme证书申请配置名称 - "traefik.http.routers.traefik.entrypoints=web" - "traefik.http.routers.traefik-ssl.entrypoints=websecure" - "traefik.http.routers.traefik-ssl.tls.certresolver=myresolver" #1使用自定义auth等中间件 - "traefik.http.routers.traefik.middlewares=redirect-to-https,auth" - "traefik.http.routers.traefik-ssl.middlewares=auth" #设置授权中间件auth,这里设置的账号密码都是admin,是由命令htpasswd -nb admin admin生成,htpasswd命令自行安装 - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$2bksvLvd$$WErOGWfUNl6YSaU5PRdb51" # 基于中间件的重定向 - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" ports: # The HTTP port - "80:80" - "443:443" # The Web UI (enabled by --api.insecure=true) #- "8080:8080" volumes: # 使得Traefik可以监听Docker事件 - /var/run/docker.sock:/var/run/docker.sock #这是acme生成证书的信息保存的文件,与上面启动命令指定的容器内的位置一致 - ./acme.json:/acme.json networks: - traefik networks: traefik: external: true
- 启动之后,Traefik会自动帮你申请或者续期https证书,后面访问网站就是正常、安全的证书访问了
2.3 搭建示例三,使用文件配置,动态加载,服务热更新
- 新建docker-compose.yml配置文件,把配置文件目录映射到容器内 Traefik 配置目录,内容如下:
version: '3' services: reverse-proxy: image: traefik:v2.11 command: - --api.insecure=true - --providers.docker=true - --providers.docker.exposedbydefault=false - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 - --entrypoints.websecure.http.tls=true - --providers.file.directory=/etc/traefik/config - --providers.file.watch=true ports: # The HTTP port - "80:80" - "443:443" #- "8080:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock - ./config:/etc/traefik/config networks: - traefik networks: traefik: external: true
- 启动后,可以在 config 目录下,新建xxx.yml配置文件,因为设置了--providers.file.watch=true,traefik会动态加载相关配置并重启,文件格式样例如下:
下面是配置访问域名 portainer.aimm.site(提前做好DNS解析到服务器ip),反向代理与负载均衡的到后端portainer容器管理服务# config/pp.yml http: routers: pp: rule: "Host(`portainer.aimm.site`)" entrypoints: web,websecure service: pp services: pp: loadBalancer: servers: - url: "http://172.17.0.1:9000"
- 配置完毕,即可访问
3. 其他Docker服务接入Traefik网络路由
- 新建docker-compose.yml配置文件,如下portainer容器管理服务启动示例,需要设置和traefik同一个网络,并且正确设置labels标签
version: '3' services: portainer: image: portainer/portainer-ce:sts restart: always #ports: # - "9000:9000" labels: #需要启用traefik服务 - "traefik.enable=true" - "traefik.http.routers.portainer.rule=Host(`portainer2.aimm.site`)" - "traefik.http.routers.portainer.entrypoints=websecure" - "traefik.http.routers.portainer.tls=true" #自定义证书时,开启这个,注释下面一行 #- "traefik.http.routers.portainer.tls.certresolver=myresolver" #Let's Encrypt证书时,开启这个,注释上面一行 - "traefik.http.services.portainer.loadbalancer.server.port=9000" #指定portainer服务的端口 volumes: - ./data:/data - /var/run/docker.sock:/var/run/docker.sock networks: - traefik networks: traefik: external: true
- 如上配置,访问域名:https://portainer2.aimm.site/,即可访问portainer服务
三、总结
- Traefik的动态配置和自动服务发现功能非常好用,配置也算简单,与Docker服务、微服务非常般配
- 自动的证书服务,无论是Let's Encrypt或者自签证书,都能实现一键开启数据传输安全,同时需要更少的运维负担
- go语言开发,性能不输nginx,而且支持各种中间件、扩展插件,玩法很多,值得关注