docker1.12+swarmkit

docker1.12+swarmkit

防僞碼:風雨兼程

一、理論解析:

Docker Swarm  是什麼?

Docker Swarm 是一個用於創建 Docker 主機(運行 Docker 守護進程的服務器)集羣的工具,

使用 Swarm 操作集羣,會使用戶感覺就像是在一臺主機上進行操作

docker1.12 集成了 swarmkit, 使你可以不用安裝額外的軟件包, 使用簡單的命令啓動創建

docker swarm 集羣。

如果你在運行 Docker 1.12 時,你就可以原生創建一個 Swarm 集羣 .

集成了 swarm 集羣的安全特性, 集成了 K-V 存儲, 你現在不需要額外部署 etcd 或者 consul

Docker1.12 版本中,一個大的功能點是 swarm 集羣(基於 swarmkit 項目),通過 Docker

命令可以直接實現 docker-engine 相互發現,並組建成爲一個容器集羣。

SwarmKit 將節點分爲兩類:

工作節點(Worker :負責通過執行容器運行任務。SwarmKit 的默認執行器爲 Docker 容器執

行器(Docker Container Executor)。

1)內建分佈式存儲,不要額外的數據庫

2)支持 Rolling update

3 容器高可用

4)通過 TLS 保證了節點之間通訊的安全

