Skip to main content

LXC Docker Swarm 叢集架設

image.png

Docker Swarm Mode 是 Docker Engine 內建的容器編排(Container Orchestration)工具。簡單來說,它允許你將多台安裝了 Docker 的主機整合在一起,形成一個「集群」(Cluster),並將這個集群視為單一的虛擬 Docker 主機來管理。

這讓開發者從管理「單一容器」進階到管理「服務(Service)」,實現高可用性與負載平衡。


運行環境

這裡使用PVE的LXC 三台主機做設定,建立特權LXC 並且功能勾選巢狀(nesting)

確認三台主機都安裝Docker

一台為managers 二台workers

managers 10.0.0.150

workers-1 10.0.0.151

workers-2 10.0.0.152

初始化Swarm

在managers主機執行初始化設定,--advertise-addr輸入你的對外IP

--default-addr-pool如果不設定,Swarm 預設使用 10.0.0.0/8 這個超大範圍的私有網段來分配 IP 給 Overlay 網路

跟本次測試主機網路衝突故手動指定

docker swarm init --advertise-addr 10.0.0.150 --default-addr-pool 10.20.0.0/16

初始化設定後會出現token,在其他workers主機加入此token

docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx 10.0.0.150:2377

加入後可以看到所有節點

root@docker-1:~# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
x46rx0e108vhrxe354xom40w8 *   docker-1   Ready     Active         Leader           29.0.2
j96spq2xa7lx7oaw0qfhdava3     docker-2   Ready     Active                          29.0.2
v7flruyfi6glooxdasvx3a9n0     docker-3   Ready     Active                          29.0.2

由於在LXC內建立的Overlay網路會有不轉發問題,須將ingress網路開啟轉發

nsenter --net=/run/docker/netns/ingress_sbox sysctl -w net.ipv4.ip_forward=1

 

可以使用GitHub dcwestra製作的DockerSwarmLXC腳本,監控所有Docker網路並開啟轉發

 

部屬Portainer和Agent

使用Portainer來管理Swarm,每台主機都要安裝Agent來蒐集資訊,可以使用官方腳本來安裝

curl -L https://downloads.portainer.io/ce-lts/portainer-agent-stack.yml -o portainer-agent-stack.yml

這邊Portainer使用中文版本,故修改portainer-agent-stack.yml設定

version: '3.2'

services:
  agent:
    image: portainer/agent:lts
    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: 6053537/portainer-ce:latest
    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:
docker stack deploy -c portainer-agent-stack.yml portainer

部屬後可以看到Portainer和Agent在執行

root@docker-1:~#  docker ps
CONTAINER ID   IMAGE                         COMMAND                  CREATED             STATUS             PORTS                                                             NAMES
8a157c104fdc   6053537/portainer-ce:latest   "/portainer -H tcp:/…"   About an hour ago   Up About an hour   8000/tcp, 9000/tcp, 0.0.0.0:9443->9443/tcp, [::]:9443->9443/tcp   portainer_portainer.1.ofwefrgf28mgc9s78ulpm8l45
2b0713e79ea3   portainer/agent:lts           "./agent"                About an hour ago   Up About an hour   0.0.0.0:9001->9001/tcp, [::]:9001->9001/tcp                       portainer_agent.x46rx0e108vhrxe354xom40w8.8pf2g1dy8gwsaq9tazf1vcr1r

網頁上輸入https://ip:9443登入Portainer可以看到Swram資訊

image.png