在一個四節點規模的docker swarm集羣上,使用Portainer的Agent模式進行集羣管理。node
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須要的端口/協議。
本文並不詳細講述如何搭建docker swarm集羣,只是在後續章節介紹一下部分注意事項。web
在已經搭建好docker swarm集羣以後(例如這裏在四個節點上搭建了docker swarm集羣,兩個manager節點,兩個worker節點),執行如下操做。docker
選擇一個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
- 爲什麼要先建立一個overlay網絡?是爲了保持後續建立的全局服務
portainer_agent
與Portainer容器位於一個網絡內,便於相互通訊。- 爲什麼要手動建立網絡?爲了手動指定網段,防止自動建立時與實際網段衝突。
添加防火牆規則,容許訪問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服務啓動後再繼續操做。
在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:運維
Name根據須要命名,Agent URL填寫tasks.portainer_agent:9001
便可。該值由以前建立的服務portainer_agent
決定。9001
是portainer_agent的默認訪問端口。
咱們也能夠採用其餘方式安裝Portainer與Agent。tcp
建立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
咱們還能夠將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
關於如何搭建docker swarm集羣,這裏不作詳細介紹,只提幾個注意點。
2375
端口訪問docker API。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
命令查看本地路由表,確認實際網段有哪些。
--advertise-addr
與--listen-addr
參數,避免之後發生負載均衡失效的問題。systemctl daemon-reload systemctl restart docker
service docker status -l
查看,或cat /var/log/messages | grep dockerd
查看。