使用Portainer的Agent模式管理DockerSwarm集羣

1、背景與環境

在一個四節點規模的docker swarm集羣上,使用Portainer的Agent模式進行集羣管理。node

  1. docker被收購後,官方已經放棄docker swarm。。。但這裏由於是小規模集羣,使用K8S得不償失,而K3S/MicroK8S等輕量級工具出現時間不長,尚無成熟落地案例。所以這裏依然使用docker swarm做爲docker集羣管理工具。
  2. Portainer是一個docker集羣管理UI工具,有CE版和商業版。其中CE版本已經足夠使用,這裏使用的是CE版。

4個節點的操做系統均爲CentOS7,CentOS7使用的防火牆是firewalld,若是是生產環境不能關閉防火牆,則應該規劃好各個節點哪些服務和端口容許訪問。例如,每一個節點都執行如下配置(默認使用public區域):linux

# 查看容許訪問的服務與端口
firewall-cmd --zone=public --list-services
firewall-cmd --zone=public --list-ports

# 容許http與https訪問
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
firewall-cmd --zone=public --list-services

# 容許訪問的端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --zone=public --add-port=2376/tcp --permanent
firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --zone=public --add-port=9001/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
http/https用於一些web服務的訪問,2375/tcp,2376/tcp,2377/tcp,4789/udp,7946/tcp,7946/udp 這些都是docker swarm所需的端口/協議,9001/tcp 是Portainer須要的端口/協議。

2、安裝Portainer

本文並不詳細講述如何搭建docker swarm集羣,只是在後續章節介紹一下部分注意事項。web

在已經搭建好docker swarm集羣以後(例如這裏在四個節點上搭建了docker swarm集羣,兩個manager節點,兩個worker節點),執行如下操做。docker

2.1 安裝Portainer:

選擇一個manager節點,例如manager01,安裝portainer:瀏覽器

docker network create \
 --driver overlay \
 --attachable \
 --subnet 10.12.0.0/24 \
 portainer_agent_network

docker run -d -p 9000:9000 --name portainer \
 --network portainer_agent_network \
 --restart always \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v /docker/data/portainer:/data portainer/portainer
  1. 爲什麼要先建立一個overlay網絡?是爲了保持後續建立的全局服務portainer_agent與Portainer容器位於一個網絡內,便於相互通訊。
  2. 爲什麼要手動建立網絡?爲了手動指定網段,防止自動建立時與實際網段衝突。

添加防火牆規則,容許訪問9000端口微信

firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --query-port=9000/tcp
由於Portainer只在一個manager節點上運行,所以只須要在該節點添加該防火牆配置便可。
另外,Portainer沒有必要高可用,它只是集羣運維管理使用,且數據已經掛到宿主機的 /docker/data/portainer目錄,且指定了重啓策略。

從客戶端瀏覽器訪問:網絡

http://<manager01的Host或IP>:9000/
首次訪問時建立管理員用戶,而後停在這裏,等待接下來的portainer_agent服務啓動後再繼續操做。

2.2 使用Agent模式管理DockerSwarm集羣

在swarm集羣上建立portainer_agent服務:負載均衡

docker service create \
    --name portainer_agent \
    --network portainer_agent_network \
    --mode global \
    --constraint 'node.platform.os == linux' \
    --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
    --mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes \
    portainer/agent
mode指定爲 global,即,在swarm集羣的全部active節點上嘗試啓動對應的docker容器;constraint約束條件指定爲 node.platform.os == linux,即,只在linux節點上啓動。

經過manager節點上執行docker service ls,以及各個節點上執行docker ps查看服務及容器啓動成功後,登入Portainer管理UI,添加Agent做爲Swarm集羣的統一EndPoint:運維

微信圖片_20200715163542.png

Name根據須要命名,Agent URL填寫 tasks.portainer_agent:9001便可。該值由以前建立的服務 portainer_agent決定。 9001是portainer_agent的默認訪問端口。

2.3 其餘安裝Portainer與Agent的方法

咱們也能夠採用其餘方式安裝Portainer與Agent。tcp

將portainer做爲service啓動

建立portainer_agent服務的方式不變,但能夠將portainer做爲service啓動,以下所示:

docker service create \
    --name portainer \
    --network portainer_agent_network \
    --publish 9000:9000 \
    --replicas=1 \
    --constraint 'node.hostname == manager01.xxx.com' \
    portainer/portainer -H "tcp://tasks.portainer_agent:9001" --tlsskipverify

docker-compose統一編排

咱們還能夠將Portainer與Agent服務放在一個docker-compose編排文件中定義,而後使用docker compose或docker stack啓動。

在任意目錄編寫編排文件,如portainer-agent-stack.yml,內容以下:

version: '3.2'

services:
  agent:
    image: portainer/agent
    environment:
       AGENT_CLUSTER_ADDR: tasks.portainer_agent
#      CAP_HOST_MANAGEMENT: 1
#      AGENT_SECRET: secrettokenforportainerinxxxcom
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
#      - /:/host
#    ports:
#      - target: 9001
#        published: 9001
#        protocol: tcp
#        mode: host
    networks:
      - agent_net
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer
    command: -H tcp://tasks.portainer_agent:9001 --tlsskipverify
#    environment:
#      AGENT_SECRET: secrettokenforportainerinxxxcom
    ports:
      - "9000:9000"
#      - "8000:8000"
    volumes:
      - /docker/data/portainer:/data
    networks:
      - agent_net
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.hostname == manager01.xxx.com]

networks:
  agent_net:
    driver: overlay
    attachable: true

而後用docker compose或docker stack啓動,例如用docker stack啓動:

docker stack deploy --compose-file=portainer-agent-stack.yml portainer

3、docker swarm集羣搭建

關於如何搭建docker swarm集羣,這裏不作詳細介紹,只提幾個注意點。

  • 根據須要規劃節點角色,好比這裏4個節點,配置相同,規劃了兩個manager和兩個worker;
  • 各節點docker安裝完成後,建議修改一下倉庫鏡像,默認網段,以及容許經過2375端口訪問docker API。
  • 在初始化swarm以前,建議手動在各個節點建立虛擬網絡docker_gwbridge,並指定一個不與實際網段衝突的網段:
docker network create --subnet 10.11.0.0/24 \
 --opt com.docker.network.bridge.name=docker_gwbridge \
 --opt com.docker.network.bridge.enable_icc=false \
 --opt com.docker.network.bridge.enable_ip_masquerade=true \
 docker_gwbridge
能夠使用 route命令查看本地路由表,確認實際網段有哪些。
  • 初始化swarm以及其餘節點加入swarm集羣時,務必指定各自的--advertise-addr--listen-addr參數,避免之後發生負載均衡失效的問題。
  • 防火牆不能關閉的場景,注意要執行本文開頭與中間所述的防火牆設置,而後要重啓docker服務
systemctl daemon-reload
systemctl restart docker
  • 發現異常現象時,注意查看docker daemon日誌。能夠經過service docker status -l查看,或cat /var/log/messages | grep dockerd查看。
相關文章
相關標籤/搜索