运维相关 · 2022年7月22日 0

Traefik及Portainer边缘代理的配置

目前我的几个vps都改成了纯docker环境,为了管理方便,用上了Portainer,因为都在不同的地方,所以没办法组成集群来使用,所以只能依赖Portainer的Edge Agent边缘代理来进行管理。不过好在挺方便的,就是官方文档有点坑,这里把踩过的坑记录一下。

版本情况

traefik:v2.8.1
portainer: v2.14.1

Portainer的官方traefik配置文档地址:https://docs.portainer.io/advanced/reverse-proxy/traefik

我的基本跟官方差不多,略有修改

version: "3.3"

services:

  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    command: -H unix:///var/run/docker.sock
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer:/data
    networks:
      - work-net
    labels:
      # Frontend
      - "traefik.enable=true"
      - "traefik.http.routers.frontend.rule=Host(`pt.mooim.com`)"
      - "traefik.http.routers.frontend.entrypoints=websecure"
      - "traefik.http.services.frontend.loadbalancer.server.port=9000"
      - "traefik.http.routers.frontend.service=frontend"
      - "traefik.http.routers.frontend.tls=true"
      - "traefik.http.routers.frontend.tls.certresolver=dnspod"

      # Edge
      - "traefik.http.routers.edge.rule=Host(`edge.mooim.com`)"
      - "traefik.http.routers.edge.entrypoints=websecure"
      - "traefik.http.services.edge.loadbalancer.server.port=8000"
      - "traefik.http.routers.edge.service=edge"
      - "traefik.http.routers.edge.tls=true"
      - "traefik.http.routers.edge.tls.certresolver=dnspod"

networks:
  work-net:
    external: true

volumes:
  portainer:
    name: portainer

注意,这里我并没有开放宿主机的8000端口供边缘代理通过websocket访问,而是用traefik的443提供,所以后面会有一些需要手动执行的部分。

一般来说,Portainer创建Edge Agent以后会给你一串类似下面的命令,用于在边缘主机上执行

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/lib/volumes:/var/lib/docker/volumes \
  -v /:/host \
  -v portainer_agent_data:/data \
  --restart always \
  -e EDGE=1 \
  -e EDGE_ID=46cef205-1476-451b-9a29-748b8f3aa8e3 \
  -e EDGE_KEY=aHR0cHM6Ly9wdC5tb29pbS5jb218cHQubW9vaW0uY29tOjgwMDB8ZDc6ZjE6NjY6ZDQ6MzQ6NTk6NGM6YWY6YWQ6ZjM6ZmE6ZWY6MTI6M2Y6YzM6OTV8OA \
  -e EDGE_INSECURE_POLL=1 \
  --name portainer_edge_agent \
  portainer/agent:2.14.1

首先要注意-v /var/lib/volumes:/var/lib/docker/volumes这里,如果你修改过docker的路径,那么要改为对应的,其次就是

EDGE_KEY=aHR0cHM6Ly9wdC5tb29pbS5jb218cHQubW9vaW0uY29tOjgwMDB8ZDc6ZjE6NjY6ZDQ6MzQ6NTk6NGM6YWY6YWQ6ZjM6ZmE6ZWY6MTI6M2Y6YzM6OTV8OA

这里需要修改,EDGE_KEY经过base64解码以后得到的应该是类似这样的东西

https://pt.mooim.com|pt.mooim.com:8000|d7:f1:66:d4:34:59:4c:af:ad:f3:fa:ef:12:3f:c3:95|8

这时候需要将内容改为

https://pt.mooim.com|https://edge.mooim.com|d7:f1:66:d4:34:59:4c:af:ad:f3:fa:ef:12:3f:c3:95|8

然后在base64编码并去掉最后的等号=,得到一个base64编码再覆盖回原来的命令,然后去其他的机器上执行就可以了。

这样一来,就不用在Portainer宿主机上开放8000端口,而且websocket走的也是经过tsl加密的wss协议,安全性更有保障了。

最后,来张效果图

PS:吐槽一下,Portainer只能支持单一docker-compose.yml文件部署,但凡带了映射文件的都不能用,希望后续版本可以改进