一、Agent:

适用于集群控制,如swarm,kubernetes。

  1. 在manage端点运行命令(work端点无法运行),然后根据agent-stack这个文件,进行swarm集群环境下多个服务的编排,但其实也就部署了agent这一个服务

       curl -L https://downloads.portainer.io/agent-stack.yml -o agent-stack.yml && docker stack deploy --compose-file=agent-stack.yml portainer-agent

agent-stack文件内容:

version: '3.2'

services:
  agent:
    image: portainer/agent
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    ports:
      - target: 9001
        published: 9001
        protocol: tcp
        mode: host
    networks:
      - portainer_agent
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

networks:
  portainer_agent:
    driver: overlay
    attachable: true

 2.添加端点ip地址,将Portainer与agent建立通信。因为集群里的每台机器都安装了agent代理,所以这里的ip地址可以任填一个。

 

二、Edge Agent(边缘代理):

  1. portainer容器运行,同时需要暴露8000端口,方便Portainer通过端口8000与边缘代理进行通信
  2. 在被需要管理的端点上运行portainer-agent容器
  3. Portainer与边缘断点建立连接,进行通信

 

添加Edge Endpoint,前提是portainer容器要暴露8000端口:

3步骤里,添加的是portainer所在服务器地址,接着在需要被监控的服务器里安装portainer-agent

然后配置需要被监控的服务器ip地址,然后更新终点信息

 

三、Docker直连

直接与远程机器的docker api进行通信

     1、编辑docker宿主机文件/lib/systemed/system/docker.service,修改ExecStart行

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

     2、Portainer通过指定端口连接远程docker API

 

总结:

  1. Agent适用于集群部署,包括swarm,kubernetes;
  2. Edge Agent和docker API区别在于Edge Agent是通过portainer agent代理的方式来与Portainer进行通信,而docker直连是直接与远程机器的Docker API进行通信
    Edge Agent主要用于远程机器与Portainer实例不在同一网络中的情况,也就是说Edge Agent可以实现内网穿透,只需要在内网里的机器运行portainer-agent代理容器;而docker直连无法完成。
  3. 不推荐在生产环境中使用Docker API直接通信的方式,因为直接暴露端口的方式容易导致服务器被利用,例如进行挖矿。

 

github项目:Portainer/agent

Portainer agent技术细节

  1. 代理通过Unix socket / Windows命名管道与部署在其上的Docker节点进行通信,以检索有关节点的信息(名称、IP地址、集群中所扮演的角色)
  2. 为了将请求代理到集群内的其他代理,引入了一个名为“X-PortainerAgent-Target”的header,它可以使用集群中任何节点的名称作为值。当指定此头时,接收请求的Portainer代理将提取其值,检索使用此头值指定的节点上的代理的地址,并将请求代理给它。
    如果header不存在,假设接收请求的代理是请求的目标,那么它将被代理到本地的Docker API。
    有些请求被特别标记为针对集群内的manage节点执行,例如 /services/**,/tasks/**,/nodes/**,那么不管在集群中任何代理上执行这些请求,它们都会被代理到manage节点上。
  3. 代理最终的代理目标始终是Docker API,意味着将保持Docker的原始响应格式。该响应的唯一区别是,代理将使用Portainer-agent的版本作为值,自动将Portainer-agent header添加到每个响应。

 

Edge Agent技术细节

  1. 启动时,agent将访问Portainer实例,并负责创建一个反向隧道,允许Portainer查询。agent使用一个令牌(Edge key),该令牌包含连接到Portainer实例所需的信息。
  2. Edge key采用 base64编码并且包含以下信息:①Portainer instance API URL;②Portainer instance tunnel server address(隧道服务地址);③Portainer instance tunnel server fingerprint(隧道服务指纹);④Endpoint identifier(端点标识符)

    格式如下:
    portainer_instance_url | tunnel_server_addr | tunnel_server_fingerprint | endpoint_ID
    例如Edge key:aHR0cDovLzE3Mi4zMS43My4xOTE6OTAwMHwxNzIuMzEuNzMuMTkxOjgwMDB8ZWM6ZDE6MjA6MzM6NWU6NDk6MDU6Zjc6NjU6Nzk6NTA6OWU6ZjU6NjY6Mzg6YTB8MTM

    解码之后为:
    http://172.31.73.191:9000|172.31.73.191:8000|ec:d1:20:33:5e:49:05:f7:65:79:50:9e:f5:66:38:a0|13
  3. 当Edge key与Edge agent绑定后,agent将开始轮询Portainer实例。轮询请求的响应包含以下信息:隧道状态,轮询频率,隧道端口,加密证书,时间表。然后代理将使用响应中的隧道端口以及加密证书创建反向隧道。

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