差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

下次修改
前次修改
tech:docker_swarm [2025/09/23 15:58] – 建立 jonathantech:docker_swarm [2025/11/19 11:49] (目前版本) – [使用 portainer 進行 Web 統一控管] jonathan
行 12: 行 12:
     - 貼上並執行加入指令 (請使用您自己產生的 Token 和 IP) <cli>docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk7434l103e8k2d6x 192.168.11.186:2377</cli>     - 貼上並執行加入指令 (請使用您自己產生的 Token 和 IP) <cli>docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk7434l103e8k2d6x 192.168.11.186:2377</cli>
   - 回到主控點上 Exp. 192.168.11.186 查看狀態<cli>docker node ls</cli>   - 回到主控點上 Exp. 192.168.11.186 查看狀態<cli>docker node ls</cli>
 +<note tip>**如果忘記加入 Swarm 的語法**  
 +  * 到主控點執行 
 +  - 取得加入成為 Manager 語法 : <cli>docker swarm join-token manager</cli> 
 +  - 取得加入成為 Worker 語法 : <cli>docker swarm join-token worker</cli> 
 +</note>
 ===== 使用 portainer 進行 Web 統一控管 ===== ===== 使用 portainer 進行 Web 統一控管 =====
   * 在主控點安裝 Portainer (參考 [[tech/portainer]])   * 在主控點安裝 Portainer (參考 [[tech/portainer]])
行 19: 行 23:
   * 當 Agent 安裝成功後, 回到 WebUI 輸入主控點的 Name (Exp. Portainer-186) 與 address (Exp. 192.168.1.186:9001), 然後點下 Connect 按鈕就可以建立完成   * 當 Agent 安裝成功後, 回到 WebUI 輸入主控點的 Name (Exp. Portainer-186) 與 address (Exp. 192.168.1.186:9001), 然後點下 Connect 按鈕就可以建立完成
   * 回到 Home 在 Environments 清單就可以看到 Portainer-186 , 點下去就可以開始管理這個 Swarm cluster \\ {{:tech:螢幕擷取畫面_2025-09-23_155253.png?1024|}}   * 回到 Home 在 Environments 清單就可以看到 Portainer-186 , 點下去就可以開始管理這個 Swarm cluster \\ {{:tech:螢幕擷取畫面_2025-09-23_155253.png?1024|}}
- +  * 當每台 swarm node 重新啟動後 Portainer 管理介面點選出現 Failure Unable to retrieve system info: Unable to find an agent on any manager node 這異常訊息時, 可以重啟所有的 Portainer Agent 來解決<cli> 
-===== 建立 watchtower 統一在主控點進行管理 ===== +portainer-161:~# docker service update --force portainer_agent 
-  * 可以直接在主控點下以下命令建立 docker service<cli> +portainer_agent 
-docker service create \ +overall progress: 1 out of 1 tasks 
-  --name watchtower \ +aeaia7g7xz3w: running   [==================================================>] 
-  --mode global \ +verify: Service portainer_agent converged
-  --constraint 'node.role == manager'+
-  --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \ +
-  containrrr/watchtower \ +
-  --cleanup \ +
-  --scope swarm+
 </cli> </cli>
  
 +===== 建立 shepherd 統一在主控點進行管理 =====
 +  * stack yaml <file>
 +services:
 +  shepherd:
 +    image: containrrr/shepherd:latest
 +    deploy:
 +      mode: replicated
 +      replicas: 1
 +      placement:
 +        constraints:
 +          - node.role == manager
 +      restart_policy:
 +        condition: on-failure
 +        delay: 10s
 +        max_attempts: 3        
 +    environment:
 +      - TZ=Asia/Taipei
 +      - SLEEP_TIME=8h  # 每8小時檢查一次,減少速率限制觸發(Go Duration 格式)
 +      # - WITH_REGISTRY_AUTH=true  # 啟用註冊庫驗證
 +      # - REGISTRY_USER_FILE=/run/secrets/dockerhub_user
 +      # - REGISTRY_PASSWORD_FILE=/run/secrets/dockerhub_token
 +      - ROLLBACK_ON_FAILURE=true  # 更新失敗時自動回滾
 +      - UPDATE_OPTIONS=--update-delay=1m --update-parallelism=1 --update-failure-action=rollback  # 添加延遲和並行限制,避免順序錯誤
 +      - IGNORELIST_SERVICES=cleanup-scheduler_cleanup-scheduler
 +      - NO_PROXY=localhost,127.0.0.1,/var/run/docker.sock
 +    volumes:
 +      - type: bind
 +        source: /var/run/docker.sock
 +        target: /var/run/docker.sock
 +</file>
 ===== FAQ ===== ===== FAQ =====
 ==== 1. 移除特定 Worker host 方式 Exp. immich-237 ==== ==== 1. 移除特定 Worker host 方式 Exp. immich-237 ====
