一、環境
docker安裝:
sudo apt install docker.io
主機分配:
操作系統 | 主機名 | 主機IP | docker版本 |
debian 12 (bookworm) | fs3(管理節點) | 192.168.1.95 | v20.10.24 |
debian 12 (bookworm) | fs1(工作節點) | 192.168.1.91 | v20.10.24 |
debian 12 (bookworm) | fs0(工作節點) | 192.168.1.92 | v20.10.24 |
開放端口:
2377/tcp:集群管理通信
7946/tcp、7946/udp:集群中各節點之間的通信
4789/udp:overlay網絡使用
二、創建集群
2.1 創建管理節點
在管理節點fs3上創建集群,使用命令如下:
sudo docker swarm init --advertise-addr 192.168.1.95
其中--advertise-addr用于配置一個IP地址,集群中其它節點使用此IP地址與管理節點通信,執行命令后輸出如下:
# 輸出
Swarm initialized: current node (vjs13uolge09ts9xpzm3tx09p) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0jn2zp2301z0gbw4ihtlf476rib4nn5nogfiqoe8kp2r7au8wo-7dow28c4qtrpjjdzg67p6aerj 192.168.1.95:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2.2 將工作節點加入集群
分別在fs1和fs0工作節點上執行下列指令:
sudo docker swarm join --token SWMTKN-1-0jn2zp2301z0gbw4ihtlf476rib4nn5nogfiqoe8kp2r7au8wo-7dow28c4qtrpjjdzg67p6aerj 192.168.1.95:2377
如果要加入管理節點,則使用下列指令:
sudo docker swarm join-token manager --token SWMTKN-1-0jn2zp2301z0gbw4ihtlf476rib4nn5nogfiqoe8kp2r7au8wo-7dow28c4qtrpjjdzg67p6aerj 192.168.1.95:2377
注意:該token有效期為24小時。如果token已過期,則可以使用一下命令重新獲?。?/p>
docker swarm join-token worker
可使用docker info 查看當前集群的詳細信息
使用docker node ls 查看當前集群中各節點信息:
其中*表示當前位于此節點。
2.3 集群網絡
當在管理節點使用docker swarm init初始化一個docker集群時,docker默認會創建兩個網絡:
- overlay驅動的網絡:名稱為ingress,該網絡用于處理集群中各個服務之間的控制與數據傳輸(當創建網絡服務service時,如果沒有指定自定義的overlay網絡,則默認使用ingress網絡)。
- bridge驅動的網絡:名稱為docker_gwbridge,該網絡用于維護集群中各個節點之間的連接。
可以使用docker network ls查看集群網絡
三、集群管理可視化
集群搭建好之后,我們使用portainer實現docker可視化管理界面。
portainer分兩種部署模式:單機部署和集群部署
3.1 單機部署
我們可以將portainer部署在docker集群的管理節點中。此時,portainer可以通過管理節點的docker進程實現對docker集群的可視化。具體步驟為:
#在管理節點拉去portainer鏡像
docker pull portainer/portainer-ce:latest
#啟動portainer容器
docker run \
-p 8000:8000 \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
--name my-portainer \
-d \
--privileged=true \
--restart=always \
portainer/portainer-ce:latest
# --privileged=true用于賦予該容器root權限
當然也可以嘗試使用docker-compose編排一個容器。這里不再贅述。
在瀏覽器中輸入https://192.168.1.2:9443,進入portainer環境創建頁面。
3.2 集群部署
- 在管理節點下載部署文件
curl -L https://downloads.portainer.io/ce2-19/portainer-agent-stack.yml -o portainer-agent-stack.yml
文件內容如下:
version: '3.2'
services:
agent:
image: portainer/agent:2.19.4
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- agent_network
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]
portainer:
image: portainer/portainer-ce:2.19.4
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "9443:9443"
- "9000:9000"
- "8000:8000"
volumes:
- portainer_data:/data
networks:
- agent_network
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
networks:
agent_network:
driver: overlay
attachable: true
volumes:
portainer_data:
此時需要對agent部分增加一個端口掛載配置,否則后面創建環境時會因為連接失敗導致無法創建環境:
version: '3.2'
services:
agent:
image: portainer/agent:2.19.4
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
ports:
- "9001:9001"
networks:
- agent_network
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]
portainer:
image: portainer/portainer-ce:2.19.4
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "9443:9443"
- "9000:9000"
- "8000:8000"
volumes:
- portainer_data:/data
networks:
- agent_network
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
networks:
agent_network:
driver: overlay
attachable: true
volumes:
portainer_data:
- 在管理節點部署portainer集群
docker stack deploy -c portainer-agent-stack.yml portainer
可以看到創建了一個網絡和兩個服務器:
- portainer_agent_network
- portainer_agent
- portainer_portainer
?在集群中任意節點查看網絡,可以看到所有節點上都創建了一個overlay驅動的網絡portainer_agent_network。也就是在集群的各個節點創建該網絡portainer_agent_network。
- 在管理節點查看服務
docker service ls
- 在管理節點查看容器
docker ps
- ?在工作節點查看容器
?注意:
與管理節點不同的是,工作簡單值創建了portainer/agent容器,它是由管理節點在集群中創建的副本容器。
- 在瀏覽器中輸入https://192.168.1.95:9443,進入portainer界面
與單機部署模式不同的是,在選擇環境類型時,我們應該選擇集群模式。即,勾選Docker Swarm?選項卡:
然后選擇agent方式配置環境連接。當然默認情況,系統默認創建一個portainer集群環境:
- ?進入該環境查看詳細信息
- 進入集群頁面,可以看到我們在管理節點上部署的portainer容器根據服務的副本配置,在工作節點上也建立了相同的portainer容器副本。
3.3 portainer密碼重置
查看portainer是否正常遠行:
docker ps
停止docker容器:
docker stop 5ca33ade99b4
查看portainer容器掛載信息:
docker inspect 5ca33ade99b4
找到容器掛載路徑
進入到該路徑下查看內容:
執行下列命令,重置管理員密碼:
docker run --rm -v /var/lib/docker/volumes/portainer_data/_data:/data portainer/helper-reset-password
?啟動docker后,使用上圖輸出密碼即可正常登錄portainer管理界面。
四、部署容器集群
以創建busybox鏡像容器為例,創建docker容器集群
4.1 拉去鏡像
在管理節點中使用命令拉拉取鏡像。
docker pull busybox
4.2創建網絡
在管理節點創建一個overlay驅動的網絡。
docker network create -d overlay --attachable busybox_overlay_network
注意:
在集群環境創建overlay驅動網絡時,一定要帶參數 –attachable,方便集群容器或單機容器與運行在其它節點中的容器建立通信。
4.3 創建服務器
在管理節點中創建服務
docker service create -td --name busybox_service --network busybox_overlay_network --replicas=2 busybox
- –replicas=2表示需要創建兩個busybox容器的副本。
- –network busybox_overlay_network表示使用我們在上面創建的網絡。
4.4 進入portainer查看busybox集群
?在容器列表頁面可以看到busybox容器集群??梢钥吹絻蓚€busybox容器分別位于dedian-fs0和debian-fs1節點,IP地址分別為10.0.2.3和10.0.2.4。
4.5 不同節點間容器通信
對應busybox容器集群的情況如下
主機 | 容器IP地址 |
debian-fs0 | 10.0.2.4 |
debian-fs1 | 10.0.2.3 |
?進入到debian-fs0主機的busybox容器,ping位于debian-fs1主機中的busybox容器,可以ping通,反之相同。
4.6 集群擴展
前面在創建busybox容器集群是,設置其副本數量為2 –replicas=2,現在通過portainer將副本數量修改為3。
五、集群之負載均衡
5.1 無狀態服務負載均衡
以nginx為例,實現無狀態服務負載均衡。
- 拉取nginx鏡像
docker pull nginx
- 被nginx服務創建overlay驅動的網絡
docker network create -d overlay --attachable nginx_overlay_network
- 創建服務
docker service create -td --name nginx_service --network nginx_overlay_network --replicas=3 -p 8080:80 nginx
執行命令后等3分鐘,再進portainer查看,發現nginx服務中三個節點已經處于runing狀態。
- ?查看三臺主機節點的nginx服務默認發布頁面
- 驗證負載均衡功能
分別修改節點中的index.html頁面方便區分來自不同容器的響應。
echo “server 192.168.1.95” > index.html
在物理機上驗證負載均衡功能
鏈接:https://www.cnblogs.com/zhongqifeng/p/18108887
(版權歸原作者所有,侵刪)
文末福利:紙質書免費送!
本文鏈接:http://www.thecarconnectin.com/45759.html
網友評論comments