管理節點(Manager :負責接收和響應用戶請求,將集羣狀態調節到最終狀態。在 SwarmKit

中,用戶可以動態調整節點的角色,即在 Manager Worker 之間轉換。

如下圖所示,這是一個典型的 master-slave 的架構。每個節點都是運行着 Docker Engine

Docker 主機。一些節點有更高的權限,被稱爲Manager。下面的節點是 worker 節點,接收

來自 manager 組的任務指示。

                             wKiom1hlG7WjUzYzAAD9UwfDXSQ248.png

二、實驗驗證理論:

部署 docker1.12 Swarm

實驗環境:

這裏選擇三臺主機運行 Swarm,依次爲:

node1 192.168.1.104

node2 192.168.1.105

node3 192.168.1.113

基本環境配置

3 臺主機確保時間一致 ntp

3 臺主機均關閉 selinux,開啓路由轉發。

3 臺主機根據上面的實驗環境描述修改主機名和 ip 地址

系統環境準備

準備系統環境, 配置 host 列表

3 臺主機均修改/etc/hosts 文件,添加所有主機的 ip地址和主機名的映射記錄

node1 爲例子,同時給其它兩臺主機修改hosts文件:

wKiom1hlG8Pz_r9PAAJq2FiUUzE097.png-wh_50

開啓宿主機之間的端口

TCP 端口 2377 集羣管理端口

TCP UDP 端口 7946 節點之間通訊端口

TCP UDP 端口 4789overlay 網絡通訊端口

wKioL1hlG-PQlpHAAACn864NKSA860.png-wh_50

配置所有節點密鑰登錄.

配置所下節點密鑰互信, node1 可以免密碼登錄各節點,只在 node1 上執行:

生成sshkey

wKiom1hlG_jSDIBIAAF0ATxI4M4042.png-wh_50

使用for循環語句,發佈 sshkey 到各個節點

wKioL1hlHAzSpj4GAAPsEhN_NnU259.png-wh_50

測試密鑰登錄

wKioL1hlHCGhU8gXAABjJ9236dI577.png-wh_50

安裝 docker 1.12,每個節點都安裝,這裏使用rpm方式安裝,

wKiom1hlHDPjVjH1AAFGutHK0mY895.png-wh_50

啓動docker

wKioL1hlHEqjEUYGAAKs5XkloOw380.png-wh_50

檢查docker版本

wKiom1hlHF_Aw2_JAABao2c7SBY769.png-wh_50

docker1.12 Swarm 模式簡介

Docker Engine 1.12 集成了 Swarm 集羣工具.

主要使用三個新的命令行工具創建一個 swarm 集羣:

docker swarm 開啓 swarm 模式; 加入 Swarm 集羣; 配置集羣參數

docker node 查詢集羣節點信息; 提升/移除一個管理節點; 管理 swarm 節點主機

docker service 創建管理 service

可以查看 docker --help

創建 Swarm 集羣

node1 上初始化 swram 集羣:

注意你只需要在一個 node1 上初始化 swarm 集羣, 其他 node 加入這個集羣就行了, 所以以

下命令只需要在 node1 上運行.

wKioL1hlHHTApezjAAGhiauPAaU016.png-wh_50

解釋:根據如上命令的提示:

我們的其他節點服務器, worker 角色加入 swarm 集羣需要登錄到服務器運行如下命令:

wKiom1hlHIqDix3nAACUHBJ_wEc199.png-wh_50

manager 角色加入 swarm 集羣:

wKiom1hlHJ7D2rYRAACW7OA8bT4309.png-wh_50

--advertise-addr 參數, 後面跟你 swarm 集羣的通訊地址, 也就是 node1 的地址.

查看端口號監聽情況

wKioL1hlHLCCe214AAC_gPrKVuY042.png-wh_50

檢查 node1 docker swarm mode 信息:

#docker info

顯示信息如下:

wKiom1hlHMLTH8OWAAE3a8jq0cQ369.png-wh_50

查看 swarm 集羣 node 列表

wKiom1hlHNfCcp7WAACSLzbafKs826.png-wh_50

可以看到,我們的 swarm 集羣中只有一個節點.現在我們把其他節點加入我們的集羣中:

把其他節點加入集羣中:

node1 通過 ssh, node2-node3 上執行上面的加入集羣命令:

wKioL1hlHOjhfNtnAADqlKtnPyQ722.png-wh_50

注:如果你不記得上面提示的加入 swarm 集羣的命令和密鑰可以使用如下方式查看 worker

節點和 manager 節點的加入命令

wKiom1hlHPvR7GiNAAF4pJcQX-s776.png-wh_50

再次檢查集羣節點列表, 我們可以看到所有的服務器都已經加入 swarm 集羣了

wKioL1hlHQ_Cu6RKAADKSIlB0bc923.png-wh_50

不過現在集羣只有一個manager節點node1, 爲了swarm集羣的高可用,和避免單點故障.

們希望建立多個 manager 節點集羣.

只需要通過如下命令, 提升 worker 節點成 manager 節點:

wKiom1hlHSfCeEA9AAD_XiYtC-o289.png-wh_50

現在我們可以看到, 已經有2manager節點了, 一個Leader節點, 一個Reachable節點.

在你也可以在 node2 上面管理整個 swarm 集羣.

我們的 swarm 集羣就搭建完畢了. 超級簡單

習慣使用 docker 命令幫助:docker<command> --help

總結:

docker swarm:集羣管理,子命令主要有下面幾個。

docker swarm init 命令用於初始化一個集羣

dockerswarm join 命令用於加入一個現有集羣

dockerswarm leave 命令由於離開集羣

附:node 下線

有些時候需要維護一個節點,此時此節點可能會網絡斷開或者需要關機,造成節點上服務不

可用。使用 docker node update --availability drain <NODE-ID>將節點下線,swarm 會將當前節

點上的容器關閉並在其他節點上啓動。當維護完成,需要上線是,將節點狀態修改爲 active

狀態即可,命令如下:docker node update --availability active <NODE-ID>

有了 Docker Swarm 集羣我們如何把我們的應用跑在 Swarm 集羣上呢?

很簡單, 基本上原來我們使用 docker run 的命令創建容器, 把前面替換成 docker service

create 就行了.

建議搭建一個 registry,爲所的 docker 主機提供鏡像下載,否則你需要在每個 docker 主機本

地存在容器鏡像。

所以搭建一個私有倉庫,由私有倉庫提供所需要的鏡像,

本實驗環境中用 node1 同時作爲 registry

拉取本地私有倉庫 registry,查看 registry 鏡像

開啓路由轉發

vi /etc/sysctl.cof

添加 net.ipv4.ip_forward=1

執行 sysctl -p 使修改生效

從本地導入鏡像

wKioL1hlHT3CH03SAAGUoV17QFI220.png-wh_50

附:registry1 python 語言寫的,而現在 registry2 版本即 docker distribution 更加安全和快

速,並且是用 go 語言寫的。

基於私有倉庫鏡像運行容器

默認情況下,registry2 會將倉庫存放於容器的/var/lib/registry 目錄下,這樣如果容器被刪除,

則存放於容器中的鏡像也會丟失,所以我們一般情況下會指定本地一個目錄掛載到容器的

/var/lib/registry 下,兩個目錄下都有!

·registry 的默認存儲路徑是/var/lib/registry,只是個臨時目錄,一段時間之後就會消失

·所以使用-v 參數,指定個本地持久的路徑,

wKioL1hlHVChZ0uRAAGMSBTNBLE846.png-wh_50

返回{"repositories":[]} 說明 registry 服務工作正常.

注:鏡像信息存放在/var/lib/registry 目錄下,因此這裏將宿主機目錄映射到/var/lib/registry

所有主機都指向 registry 服務器:

修改/usr/lib/systemd/system/docker.service,修改後保存退出

wKiom1hlHYPhPgZCAAGtO7SveHA716.png

重載 docker 服務並重啓 docker 服務

wKioL1hlHZewSHXeAABVt9FTZ8o492.png-wh_50

測試本地鏡像倉庫

有了本地鏡像倉庫 registry, 現在我們推送一個測試鏡像到本機鏡像倉庫, 測試下 registry

.

測試:在 node2 主機上推送鏡像到 registry

如果想把鏡像推送到本地 registry.

需要先 tag 這個鏡像的名字成<registry>/<p_w_picpath name>:<tag>

wKioL1hlHanwD2kiAADUn_oN6Q0527.png-wh_50

tag 後的鏡像上傳到 registry

wKiom1hlHbuhZ4mFAAFl2EmKIOc320.png-wh_50

push 成功後, 可以調用 registryAPI 查看 registry 中的鏡像

wKiom1hlHeXhiukHAABpn_NW-Rw580.png-wh_50

node3 主機測試從 registry 下載鏡像

wKiom1hlHfry95HTAAH0NMMyxro987.png-wh_50

overlay 網絡

解決了鏡像構建問題, 爲了讓應用跑在 swram集羣,我們還需要解決容器間的網絡訪問問

.

單臺服務器的時候我們應用所有的容器都跑在一臺主機上, 所以容器之間的網絡是互通的.

現在我們的集羣有 3 臺主機, 所以 docker 應用的服務會分佈在這 3 臺主機上.

如何保證不同主機上的容器網絡互通呢?

swarm 集羣 已經幫我們解決了這個問題了,就是隻用 overlaynetwork .

docker 1.12 以前, swarm 集羣需要一個額外的 key-value 存儲(consul, etcd). 來同步

網絡配置, 保證所有容器在同一個網段中.

docker 1.12 已經內置了這個存儲, 集成了 overlay networks 的支持.

下面我們演示下如何創建一個 overlay network:

注:swarm 上默認已有一個名爲 ingress overlay 網絡, 可以直接使用, 但本文會創建一個

新的

爲我們的 docker 應用創建一個名爲 dockercoins overlay network

wKioL1hlHg_i3YXEAAB9p9OgywM418.png-wh_50

查詢 docker network 列表

wKioL1hlHh3ijO5JAADlUfTIBHg182.png-wh_50

在網絡列表中你可以看到 dockercoins 網絡的 SCOPE swarm, 表示該網絡在整個 swarm

羣生效的, 其他一些網絡是 local, 表示本機網絡.

你只需要在 manager 節點創建 network, swarm 集羣會自動處理配置到其他的節點,這是你可以查看其他節點的 network. dockercoins 網絡已經都創建了.:

wKioL1hlHi-hsj1qAAEJWM1Nc4c177.png-wh_50

注:一旦新的任務被指定給這個節點,Overlay 網絡就會被按需創建。

swarm 集羣上運行 docker 應用

概念解釋:service

Docker1.12 swarm 引入了服務的概念,一個服務由多個任務組成,一個任務即一個運行的容器。

服務包括兩種類型:

複製服務(replicated services):類似 k8s 中複製集的概念,保持一定數量的相同任務在集

羣中運行;

全局服務(global services):類似 k8s daemon 的概念,每個工作節點上運行一個。

發佈服務:

manager 上執行如下命令:

下面我們可以使用之前 push 到本地鏡像倉庫的鏡像啓動服務, centos:http 爲例:

以複製服務類型運行服務

manager 上執行如下命令:

wKioL1hlHkegCZ8JAACnt3lqGl8875.png-wh_50

docker service create 命令創建一個service.

--name 標籤命名 service web1.

--replicas 標籤來聲明 1 個運行實體(即容器副本數)

注意, 我們啓動的鏡像名字 192.168.1.104:5000/centos:http 使用我們本地鏡像倉庫的鏡像名

, 這樣當主機上沒有這個鏡像時, 會自動到本地鏡像倉庫拉取鏡像.

使用 docker service ls 查看服務

wKiom1hlHlzTNE0HAACOYr3K_IM067.png-wh_50

dockerservice inspect 命令用戶查看service 詳細信息

使用 docker serviceps<SERVICE-ID/NAME>查看服務運行在哪個節點上

wKiom1hlHmuTtdRsAADL1EtkN1g425.png-wh_50

現在你可以用瀏覽器訪問 http://192.168.1.104:8000 就能訪問測試頁

wKioL1hlHoPy4seNAAFCFOj_UBI168.png-wh_50

事實上, 你可以訪問swarm集羣中的所有節點 192.168.1.105192.168.1.1138000端口,

可以訪問測試頁。(注:將 firewall 防火牆默認區域設置爲 trusted

wKiom1hlHqfC9i0PAABz3Q2Slpk967.png-wh_50

manager 上執行如下命令:

wKioL1hlHrqA6-aHAAEN98iRS-U738.png-wh_50

--replicas 標籤來聲明 2 個運行實體

查看服務:

wKiom1hlHs_CKgYVAAGTfXeezsg882.png-wh_50

從上圖可以看到 web2 名稱的 service 2 個副本分別運行在 node2 node3 節點上。

以全局服務類型運行服務

wKioL1hlHt-AlKZAAAEz1ww4lqQ828.png-wh_50

從下圖可以看到服務 web4 在每個節點上都運行一個

wKioL1hlHvCw4D3dAAFgfa-fnqk957.png-wh_50

下面我們擴展舊的服務,從下圖可以看到 web1 service 目前只有一個副本

wKiom1hlHwDi_i3GAADR685_lrQ211.png-wh_50

擴展已有的服務的副本數,這裏將 web1 服務擴展到 3 個副本

wKiom1hlHxCz-fX6AAIoSx50zYk770.png-wh_50

縮減已有的服務的副本數,這裏將 web1 服務縮減到 2 個副本

wKioL1hlHyGRan1JAAD_cqe5dbA075.png-wh_50

Swarm 節點是自組織(self-organizing)和自修復(self-healing)的,什麼意思?只要有節

點或容器宕掉,swarm engine 就會嘗試修復,下面我們來具體看一下

自修復(self-healing

經過上面的操作之後,我們有以下 3 個節點:

wKiom1hlHzLzSkWVAADkVa5VObA667.png-wh_50

運行着 3個服務共 7 個任務(容器)

wKioL1hlH0HRn_aDAACzgosoYA4836.png-wh_50

Node1 節點上運行着容器 2 個容器還有一個私有倉庫註冊服務器容器

wKioL1hlH1ihOR5pAAGqh77w7YQ052.png-wh_50

Node2 節點上運行着容器 3 個容器

wKiom1hlH3TxRW26AAG_CTKPzxc058.png-wh_50

Node3 節點上運行着容器 2 個容器

wKiom1hlH5SybGjOAAFRiD27qPk761.png-wh_50

現在我們讓 node3 上的容器都宕掉或部分宕掉

wKioL1hlH6jAkep_AAB1IQ2d8O4454.png-wh_50

一旦 node3 上所有容器停止,Docker 就會試圖在相同的節點上啓動 2 個不同 ID 的容器。

wKioL1hlH7qguUE6AAIM2GONZJ4584.png-wh_50

wKiom1hlH8qw-7KnAAG6lDs8-NA741.png-wh_50

這就是 Docker Swarm Engine self-healing 功能。

node3 節點上執行 docker ps 查看

Self-Organizing

現在我們讓 node3 整個宕掉,node3 上的容器會自動在其它節點上啓動。

manager 節點上執行 docker server ps 服務名

wKioL1hlH9zAC4vuAAG82PIKHt4881.png-wh_50

wKiom1hlH_Cg22qAAAG7Kw0pqGQ586.png-wh_50


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章