行 42: 行 71:
  
 ==== 2. 建立擴充至三台當主控點 ==== ==== 2. 建立擴充至三台當主控點 ====
 +  * 將叢集中一台已經是工作節點 (Worker) 的主機,提升 (Promote) 為主控點。
 +  * 確保您現有的 Swarm 叢集運作正常,主控點處於 Ready 狀態。
 +  * 奇數原則:為了維持 Quorum 機制的穩定性,強烈建議主控點的總數為奇數(例如 3、5、7...)。如果您目前只有 1 台,那麼增加 2 台湊成 3 台是最好的做法。如果您目前已有 2 台,建議再增加 1 台湊成 3 台。
 +  * 至現有的主控點執行
 +    - 列出目前 Worker 清單<cli>docker node ls</cli><cli>
 +portainer-186:~# docker node ls
 +ID                            HOSTNAME        STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
 +ramtv89mfx2vcrekm7lsoobt8     moon-tv-195     Ready     Active                          28.3.3
 +318i734m5zx0w6iqe1q2ddijm *   portainer-186   Ready     Active         Leader           28.3.3
 +i9zyahgszt2awip7dl1tckyz8     sbom-182        Ready     Active                          28.3.3
 +lxftp7j4emal33f81vmywtxaz     swarm-225       Ready     Active                          28.3.3
 +q4fxgqgi2sp42wntxynks3wqf     swarm-226       Ready     Active                          28.3.3
 +</cli>
 +    - 將  swarm-225 與 swarm-226 升級成主控點<cli>
 +docker node promote swarm-225
 +docker node promote swarm-226
 +</cli>
 +    - 確認升級結果 <cli>docker node ls</cli><cli>
 +portainer-186:~# docker node ls
 +ID                            HOSTNAME        STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
 +ramtv89mfx2vcrekm7lsoobt8     moon-tv-195     Ready     Active                          28.3.3
 +318i734m5zx0w6iqe1q2ddijm *   portainer-186   Ready     Active         Leader           28.3.3
 +i9zyahgszt2awip7dl1tckyz8     sbom-182        Ready     Active                          28.3.3
 +lxftp7j4emal33f81vmywtxaz     swarm-225       Ready     Active         Reachable        28.3.3
 +q4fxgqgi2sp42wntxynks3wqf     swarm-226       Ready     Active         Reachable        28.3.3
 +</cli>
 +
 +==== 3. 建立 nfs volume 的作法 ====
 +  - 先在 NFS Server 建立分享目錄與權限設定 參考 - [[tech/nfs]]
 +  - NFS Volume 的指定方式如下 Exp. NFS Serer: 192.168.1.159 , 分享目錄: /swarmdata/mystack/nfs-data <file>
 +volumes:
 +  mystack_nfs-data:
 +    driver: local
 +    driver_opts:
 +      type: nfs
 +      o: "addr=192.168.1.159,rw,noatime,rsize=8192,wsize=8192,tcp,timeo=14,nfsvers=4"
 +      device: ":/swarmdata/mystack/nfs-data"
 +</file>
 +<note important>
 +  * 啟動 stack 時**不會**如同本地 volume 自動建立出目錄, 必須要在 NFS Server 先建立好指定的目錄 Exp.<cli>mkdir -p /swarmdata/mystack/nfs-data</cli>
 +  * 如想要修改 NFS Volume 定義
 +    - 要將 stack 移除 Exp. <cli>docker stack rm mystack</cli>
 +    - 進入 swarm **每個 node 移除 volume** Exp.<cli>docker volume rm mystack_nfs-data</cli>
 +    - 重新部署 stack Exp. <cli>docker stack deploy -c mystack.yml mystack</cli>
 +    - 檢查新建立的 Volume 內容 Exp. <cli>docker volume inspect mystack_nfs-data</cli>
 +</note>
  
 {{tag>docker k8s}} {{tag>docker k8s}}
  
  • tech/docker_swarm.1758614302.txt.gz
  • 上一次變更: 2025/09/23 15:58
  • jonathan