docker swarm 集群服务编排部署指南(docker stack)
Docker Swarm 集群管理
概述
Docker Swarm 是 Docker 的集群管理工具。它將 Docker 主機池轉(zhuǎn)變?yōu)閱蝹€虛擬 Docker 主機,使得容器可以組成跨主機的子網(wǎng)網(wǎng)絡(luò)。Docker Swarm 提供了標(biāo)準(zhǔn)的 Docker API,所有任何已經(jīng)與 Docker 守護程序通信的工具都可以使用 Swarm 輕松地擴展到多個主機。
集群的管理和編排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化時啟動 swarm 模式或者加入已存在的 swarm。
支持的工具包括但不限于以下各項:
- Dokku
- Docker Compose
- Docker Machine
- Jenkins
Docker Swarm 優(yōu)點
- 任何規(guī)模都有高性能表現(xiàn)
對于企業(yè)級的 Docker Engine 集群和容器調(diào)度而言,可拓展性是關(guān)鍵。任何規(guī)模的公司——不論是擁有五個還是上千個服務(wù)器——都能在其環(huán)境下有效使用 Swarm。
經(jīng)過測試,Swarm 可拓展性的極限是在 1000 個節(jié)點上運行 50000 個部署容器,每個容器的啟動時間為亞秒級,同時性能無減損。
- 靈活的容器調(diào)度
Swarm 幫助 IT 運維團隊在有限條件下將性能表現(xiàn)和資源利用最優(yōu)化。Swarm 的內(nèi)置調(diào)度器(scheduler)支持多種過濾器,包括:節(jié)點標(biāo)簽,親和性和多種容器部策略如 binpack、spread、random 等等。
- 服務(wù)的持續(xù)可用性
Docker Swarm 由 Swarm Manager 提供高可用性,通過創(chuàng)建多個 Swarm master 節(jié)點和制定主 master 節(jié)點宕機時的備選策略。如果一個 master 節(jié)點宕機,那么一個 slave 節(jié)點就會被升格為 master 節(jié)點,直到原來的 master 節(jié)點恢復(fù)正常。
此外,如果某個節(jié)點無法加入集群,Swarm 會繼續(xù)嘗試加入,并提供錯誤警報和日志。在節(jié)點出錯時,Swarm 現(xiàn)在可以嘗試把容器重新調(diào)度到正常的節(jié)點上去。
- 和 Docker API 及整合支持的兼容性
Swarm 對 Docker API 完全支持,這意味著它能為使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用戶提供無縫銜接的使用體驗。
- Docker Swarm 為 Docker 化應(yīng)用的核心功能(諸如多主機網(wǎng)絡(luò)和存儲卷管理)提供原生支持
開發(fā)的 Compose 文件能(通過 docker-compose up )輕易地部署到測試服務(wù)器或 Swarm 集群上。Docker Swarm 還可以從 Docker Trusted Registry 或 Hub 里 pull 并 run 鏡像。
- 集群模式,當(dāng)修改了服務(wù)的配置后無需手動重啟服務(wù)。并且只有集群中的manager才能管理集群中的一切(包括服務(wù)、容器都?xì)w它管,在一個woker節(jié)點上無法操作容器)
節(jié)點
swarm 集群由管理節(jié)點(manager)和工作節(jié)點(work node)構(gòu)成。
-
swarm mananger:負(fù)責(zé)整個集群的管理工作包括集群配置、服務(wù)管理等所有跟集群有關(guān)的工作。一個 Swarm 集群可以有多個管理節(jié)點,但只有一個管理節(jié)點可以成為 leader,leader 通過 raft 協(xié)議實現(xiàn)。
為了利用swarm模式的容錯功能,Docker建議根據(jù)組織的高可用性要求實現(xiàn)奇數(shù)個節(jié)點。當(dāng)您擁有多個管理器時,您可以從管理器節(jié)點的故障中恢復(fù)而無需停機。
- N個管理節(jié)點的集群容忍最多損失 (N-1)/2 個管理節(jié)點。
- Docker建議一個集群最多7個管理器節(jié)點。
-
work node:即圖中的 available node,主要負(fù)責(zé)運行相應(yīng)的服務(wù)來執(zhí)行任務(wù)(task)。工作節(jié)點是任務(wù)執(zhí)行節(jié)點,管理節(jié)點將服務(wù) (service) 下發(fā)至工作節(jié)點執(zhí)行。管理節(jié)點默認(rèn)也作為工作節(jié)點。也可以通過配置讓服務(wù)只運行在管理節(jié)點。
服務(wù)和任務(wù)
任務(wù) (Task)是 Swarm 中的最小的調(diào)度單位,目前來說就是一個單一的容器。
服務(wù) (Services) 是指一組任務(wù)的集合,服務(wù)定義了任務(wù)的屬性。服務(wù)有兩種模式:
- replicated services (復(fù)制服務(wù))按照一定規(guī)則在各個工作節(jié)點上運行指定個數(shù)的任務(wù)。
- global services (全局服務(wù))每個工作節(jié)點上運行一個此任務(wù)。
兩種模式通過 docker service create 的 --mode 參數(shù)指定。下圖展示了容器、任務(wù)、服務(wù)的關(guān)系。
路由網(wǎng)格
service 通過 ingress load balancing 來發(fā)布服務(wù),且 swarm 集群中所有 node 都參與到 ingress 路由網(wǎng)格(ingress routing mesh) 中,訪問任意一個 node+PublishedPort 即可訪問到服務(wù)。
當(dāng)訪問任何節(jié)點上的端口8080時,Docker將請求路由到活動容器。在群節(jié)點本身,端口8080可能并不實際綁定,但路由網(wǎng)格知道如何路由流量,并防止任何端口沖突的發(fā)生。
路由網(wǎng)格在發(fā)布的端口上監(jiān)聽分配給節(jié)點的任何IP地址。對于外部可路由的IP地址,該端口可從主機外部獲得。對于所有其他IP地址,只能從主機內(nèi)部訪問。
Swarm 集群的搭建
準(zhǔn)備工作
-
二個或二個以上可以通過網(wǎng)絡(luò)進行通信的Linux主機或虛擬機,并安裝了Docker(加入開機自啟),或者使用docker-machine 創(chuàng)建三臺虛擬機。swarm 不需要單獨安裝,安裝了 docker 就自帶了該軟件
-
已安裝Docker Engine 1.12或更高版本
-
關(guān)閉所有主機上的防火墻或者開放以下端口:
-
TCP協(xié)議端口 2377 :集群管理端口
-
TCP協(xié)議端口 7946 :節(jié)點之間通訊端口(不開放則會負(fù)載均衡失效)
-
UDP協(xié)議端口 4789 :overlay網(wǎng)絡(luò)通訊端口
-
防火墻相關(guān)命令:
# 查看firewalld防火墻狀態(tài) systemctl status firewalld# 查看所有打開的端口 firewall-cmd --zone=public --list-ports# 防火墻開放端口(更新firewalld防火墻規(guī)則后生效) firewall-cmd --zone=public --add-port=要開放的端口/tcp --permanent # 選項: –zone # 作用域 –add-port=80/tcp # 添加端口,格式為:端口/通訊協(xié)議 –permanent #永久生效,沒有此參數(shù)重啟后失效 # 示例: firewall-cmd --zone=public --add-port=3306/tcp --permanent# firewalld防火墻關(guān)閉接口(更新firewalld防火墻規(guī)則后生效) firewall-cmd --zone=public --remove-port=要關(guān)閉的端口/tcp --permanent# 更新firewalld防火墻規(guī)則(并不中斷用戶連接,即不丟失狀態(tài)信息) firewall-cmd --reload# 啟動firewalld防火墻 systemctl start firewalld # 關(guān)閉firewalld防火墻: systemctl stop firewalld # 開機禁用firewalld防火墻 systemctl disable firewalld # 開機啟用firewalld防火墻: systemctl enable firewalld
-
-
分別修改機器的主機名,更改成 swarm01,swarm02 …
hostnamectl set-hostname swarm01
創(chuàng)建docker swarm集群
1.master主機上初始化swarm。執(zhí)行 docker swarm init 命令的節(jié)點自動成為管理節(jié)點。
docker swarm init# 注:如果主機有多個網(wǎng)卡,擁有多個IP,必須使用 --advertise-addr 指定 IP。 # 示例: docker swarm init --advertise-addr 192.168.99.100 # 執(zhí)行命令后會給出加入這個swarm的命令 Swarm initialized: current node (4a8mo8cekpe0vpk0ze963avw9) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.2.在node主機上執(zhí)行命令加入swarm
docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:23773.查看集群信息。集群的大部分命令需要在管理節(jié)點中才能運行
# 查看 swarm 集群狀態(tài) docker info # 查看集群節(jié)點信息 docker node lsSwarm 集群管理常用命令
docker swarm:管理集群
# 初始化一個swarm docker swarm init [OPTIONS] # 選項: --advertise-addr string # 發(fā)布的地址(格式:<ip|interface>[:port]) --force-new-cluster # 強制從當(dāng)前狀態(tài)創(chuàng)建一個新的集群(去除本地之外的所有管理器身份) --cert-expiry duration # 節(jié)點證書有效期(ns|us|ms|s|m|h)(默認(rèn)為2160h0m0s) --data-path-addr string # 用于數(shù)據(jù)路徑通信的地址或接口(格式: <ip|interface>) --data-path-port uint32 # 用于數(shù)據(jù)路徑流量的端口號(1024 - 49151)。如果沒有值,則默認(rèn)端口號4789 --dispatcher-heartbeat duration # 調(diào)度程序的心跳周期(ns|us|ms|s|m|h)(默認(rèn)為5s) --listen-addr node-addr # 監(jiān)聽地址(格式: <ip|interface>[:port]) (默認(rèn) 0.0.0.0:2377)# 查看加入節(jié)點到集群的命令及令牌(token) docker swarm join-token [OPTIONS] (worker|manager) # 選項: -q, --quiet # 只顯示令牌--rotate # 使舊令牌無效并生成新令牌 # 查看加入工作節(jié)點到集群的命令及令牌 docker swarm join-token worker # 查看加入管理節(jié)點到集群的命令及令牌 docker swarm join-token manager# 將節(jié)點加入swarm集群,作為一個manager或worker docker swarm join [OPTIONS] HOST:PORT # 選項: --advertise-addr string # 發(fā)布的地址 (格式: <ip|interface>[:port]) --availability string # 節(jié)點的可用性 ("active"|"pause"|"drain") (default "active") --data-path-addr string # 用于數(shù)據(jù)路徑通信的地址或接口 (格式: <ip|interface>) --listen-addr node-addr # 監(jiān)聽地址 (格式: <ip|interface>[:port]) (default 0.0.0.0:2377) --token string # 進入的swarm集群的令牌 # 主動退出集群,讓節(jié)點處于down狀態(tài)(在需要退出Swarm集群的節(jié)點主機上執(zhí)行命令) docker swarm leave [OPTIONS] # 選項: -f, --force # 強制。Manager若要退出 Swarm 集群,需要加上強制選項 ## 移除一個work-node節(jié)點主機的完整步驟: # 1.在管理節(jié)點上操作,清空work-node節(jié)點的容器。id 可以使用命令 docker node ls 查看 docker node update --availability drain [id] # 2.在work-node節(jié)點主機上操作,退出集群 docker swarm leave # 3,在管理節(jié)點上操作,刪除work-node節(jié)點 docker node rm [id] # 若想解散整個集群,則需先移除所有work-node節(jié)點主機,然后所有管理節(jié)點也退出集群# 更新 swarm 集群的配置 docker swarm update [OPTIONS] # 選項: --autolock # 更改管理器自動鎖定設(shè)置(true|false) --cert-expiry duration # 節(jié)點證書有效期(ns|us|ms|s|m|h)(默認(rèn)為2160h0m0s) --dispatcher-heartbeat duration # 調(diào)度程序心跳周期(ns|us|ms|s|m|h)(默認(rèn)為5s)docker node:管理swarm集群節(jié)點
# 查看集群中的節(jié)點 docker node ls #選項: -f, --filter filter # 根據(jù)所提供的條件過濾輸出。(格式:key=value)# 目前支持的過濾器是:id, label, name, membership[=accepted|pending]# , role[manager|worker] -q, --quiet # 只顯示id# 查看運行的一個或多個及節(jié)點任務(wù)數(shù),默認(rèn)當(dāng)前節(jié)點 docker node ps [OPTIONS] [NODE...] #選項: -f, --filter filter # 根據(jù)所提供的條件過濾輸出 -q, --quiet # 只顯示id# 將worker角色升級為manager docker node promote NODE [NODE...] # 將manager角色降級為worker docker node demote NODE [NODE...]# 查看節(jié)點的詳細(xì)信息,默認(rèn)json格式 docker node inspect 主機名 # 查看節(jié)點信息平鋪格式 docker node inspect --pretty 主機名# 從swarm中刪除一個節(jié)點 docker node rm 主機名 # 從swarm中強制刪除一個節(jié)點 docker node rm -f 主機名# 更新一個節(jié)點 docker node update [options] 主機名 # 選項 --label-add list # 添加節(jié)點標(biāo)簽(key=value) --label-rm list # 刪除節(jié)點標(biāo)簽 --role string # 更改節(jié)點角色 ("worker"|"manager") --availability active/pause/drain # 設(shè)置節(jié)點的狀態(tài)# active 正常# pause 暫停。調(diào)度程序不向節(jié)點分配新任務(wù),但是現(xiàn)有任務(wù)仍然保持運行# drain 排除自身work任務(wù)。調(diào)度程序不向節(jié)點分配新任務(wù),且會關(guān)閉任何現(xiàn)有任務(wù)并在可用節(jié)點上安排它們docker service:服務(wù)管理
# 列出服務(wù)列表 docker service ls# 列出服務(wù)任務(wù)信息 docker service ps [OPTIONS] SERVICE [SERVICE...] # 選項:--no-trunc # 顯示完整的信息 -f, --filter filter # 根據(jù)所提供的條件過濾輸出。過濾只運行的任務(wù)信息:"desired-state=running" -q, --quiet # 只顯示任務(wù)id# 查看服務(wù)內(nèi)輸出 docker service logs [OPTIONS] SERVICE|TASK # 選項:--details # 顯示提供給日志的額外細(xì)節(jié) -f, --follow # 跟蹤日志輸出--since string # 顯示自時間戳 (2013-01-02T13:23:37Z) 或相對時間戳 (42m for 42 minutes) 以來的日志 -n, --tail string # 從日志末尾顯示的行數(shù)(默認(rèn)為“all”) -t, --timestamps # 顯示時間戳# 更新服務(wù)的相關(guān)配置 docker service update [options] 服務(wù)名 # 選項 --args "指令" # 容器加入指令 --image IMAGE # 更新服務(wù)容器鏡像 --rollback # 回滾服務(wù)容器版本 --network-add 網(wǎng)絡(luò)名 # 添加容器網(wǎng)絡(luò) --network-rm 網(wǎng)絡(luò)名 # 刪除容器網(wǎng)絡(luò) --reserve-cpu int # 更新分配的cpu --reserve-memory bytes # 更新分配的內(nèi)存(示例:512m) --publish-add 暴露端口:容器端口 # 映射容器端口到主機 --publish-rm 暴露端口:容器端口 # 移除暴露端口 --endpoint-mode dnsrr # 修改負(fù)載均衡模式為dnsrr --force # 強制重啟服務(wù) --config-rm 配置文件名稱 # 刪除配置文件 --constraint-add list # 新增一個約束 --constraint-rm list # 移除一個約束 --placement-pref-add pref # 新增一個偏好 --placement-pref-rm pref # 移除一個偏好 --config-add 配置文件名,target=/../容器內(nèi)配置文件名 # 添加新的配置文件到容器內(nèi)# 查看服務(wù)詳細(xì)信息,默認(rèn)json格式 docker service inspect [OPTIONS] 服務(wù)名 [SERVICE...] # 查看服務(wù)信息平鋪形式 docker service inspect --pretty 服務(wù)名# 刪除服務(wù) docker service rm [OPTIONS] 服務(wù)名 [SERVICE...]# 縮容擴容服務(wù)容器副本數(shù)量 docker service scale 服務(wù)名=副本數(shù) [SERVICE=REPLICAS...]# 創(chuàng)建一個服務(wù)。一般搭建好 Swarm 集群后,使用 docker stack 部署應(yīng)用,此處僅作了解 docker service create [OPTIONS] IMAGE [COMMAND] [ARG...] # 選項: --name string # 指定容器名稱 --replicas int # 指定副本數(shù) --network 網(wǎng)絡(luò)名 # 添加網(wǎng)絡(luò)組 --mode string # 服務(wù)模式(復(fù)制或全局)(replicated | global) --reserve-cpu int # 預(yù)留的cpu --reserve-memory bytes # 預(yù)留的內(nèi)存(512m) --limit-cpu int # 限制CPU --limit-memory bytes # 限制內(nèi)存(512m) -l, --label list # 服務(wù)的標(biāo)簽(key=value) --container-label list # 容器標(biāo)簽(key=value) -p, --publish 暴露端口:容器端口 # 映射容器端口到主機 -e, --env MYVAR=myvalue # 配置環(huán)境變量 -w, --workdir string # 指定工作目錄(示例:/tmp) -restart-condition string # 滿足條件時重新啟動(no | always | on-failure | unless-stopped) --restart-delay duration # 重新啟動嘗試之間的延遲 (ns/us/ms/s/m/h) --restart-max-attempts int # 放棄前的最大重啟次數(shù) --restart-window duration # 用于評估重啟策略的窗口 (ns/us/ms/s/m/h) --stop-grace-period duration # 強制殺死容器前的等待時間 (ns/us/ms/s/m/h) --update-delay duration # 更新之間的延遲(ns/us/ms/s/m/h)(默認(rèn) 0s) --update-failure-action string # 更新失敗的操作("pause"停止|"continue"繼續(xù))(默認(rèn)pause) --update-max-failure-ratio float # 更新期間容忍的失敗率 --update-monitor duration # 每次任務(wù)更新后監(jiān)控失敗的持續(xù)時間(ns/us/ms/s/m/h)(默認(rèn) 0s) --update-parallelism int # 同時更新的最大任務(wù)數(shù)(0表示一次更新全部任務(wù))(默認(rèn)為1) --endpoint-mode string # 負(fù)載均衡模式(vip or dnsrr) (默認(rèn) "vip") --rollback-monitor 20s # 每次容器與容器之間的回滾時間間隔 --rollback-max-failure-ratio .數(shù)值 # 回滾故障率如果小于百分比允許運行(“.2”為%20) --mount type=volume,src=volume名稱,dst=容器目錄 # 創(chuàng)建volume類型數(shù)據(jù)卷 --mount type=bind,src=宿主目錄,dst=容器目錄 # 創(chuàng)建bind讀寫目錄掛載 --mount type=bind,src=宿主目錄,dst=容器目錄,readonly # 創(chuàng)建bind只讀目錄掛載 --config source=docker配置文件,target=配置文件路徑 # 創(chuàng)建docker配置文件到容器本地目錄docker config:管理配置文件
# 查看已創(chuàng)建配置文件 docker config ls [OPTIONS] # 選項: -f, --filter filter # 根據(jù)所提供的條件過濾輸出 -q, --quiet # 只顯示id# 查看配置詳細(xì)信息 docker config inspect 配置文件名# 刪除配置 docker config rm CONFIG [CONFIG...]# 創(chuàng)建配置文件 docker config create 配置文件名 本地配置文件 # 示例:新建配置文件并添加新配置文件到服務(wù) # 1.創(chuàng)建配置文件 docker config create nginx2_config nginx2.conf # 2.刪除舊配置文件 docker service update --config-rm ce_nginx_config 服務(wù)名 # 3.添加新配置文件到服務(wù) ocker service update --config-add src=nginx2_config,target=/etc/nginx/nginx.conf ce_nginxdocker network:管理網(wǎng)絡(luò)
# 查看集群網(wǎng)絡(luò)列表 docker network ls# 將容器連接到集群網(wǎng)絡(luò)中 $ docker network connect [OPTIONS] NETWORK CONTAINER # 選項--alias strings # 為容器添加網(wǎng)絡(luò)范圍的別名--driver-opt string · # 指定網(wǎng)絡(luò)驅(qū)動程序--ip string # 指定IPv4地址(如172.30.100.104)--ip6 string # 指定IPv6地址(例如,2001:db8::33)--link list # 添加到另一個容器的鏈接--link-local-ip string # 為容器添加一個鏈接本地地址 # 示例 docker network connect mynet nginx# 斷開一個容器與集群網(wǎng)絡(luò)的連接 $ docker network disconnect [OPTIONS] NETWORK CONTAINER # 選項-f, --force # 強制容器從網(wǎng)絡(luò)斷開連接 # 顯示一個或多個集群網(wǎng)絡(luò)的詳細(xì)信息 $ docker network inspect [OPTIONS] NETWORK [NETWORK...] # 選項-f, --format string # 使用給定的Go模板格式化輸出-v, --verbose # 輸出詳細(xì)的診斷信息# 創(chuàng)建一個集群網(wǎng)絡(luò) $ docker network create [OPTIONS] NETWORK # 選項--attachable # 準(zhǔn)許手動容器連接--aux-address map # 網(wǎng)絡(luò)驅(qū)動使用的輔助IPv4或IPv6地址(默認(rèn)映射[])--config-from string # 要從其中復(fù)制配置的網(wǎng)絡(luò)--config-only # 創(chuàng)建僅配置網(wǎng)絡(luò)-d, --driver string # 管理網(wǎng)絡(luò)的驅(qū)動程序(默認(rèn)為“"bridge”)。選項:bridge、overlay、macvlan--gateway strings # 指定IPv4或IPv6主子網(wǎng)網(wǎng)關(guān)。示例:172.20.0.1--ingress # 創(chuàng)建群路由-網(wǎng)格網(wǎng)絡(luò)--internal # 限制外部訪問網(wǎng)絡(luò)--ip-range strings # 從子范圍分配容器ip--ipam-driver string # IP管理驅(qū)動(默認(rèn)為“default”)--ipam-opt map # 設(shè)置IPAM驅(qū)動程序的特定選項(默認(rèn)map[])--ipv6 # 啟用IPv6網(wǎng)絡(luò)--label list # 在網(wǎng)絡(luò)中設(shè)置元數(shù)據(jù)-o, --opt map # 設(shè)置驅(qū)動程序特定選項(默認(rèn)map[])--scope string # 控制網(wǎng)絡(luò)的范圍--subnet strings # 指定一個CIDR格式的網(wǎng)段。示例:172.20.0.0/24 # 示例: docker network create -d overlay --attachable apps_net# 移除所有未使用的集群網(wǎng)絡(luò) $ docker network prune [OPTIONS] # 選項--filter filter # 提供過濾值(e.g. 'until=<timestamp>') -f, --force # 強制,沒有提示確認(rèn)# 刪除一個或多個集群網(wǎng)絡(luò) $ docker network rm NETWORK [NETWORK...] # 別名:rm, removedocker secret:管理敏感數(shù)據(jù)存儲
# 查看敏感數(shù)據(jù)卷列表 $ docker secret ls# 顯示一個或多個敏感數(shù)據(jù)卷的詳細(xì)信息 $ docker secret inspect [OPTIONS] SECRET [SECRET...] # 選項--pretty # 易讀的格式打印信息# 從文件或標(biāo)準(zhǔn)輸入創(chuàng)建一個敏感數(shù)據(jù)卷作為內(nèi)容 $ docker secret create [OPTIONS] SECRET [file|-] # 選項-d, --driver string # 指定驅(qū)動-l, --label list # 指定標(biāo)簽--template-driver string # 指定模板驅(qū)動程序# 移除一個或多個敏感數(shù)據(jù)卷 $ docker secret rm SECRET [SECRET...] # 別名:rm, removedocker網(wǎng)絡(luò)管理
參考:
- docker的3種自定義網(wǎng)絡(luò)(bridge、overlay、macvlan)
- Docker Swarm - 網(wǎng)絡(luò)管理
- Docker的網(wǎng)絡(luò)模式bridge、host、container 、overlay
概述
Docker 提供三種 user-defined 網(wǎng)絡(luò)驅(qū)動:bridge,overlay 和 macvlan
overlay 和 macvlan 用于創(chuàng)建跨主機的網(wǎng)絡(luò)
Swarm 集群產(chǎn)生兩種不同類型的流量:
- 控制和管理層面:包括 Swarm 消息管理等,例如請求加入或離開Swarm,這種類型的流量總是被加密的。(涉及到集群內(nèi)部的hostname、ip-address、subnet、gateway等)
- 應(yīng)用數(shù)據(jù)層面:包括容器與客戶端的通信等。(涉及到防火墻、端口映射、網(wǎng)口映射、VIP等)
在 Swarm Service 中有三個重要的網(wǎng)絡(luò)概念:
- Overlay networks :管理 Swarm 中 Docker 守護進程間的通信。可以將服務(wù)附加到一個或多個已存在的 overlay 網(wǎng)絡(luò)上,使得服務(wù)與服務(wù)之間能夠通信。
- ingress network :是一個特殊的 overlay 網(wǎng)絡(luò),用于服務(wù)節(jié)點間的負(fù)載均衡,處理與群集服務(wù)相關(guān)的控制和數(shù)據(jù)流量。當(dāng)任何 Swarm 節(jié)點在發(fā)布的端口上接收到請求時,它將該請求交給一個名為 IPVS 的模塊。IPVS 跟蹤參與該服務(wù)的所有IP地址,選擇其中的一個,并通過 ingress 網(wǎng)絡(luò)將請求路由到它。
初始化或加入 Swarm 集群時會自動創(chuàng)建 ingress 網(wǎng)絡(luò),大多數(shù)情況下,用戶不需要自定義配置,但是 docker 17.05 和更高版本允許你自定義。 - docker_gwbridge :是一種橋接網(wǎng)絡(luò),將 overlay 網(wǎng)絡(luò)(包括 ingress 網(wǎng)絡(luò))連接到一個單獨的 Docker 守護進程的物理網(wǎng)絡(luò)。默認(rèn)情況下,服務(wù)正在運行的每個容器都連接到本地 Docker 守護進程主機的 docker_gwbridge 網(wǎng)絡(luò)。
docker_gwbridge 網(wǎng)絡(luò)在初始化或加入 Swarm 時自動創(chuàng)建。大多數(shù)情況下,用戶不需要自定義配置,但是 Docker 允許自定義。
在管理節(jié)點上查看網(wǎng)絡(luò)
$ docker network ls NETWORK ID NAME DRIVER SCOPE cb0ccb89a988 bridge bridge local 0174fb113496 docker_gwbridge bridge local 541b62778c0e host host local 8n7xppn5z4j2 ingress overlay swarm 369d459f340d none null localoverlay網(wǎng)絡(luò)驅(qū)動程序會創(chuàng)建多個Docker守護主機之間的分布式網(wǎng)絡(luò)。該網(wǎng)絡(luò)位于(覆蓋)特定于主機的網(wǎng)絡(luò)之上,允許連接到它的容器(包括群集服務(wù)容器)安全地進行通信。Docker透明地處理每個數(shù)據(jù)包與正確的Docker守護程序主機和正確的目標(biāo)容器的路由。
自定義overlay 網(wǎng)絡(luò)
創(chuàng)建用于swarm服務(wù)的自定義的overlay網(wǎng)絡(luò) 命令:
docker network create -d overlay --attachable my-overlay# 注:overlay 網(wǎng)絡(luò)創(chuàng)建可以在 Swarm 集群下的任意節(jié)點執(zhí)行,并同步更新到所有節(jié)點。集群中部署了兩個服務(wù) nginx、alpine,現(xiàn)在我們進入alpine,去訪問nginx。
$ docker exec -it test1.1.oonwl8c5g4u3p17x8anifeubi bash $ ping nginx ping: bad address 'nginx'$ wget 192.168.99.100:8080 Connecting to 192.168.99.100:8080 (192.168.99.100:8080) index.html 100% |**********************************************************************************************************| 612 0:00:00 ETA發(fā)現(xiàn)集群中的各個服務(wù)不能用名稱訪問的,只能用集群服務(wù)發(fā)現(xiàn)的路由網(wǎng)絡(luò)訪問,若需要集群中的服務(wù)能通過名稱進行訪問,這就需要用到上面自定義的 overlay 網(wǎng)絡(luò)。
刪除啟動的服務(wù),重新創(chuàng)建指定使用自定義網(wǎng)絡(luò)的服務(wù)。
docker service rm nginx alpine docker service create --name nginx -p 8080:80 --network my-overlay --replicas 3 nginx docker service create --name alpine --network my-overlay alpine ping www.baidu.com進入alpine容器中,重新測試下:
$ ping nginx PING nginx (10.0.0.2): 56 data bytes 64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.120 ms 64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.094 ms 64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.108 ms $ wget nginx Connecting to nginx (10.0.0.2:80) index.html 100% |**********************************************************************************************************| 612 0:00:00 ETA發(fā)現(xiàn)可以通過名稱進行集群中的容器間的訪問了。
Docker Stack 部署應(yīng)用
概述
單機模式下,可以使用 Docker Compose 來編排多個服務(wù)。Docker Swarm 只能實現(xiàn)對單個服務(wù)的簡單部署。而Docker Stack 只需對已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群環(huán)境下的多服務(wù)編排。
stack是一組共享依賴,可以被編排并具備擴展能力的關(guān)聯(lián)service。
Docker Stack和Docker Compose區(qū)別
- Docker stack 會忽略了“構(gòu)建”指令,無法使用 stack 命令構(gòu)建新鏡像,它是需要鏡像是預(yù)先已經(jīng)構(gòu)建好的。 所以 docker-compose 更適合于開發(fā)場景;
- Docker Compose 是一個 Python 項目,在內(nèi)部,它使用 Docker API 規(guī)范來操作容器。所以需要安裝 Docker -compose,以便與 Docker 一起在計算機上使用;Docker Stack 功能包含在 Docker 引擎中。你不需要安裝額外的包來使用它,docker stacks 只是 swarm mode 的一部分。
- Docker stack 不支持基于第2版寫的 docker-compose.yml ,也就是 version 版本至少為3。然而 Docker Compose 對版本為2和 3 的文件仍然可以處理;
- docker stack 把 docker compose 的所有工作都做完了,因此 docker stack 將占主導(dǎo)地位。同時,對于大多數(shù)用戶來說,切換到使用
- 單機模式(Docker Compose)是一臺主機上運行多個容器,每個容器單獨提供服務(wù);集群模式(swarm + stack)是多臺機器組成一個集群,多個容器一起提供同一個服務(wù);
compose.yml deploy 配置說明
docker-compose.yaml 文件中 deploy 參數(shù)下的各種配置主要對應(yīng)了 swarm 中的運維需求。
docker stack deploy 不支持的參數(shù):
(這些參數(shù),就算yaml中包含,在stack的時候也會被忽略,當(dāng)然也可以為了 docker-compose up 留著這些配置)
build cgroup_parent container_name devices tmpfs external_links links network_mode restart security_opt userns_modedeploy:指定與服務(wù)的部署和運行有關(guān)的配置。注:只在 swarm 模式和 stack 部署下才會有用。且僅支持 V3.4 及更高版本。
可以選參數(shù):
-
endpoint_mode:訪問集群服務(wù)的方式。3.2版本開始引入的配置。用于指定服務(wù)發(fā)現(xiàn),以方便外部的客戶端連接到swarm
- vip:默認(rèn)的方案。即通過 Docker 集群服務(wù)一個對外的虛擬 ip對外暴露服務(wù),所有的請求都會通過這個虛擬 ip 到達集群服務(wù)內(nèi)部的機器,客戶端無法察覺有多少個節(jié)點提供服務(wù),也不知道實際提供服務(wù)的IP和端口。
- dnsrr:DNS的輪詢調(diào)度。所有的請求會自動輪詢獲取到集群 ip 列表中的一個 ip 地址。客戶端訪問的時候,Docker集群會通過DNS列表返回對應(yīng)的服務(wù)一系列IP地址,客戶連接其中的一個。這種方式通常用于使用自己的負(fù)載均衡器,或者window和linux的混合應(yīng)用。
-
labels:在服務(wù)上設(shè)置標(biāo)簽,并非附加在service中的容器上。如果在容器上設(shè)置標(biāo)簽,則在deploy之外定義labels。可以用容器上的 labels(跟 deploy 同級的配置) 覆蓋 deploy 下的 labels。
-
mode:用于指定是以副本模式(默認(rèn))啟動還是全局模式
- replicated:副本模式,復(fù)制指定服務(wù)到集群的機器上。默認(rèn)。
- global:全局模式,服務(wù)將部署至集群的每個節(jié)點。類似于k8s中的DaemonSet,會在每個節(jié)點上啟動且只啟動一個服務(wù)。
-
replicas:用于指定副本數(shù),只有mode為副本模式的時候生效。
-
placement:主要用于指定約束和偏好。這個參數(shù)在運維的時候尤為關(guān)鍵
-
constraints(約束):表示服務(wù)可以部署在符合約束條件的節(jié)點上,包含了:
node attributematchesexample node.id 節(jié)點id node.id == 2ivku8v2gvtg4 node.hostname 節(jié)點主機名 node.hostname != node-2 node.role 節(jié)點角色 (manager/worker) node.role == manager node.platform.os 節(jié)點操作系統(tǒng) node.platform.os == windows node.platform.arch 節(jié)點架構(gòu) node.platform.arch == x86_64 node.labels 用戶定義的labels node.labels.security == high engine.labels Docker 引擎的 labels engine.labels.operatingsystem == ubuntu-14.04 -
preferences(偏好):表示服務(wù)可以均勻分布在指定的標(biāo)簽下。
-
preferences 只有一個參數(shù),就是spread,其參數(shù)值為節(jié)點的屬性,即約束表中的內(nèi)容
例如:node.labels.zone這個標(biāo)簽在集群中有三個值,分別為west、east、north,那么服務(wù)中的副本將會等分為三份,分布到帶有三個標(biāo)簽的節(jié)點上。
-
max_replicas_per_node:3.8版本中開始引入的配置。控制每個節(jié)點上最多的副本數(shù)。
注意:當(dāng) 最大副本數(shù)*集群中可部署服務(wù)的節(jié)點數(shù)<副本數(shù),會報錯
-
-
resources:用于限制服務(wù)的資源,這個參數(shù)在運維的時候尤為關(guān)鍵。
示例:配置 redis 集群運行需要的 cpu 的百分比 和 內(nèi)存的占用。避免占用資源過高出現(xiàn)異常。
- limit:用于限制最大的資源使用數(shù)量
- cpus:cpu占比,值的格式為百分比的小數(shù)格式
- memory:內(nèi)存的大小。示例:512M
- reservation:為最低的資源占用量。
- cpus
- memory
- limit:用于限制最大的資源使用數(shù)量
-
restart_policy:容器的重啟策略
- condition:重啟的條件。可選 none,on-failure 或者 any。默認(rèn)值:any
- delay:嘗試重啟的時間間隔(默認(rèn)值:5s)。
- max_attempts:最大嘗試重啟容器的次數(shù),超出次數(shù),則不再嘗試(默認(rèn)值:一直重試)。
- window:判斷重啟是否成功之前的等待時間(一個總的時間,如果超過這個時間還沒有成功,則不再重啟)。
-
rollback_config:更新失敗時的回滾服務(wù)的策略。3.7版本加入。和升級策略相關(guān)參數(shù)基本一致。
-
update_config:配置應(yīng)如何更新服務(wù),對于配置滾動更新很有用。
- parallelism:同時升級[回滾]的容器數(shù)
- delay:升級[回滾]一組容器的時間間隔
- failure_action:若更新[回滾]失敗之后的策略:continue、 pause、rollback(僅在update_config中有) 。默認(rèn) pause
- monitor:容器升級[回滾]之后,檢測失敗的時間檢測 (支持的單位:ns|us|ms|s|m|h)。默認(rèn)為 5s
- max_failure_ratio:最大失敗率
- order:升級[回滾]期間的操作順序。可選:stop-first(串行回滾,先停止舊的)、start-first(并行回滾,先啟動新的)。默認(rèn) stop-first 。注意:只支持v3.4及更高版本
compose.yml 文件示例
version: "3" # 版本號,deploy功能是3版本及以上才有的 services: # 服務(wù),每個服務(wù)對應(yīng)配置相同的一個或者多個docker容器redis: # 服務(wù)名,自取image: redis:alpine # 創(chuàng)建該服務(wù)所基于的鏡像。使用stack部署,只能基于鏡像ports: # 容器內(nèi)外的端口映射情況- "1883:1883"- "9001:9001"networks: # 替代了命令行模式的--link選項- fiwarevolumes: # 容器內(nèi)外數(shù)據(jù)傳輸?shù)膶?yīng)地址- "/srv/mqtt/config:/mqtt/config:ro"- "/srv/mqtt/log:/mqtt/log"- "/srv/mqtt/data/:/mqtt/data/"command: -dbhost stack_mongo # 命令行模式中跟在最后的參數(shù),此條沒有固定的格式,建議參照所部署的docker鏡像的說明文檔來確定是否需要該項、需要寫什么deploy:mode: replicatedreplicas: 6 # replicas模式, 副本數(shù)目為1endpoint_mode: viplabels: description: "This redis service label"resources:limits:cpus: '0.50'memory: 50Mreservations:cpus: '0.25'memory: 20Mrestart_policy:condition: on-failuredelay: 5smax_attempts: 3window: 120splacement:constraints:- "node.role==worker" # 部署位置,只在工作節(jié)點部署- "engine.labels.operatingsystem==ubuntu 18.04"preferences:- spread: node.labels.zoneupdate_config:parallelism: 2delay: 10sorder: stop-firstnetworks: # 定義部署該項目所需要的網(wǎng)絡(luò)fiware:stack 常用命令
docker stack:編排部署應(yīng)用
# 部署一個新的stack(堆棧)或更新現(xiàn)有的stack。別名:deploy, up docker stack deploy [OPTIONS] 自定義STACK名稱 # 選項: -c, --compose-file strings # Compose文件的路徑,或從標(biāo)準(zhǔn)輸入中讀取的“-” --prune # 表示削減不再引用的服務(wù)。可以把一些down掉的service進行自動清理。 --orchestrator string # 指定編排模式 (swarm|kubernetes|all) --resolve-image string # 請求倉庫來重新解析鏡像的摘要和支持的平臺。("always"|"changed"|"never") (默認(rèn) "always") --with-registry-auth # 發(fā)送倉庫的授權(quán)詳情到Swarm代理 --orchestrator # 使用的容器編排服務(wù)# 通過compose.yml文件指令部署 docker stack deploy -c 文件名.yml 自定義STACK名稱# 列出現(xiàn)有堆棧。別名:ls, list docker stack ls [OPTIONS]# 列出堆棧中的任務(wù) docker stack ps [OPTIONS] STACK # 選項: --no-trunc # 輸出完整信息# 刪除一個或多個堆棧。別名:rm, remove, down docker stack rm [OPTIONS] STACK [STACK...] # 選項--orchestrator string # 指定適配器 (swarm|kubernetes|all)# 列出堆棧中的服務(wù) docker stack services [OPTIONS] STACK總結(jié)
以上是生活随笔為你收集整理的docker swarm 集群服务编排部署指南(docker stack)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统工程师之路----送给自己和技术道路
- 下一篇: 一条wmic命令解决硬盘序列号和mac地