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

使用Portainer和Agent来管理多个VPS

上一篇日记Traefik及Portainer边缘代理的配置写到使用Portainer的Edge Agent来管理在其他地方的VPS,后来又研究了一下,实际上Edge Agent边缘代理实际上主要是为没有公网ip,但具有互联网访问能力的节点而设计的,如果主机节点都有公网IP,可以被访问的话,那么实际上直接使用Agent即可。

Portainer官方提供一个免费的5节点商业版,https://www.portainer.io/pricing/take5,填个表就行,没啥验证,几分钟就能收到License。

根据文档描述,我们需要对Portainer设置一个环境变量AGENT_SECRET,作为和Agent通讯加密的密钥。基于此,Portainer的docker-compose编排文件如下

version: "3.3"

services:

  portainer:
    image: portainer/portainer-ee:2.14.2-alpine
    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
    environment:
      - AGENT_SECRET=12345678
    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

与之对应的Agent启动命令也要加上密钥

docker run -d -p 9001:9001 \
    --name portainer_agent \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /var/lib/docker/volumes:/var/lib/docker/volumes \
    -v /:/host \
    -e AGENT_SECRET=12345678 \
    portainer/agent:2.14.2-alpine

这里就直接开放9001端口了,如果走traefik的话,还要挨个配置域名太麻烦,我就直接用ip:9001,比较方便。

然后Add environment的时候选择Docker

最后点击Connect即可

一点说明:

为什么不用Edge Agent了?因为很慢,它依赖websocket的轮询,所以每次想用的时候可能要等很久,而普通的Agent就是简单的http连接,要用的时候就发请求,获取信息,不用的时候不发请求。