防偽碼:為目標(biāo),晚臥夜半,夢別星辰,腳踏實(shí)地,凌云舍我其誰!
1、Docker Swarm 是什么?
Docker Swarm 是一個用于創(chuàng)建 Docker 主機(jī)(運(yùn)行 Docker 守護(hù)進(jìn)程的服務(wù)器)集群的工具,
使用 Swarm 操作集群,會使用戶感覺就像是在一臺主機(jī)上進(jìn)行操作
docker1.12 集成了 swarmkit, 使你可以不用安裝額外的軟件包, 使用簡單的命令啟動創(chuàng)建
docker swarm 集群。
如果你在運(yùn)行 Docker 1.12 時,你就可以原生創(chuàng)建一個 Swarm 集群 .
集成了 swarm 集群的安全特性, 集成了 K-V 存儲, 你現(xiàn)在不需要額外部署 etcd 或者 consul。
在 Docker1.12 版本中,一個大的功能點(diǎn)是 swarm 集群(基于 swarmkit 項目),通過 Docker
命令可以直接實(shí)現(xiàn) docker-engine 相互發(fā)現(xiàn),并組建成為一個容器集群。
SwarmKit 將節(jié)點(diǎn)分為兩類:
工作節(jié)點(diǎn)(Worker ):負(fù)責(zé)通過執(zhí)行容器運(yùn)行任務(wù)。SwarmKit 的默認(rèn)執(zhí)行器為 Docker 容器執(zhí)
行器(Docker Container Executor)。
(1)內(nèi)建分布式存儲,不要額外的數(shù)據(jù)庫
(2)支持 Rolling update
(3) 容器高可用
(4)通過 TLS 保證了節(jié)點(diǎn)之間通訊的安全
管理節(jié)點(diǎn)(Manager ):負(fù)責(zé)接收和響應(yīng)用戶請求,將集群狀態(tài)調(diào)節(jié)到最終狀態(tài)。在 SwarmKit中,用戶可以動態(tài)調(diào)整節(jié)點(diǎn)的角色,即在 Manager 和 Worker 之間轉(zhuǎn)換。
如下圖所示,這是一個典型的 master-slave 的架構(gòu)。每個節(jié)點(diǎn)都是運(yùn)行著 Docker Engine 的
Docker 主機(jī)。一些節(jié)點(diǎn)有更高的權(quán)限,被稱為 Manager。下面的節(jié)點(diǎn)是 worker 節(jié)點(diǎn),接收
來自 manager 組的任務(wù)指示。
實(shí)驗(yàn)?zāi)繕?biāo):部署 docker1.12 Swarm
實(shí)驗(yàn)環(huán)境:
這里選擇三臺主機(jī)運(yùn)行 Swarm,依次為:
node1 192.168.1.104
node2 192.168.1.105
node3 192.168.1.113
1、基本環(huán)境配置
3 臺主機(jī)確保時間一致 ntp
3 臺主機(jī)均關(guān)閉 selinux,開啟路由轉(zhuǎn)發(fā)。
3 臺主機(jī)根據(jù)上面的實(shí)驗(yàn)環(huán)境描述修改主機(jī)名和 ip 地址
2、系統(tǒng)環(huán)境準(zhǔn)備
準(zhǔn)備系統(tǒng)環(huán)境, 配置 host 列表
3 臺主機(jī)均修改/etc/hosts 文件,添加所有主機(jī)的 ip 地址和主機(jī)名的映射記錄
以 node1 為例子:
將修改好的本地的/etc/hosts文件復(fù)制給node2,node3
for ip in 105 113 ; do scp /etc/hosts root@192.168.1.$ip:/etc/hosts ; done
開啟宿主機(jī)之間的端口 :
TCP 端口 2377 集群管理端口
TCP 與 UDP 端口 7946 節(jié)點(diǎn)之間通訊端口
TCP 與 UDP 端口 4789 overlay 網(wǎng)絡(luò)通訊端口
配置所有節(jié)點(diǎn)密鑰登錄:
配置所下節(jié)點(diǎn)密鑰互信, 在 node1 可以免密碼登錄各節(jié)點(diǎn),只在 node1 上執(zhí)行:
生成 sshkey
發(fā)布 sshkey 到各個節(jié)點(diǎn)
命令:for i in 1 2 3 ; do ssh-copy-id node$i ; done
或者
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
測試密鑰登錄
安裝 docker 1.12(按照 docs.docker.com 官網(wǎng)安裝)
在所有節(jié)點(diǎn)上安裝 docker 1.12:
以下命令請在所有節(jié)點(diǎn)上執(zhí)行.
添加 docker repo 文件
rm -rf /etc/yum.repos.d/*
tee /etc/yum.repos.d/docker.repo<<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
安裝 docker package
yum-y install docker- engine
啟動 docker
檢查 docker 版本
docker1.12 Swarm 模式簡介:
Docker Engine 1.12 集成了 Swarm 集群工具.
主要使用三個新的命令行工具創(chuàng)建一個 swarm 集群:
docker swarm 開啟 swarm 模式; 加入 Swarm 集群; 配置集群參數(shù)
docker node 查詢集群節(jié)點(diǎn)信息; 提升/移除一個管理節(jié)點(diǎn); 管理 swarm 節(jié)點(diǎn)主機(jī)
docker service 創(chuàng)建管理 service
可以查看 docker --help
創(chuàng)建 Swarm 集群
在 node1 上初始化 swram 集群:
注意 你只需要在一個 node1 上初始化 swarm 集群, 其他 node 加入這個集群就行了, 所以以
下命令只需要在 node1 上運(yùn)行.
--advertise-addr 參數(shù), 后面跟你 swarm 集群的通訊地址, 也就是 node1 的地址.
查看端口號監(jiān)聽情況
檢查 node1 docker swarm mode 信息:
#docker info
顯示信息如下:
查看 swarm 集群 node 列表:
可以看到,我們的 swarm 集群中只有一個節(jié)點(diǎn).現(xiàn)在我們把其他節(jié)點(diǎn)加入我們的集群中:
把其他節(jié)點(diǎn)加入集群中:
在 node1 通過 ssh, 在 node2-node3 上執(zhí)行上面的加入集群命令:
注: 如果你不記得上面提示的加入 swarm 集群的命令和密鑰可以使用如下方式查看 worker
節(jié)點(diǎn)和 manager 節(jié)點(diǎn)的加入命令
再次檢查集群節(jié)點(diǎn)列表, 我們可以看到所有的服務(wù)器都已經(jīng)加入 swarm 集群了
不過現(xiàn)在集群只有一個manager節(jié)點(diǎn)node1, 為了swarm集群的高可用,和避免單點(diǎn)故障. 我
們希望建立多個 manager 節(jié)點(diǎn)集群.
只需要通過如下命令, 提升 worker 節(jié)點(diǎn)成 manager 節(jié)點(diǎn):
[root@node1 ~]# docker node promote node2
查看 node2 的 docker info
現(xiàn)在我們可以看到, 已經(jīng)有2個manager節(jié)點(diǎn)了, 一個Leader節(jié)點(diǎn), 一個Reachable節(jié)點(diǎn). 現(xiàn)
在你也可以在 node2 上面管理整個 swarm 集群.
我們的 swarm 集群就搭建完畢了. 超級簡單
習(xí)慣使用 docker 命令幫助:docker<command> --help
總結(jié):
docker swarm:集群管理,子命令主要有下面幾個。
docker swarm init 命令用于初始化一個集群
dockerswarm join 命令用于加入一個現(xiàn)有集群
dockerswarm leave 命令由于離開集群
附:node 下線
有些時候需要維護(hù)一個節(jié)點(diǎn),此時此節(jié)點(diǎn)可能會網(wǎng)絡(luò)斷開或者需要關(guān)機(jī),造成節(jié)點(diǎn)上服務(wù)不
可用。使用 docker node update --availability drain <NODE-ID>將節(jié)點(diǎn)下線,swarm 會將當(dāng)前節(jié)
點(diǎn)上的容器關(guān)閉并在其他節(jié)點(diǎn)上啟動。當(dāng)維護(hù)完成,需要上線是,將節(jié)點(diǎn)狀態(tài)修改為 active
狀態(tài)即可,命令如下:docker node update --availability active <NODE-ID>
有了 Docker Swarm 集群我們?nèi)绾伟盐覀兊膽?yīng)用跑在 Swarm 集群上呢?
很簡單, 基本上原來我們使用 docker run 的命令創(chuàng)建容器, 把前面替換成 docker service
create 就行了.
建議搭建一個 registry,為所的 docker 主機(jī)提供鏡像下載,否則你需要在每個 docker 主機(jī)本
地存在容器鏡像。
所以搭建一個私有倉庫,由私有倉庫提供所需要的鏡像,
本實(shí)驗(yàn)環(huán)境中用 node1 同時作為 registry。
拉取本地私有倉庫 registry,查看 registry 鏡像
開啟路由轉(zhuǎn)發(fā)
vi /etc/sysctl.cof
添加 net.ipv4.ip_forward=1
執(zhí)行 sysctl -p 使修改生效
#docker pull registry:2
#docker images
附:registry1 是 python 語言寫的,而現(xiàn)在 registry2 版本即 docker distribution 更加安全和快
速,并且是用 go 語言寫的。
基于私有倉庫鏡像運(yùn)行容器
默認(rèn)情況下,registry2 會將倉庫存放于容器的/var/lib/registry 目錄下,這樣如果容器被刪除,則存放于容器中的鏡像也會丟失,所以我們一般情況下會指定本地一個目錄掛載到容器的/var/lib/registry 下,兩個目錄下都有!
registry 的默認(rèn)存儲路徑是/var/lib/registry,只是個臨時目錄,一段時間之后就會消失
所以使用-v 參數(shù),指定個本地持久的路徑,
返回{"repositories":[]} 說明 registry 服務(wù)工作正常.
注:鏡像信息存放在/var/lib/registry 目錄下,因此這里將宿主機(jī)目錄映射到/var/lib/registry
所有主機(jī)都指向 registry 服務(wù)器:
停止 docker 服務(wù)
#systemctl stop docker
修改/usr/lib/systemd/system/docker.service,修改后保存退出
重載 docker 服務(wù)并啟動 docker 服務(wù)
#systemctl daemon-reload
#systemctl startdocker
測試本地鏡像倉庫
有了本地鏡像倉庫 registry, 現(xiàn)在我們推送一個測試鏡像到本機(jī)鏡像倉庫, 測試下 registry 服
務(wù).
測試:在 node2 主機(jī)上推送鏡像到 registry
如果想把鏡像推送到本地 registry.
需要先 tag 這個鏡像的名字成<registry>/<image name>:<tag>
將 tag 后的鏡像上傳到 registry.
push 成功后, 可以調(diào)用 registry API 查看 registry 中的鏡像
在 node2主機(jī)測試從 registry 下載鏡像
overlay 網(wǎng)絡(luò)
解決了鏡像構(gòu)建問題, 為了讓應(yīng)用跑在 swram集群 上,我們還需要解決容器間的網(wǎng)絡(luò)訪問問
題.
單臺服務(wù)器的時候我們應(yīng)用所有的容器都跑在一臺主機(jī)上, 所以容器之間的網(wǎng)絡(luò)是互通的.
現(xiàn)在我們的集群有 3 臺主機(jī), 所以 docker 應(yīng)用的服務(wù)會分布在這 3 臺主機(jī)上.
如何保證不同主機(jī)上的容器網(wǎng)絡(luò)互通呢?
swarm 集群 已經(jīng)幫我們解決了這個問題了,就是只用 overlay network .
在 docker 1.12 以前, swarm 集群需要一個額外的 key-value 存儲(consul, etcd). 來同步
網(wǎng)絡(luò)配置, 保證所有容器在同一個網(wǎng)段中.
在 docker 1.12 已經(jīng)內(nèi)置了這個存儲, 集成了 overlay networks 的支持.
下面我們演示下如何創(chuàng)建一個 overlay network:
注:swarm 上默認(rèn)已有一個名為 ingress 的 overlay 網(wǎng)絡(luò), 可以直接使用, 但本文會創(chuàng)建一個
新的
為我們的 docker 應(yīng)用創(chuàng)建一個名為 dockercoins 的 overlay network
查詢 docker network 列表
在網(wǎng)絡(luò)列表中你可以看到 dockercoins 網(wǎng)絡(luò)的 SCOPE 是 swarm, 表示該網(wǎng)絡(luò)在整個 swarm 集
群生效的, 其他一些網(wǎng)絡(luò)是 local, 表示本機(jī)網(wǎng)絡(luò).
你只需要在 manager 節(jié)點(diǎn)創(chuàng)建 network, swarm 集群會自動處理配置到其他的節(jié)點(diǎn),這是你可
查看其他節(jié)點(diǎn)的 network. dockercoins 網(wǎng)絡(luò)已經(jīng)都創(chuàng)建了
注:一旦新的任務(wù)被指定給這個節(jié)點(diǎn),Overlay 網(wǎng)絡(luò)就會被按需創(chuàng)建。
在 swarm 集群上運(yùn)行 docker 應(yīng)用
概念解釋:service
Docker1.12 swarm 引入了服務(wù)的概念,一個服務(wù)由多個任務(wù)組成,一個任務(wù)即一個運(yùn)行的容器。
服務(wù)包括兩種類型:
復(fù)制服務(wù)(replicated services):類似 k8s 中復(fù)制集的概念,保持一定數(shù)量的相同任務(wù)在集
群中運(yùn)行;
全局服務(wù)(global services):類似 k8s 中 daemon 的概念,每個工作節(jié)點(diǎn)上運(yùn)行一個。
發(fā)布服務(wù):
在 manager 上執(zhí)行如下命令:
下面我們可以使用之前 push 到本地鏡像倉庫的鏡像啟動服務(wù), 以 centos:http 為例:
以復(fù)制服務(wù)類型運(yùn)行服務(wù)
在 manager 上執(zhí)行如下命令:
docker service create 命令創(chuàng)建一個 service.
--name 標(biāo)簽命名 service 為 web1.
--replicas 標(biāo)簽來聲明 1 個運(yùn)行實(shí)體(即容器副本數(shù))
注意, 我們啟動的鏡像名字 192.168.1.104:5000/centos:http 使用我們本地鏡像倉庫的鏡像名
稱, 這樣當(dāng)主機(jī)上沒有這個鏡像時, 會自動到本地鏡像倉庫拉取鏡像.
使用 docker service ls 查看服務(wù)
dockerservice inspect 命令用戶查看 service 詳細(xì)信息
使用 docker serviceps<SERVICE-ID/NAME>查看服務(wù)運(yùn)行在哪個節(jié)點(diǎn)上
現(xiàn)在你可以用瀏覽器訪問 http://192.168.1.104:8000 就能訪問測試頁
事實(shí)上, 你可以訪問swarm集群中的所有節(jié)點(diǎn) 192.168.1.105、192.168.1.113的8000端口, 都
可以訪問測試頁。(注:將 firewall 防火墻默認(rèn)區(qū)域設(shè)置為 trusted)
在 manager 上執(zhí)行如下命令:
--replicas 標(biāo)簽來聲明 2 個運(yùn)行實(shí)體
查看服務(wù):
從上圖可以看到 web2 名稱的 service 有 2 個副本分別運(yùn)行在 node1和 node3 節(jié)點(diǎn)上。
以全局服務(wù)類型運(yùn)行服務(wù)
從下圖可以看到服務(wù) web4 在每個節(jié)點(diǎn)上都運(yùn)行一個
下面我們擴(kuò)展舊的服務(wù),從下圖可以看到 web1 service 目前只有一個副本
擴(kuò)展已有的服務(wù)的副本數(shù),這里將 web1 服務(wù)擴(kuò)展到 3 個副本
縮減已有的服務(wù)的副本數(shù),這里將 web1 服務(wù)縮減到 2 個副本
Swarm 節(jié)點(diǎn)是自組織(self-organizing)和自修復(fù)(self-healing)的,什么意思?只要有節(jié)
點(diǎn)或容器宕掉,swarm engine 就會嘗試修復(fù),下面我們來具體看一下
自修復(fù)(self-healing)
經(jīng)過上面的操作之后,我們有以下 3 個節(jié)點(diǎn):
運(yùn)行著 3個服務(wù)共 7 個任務(wù)(容器)
Node1 節(jié)點(diǎn)上運(yùn)行著容器 2個容器還有一個私有倉庫注冊服務(wù)器容器
Node2 節(jié)點(diǎn)上運(yùn)行著容器 2 個容器
Node3 節(jié)點(diǎn)上運(yùn)行著容器 3個容器
現(xiàn)在我們讓 node3 上的容器都宕掉或部分宕掉
一旦 node3 上所有容器停止,Docker 就會試圖在相同的節(jié)點(diǎn)上啟動 2 個不同 ID 的容器。
這就是 Docker Swarm Engine 的 self-healing 功能。
在 node3 節(jié)點(diǎn)上執(zhí)行 dockerps 查看
Self-Organizing
現(xiàn)在我們讓 node3 整個宕掉,node3 上的容器會自動在其它節(jié)點(diǎn)上啟動。
在 manager 節(jié)點(diǎn)上執(zhí)行 docker server ps 服務(wù)名
謝謝觀看,真心的希望能幫到您!
本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!
更多建議: