Docker swarm搭建(1)

Docker swarm

docker swarm集羣:三劍客之一

一. Docker Swarm 的基本概念和原理

Docker Swarm 簡介

Swarm是Docker公司推出的用來管理docker集羣,它將一羣Docker宿主機變成一個單一的,虛擬的主機。Swarm使用標準的Docker API接口作爲其前端訪問入口,換言之,各種形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接與Swarm通信。Swarm幾乎全部用go語言來完成開發,Swarm0.2發佈,相比0.1版本,0.2版本增加了一個新的策略來調度集羣中的容器,使得在可用的節點上傳播它們,以及支持更多的Docker命令以及集羣驅動。
Swarm deamon只是一個調度器(Scheduler)加路由器(router),Swarm自己不運行容器,它只是接受docker客戶端發送過來的請求,調度適合的節點來運行容器,這意味着,即使Swarm由於某些原因掛掉了,集羣中的節點也會照常運行,當Swarm重新恢復運行之後,它會收集重建集羣信息.

Docker Swarm 工作原理

Docker 客戶端通過 Docker API 向 Swarm 管理端發送請求,Swarm Manager 通過守護進程調用集羣中的某個節點來執行任務。因爲容器都是運行在節點上,Swarm 作爲一個獨立的集羣管理工具,故並不會因某些原因導致不能正常工作而影響集羣內所有節點的正常運行。當服務恢復正常後,Swarm 會讀取日誌來執行集羣的恢復動作。架構圖如圖 1:

圖 1.Docker Swarm 架構圖
Docker swarm搭建(1)

二. Docker Swarm要點

Swarm的負載非常低。據我觀察,Swarm進行調度和通信的CPU負載非常低。因此,Swarm的管理節點(Manager)可以同時作爲工作節點(Worker)。如果你需要搭建一個非常大的集羣(1000+ 節點),管理節點需要更多資源,但是對於中小型集羣來說,管理節點需要的資源可以忽略不計。

Swarm集羣的網絡通信(服務發現,負載均衡以及容器間通信)非常可靠。當你開啓一個服務的端口之後,在Swarm集羣中的任何一個節點都可以訪問它。負載均衡也是由Swarm提供的。後文會提到一些之前遇到的問題,但是Docker 1.13之後,這些問題都解決了。

三. 實驗環境

主機 IP地址 服務
docker01 192.168.1.11 swarm+overlay+webUI
docker02 192.168.1.13 nginx
docker03 192.168.1.20 nginx

三臺主機都關閉防火牆,禁用selinux,修改主機名,時間同步,並添加域名解析。

docker版本必須是:v1.12版本開始(可使用docker version查看版本)

1.關閉防火牆,禁用selinux

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# hostnamectl set-hostname docker03
[root@localhost ~]# su -

2.時間同步

mv /etc/localtime /etc/localtime.bk
cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime

3.修改主機名(三臺都要)

[root@localhost ~]# hostnamectl set-hostname docker01
[root@localhost ~]# su -

4.添加域名解析

[root@docker01 ~]# vim  /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.11 docker01
192.168.1.13 docker02
192.168.1.20 docker03

四. swarm原理

swarm:作用運行docker engin的多個主機組成的集羣

node:每一個docker engin都是一個node(節點),分爲manager和worker。

manager node:負責執行容器的編排和集羣的管理工作,保持並維護swarm處於期望的狀態。swarm可以有多個manager node,他們會自動協調並選舉一個leader執行編排任務。但相反,不能沒有manager node。

worker node:接受並執行由manager node派發的任務,並且默認manager node也是一個worker node,不過可以將它設置爲manager-only node,讓他只負責編排和管理工作。

service:用來定義worker上執行的命令。

基本命令操作

docker swarm leave:申請離開一個集羣,之後查看節點狀態會變成down,然後可通過manager node 將其刪除
docker node rm xxx:刪除某個節點

docker swarm join-token [manager|worker]:生成令牌,可以是manager或worker身份。

docker node demote(降級):將swarm節點的爲manager降級爲worker

docker node promote(升級):將swarm節點的work升級爲manager

docker node ls:查看羣集的信息(只可以在manager角色的主機上查看)

docker service scale web05=6:容器的動態擴容及縮容

docker service ps web01: 查看創建的容器運行在哪些節點

docker service ls: 查看創建的服務

docker swarm leave: 脫離這個羣集

docker node rm docker03: 在manager角色的服務器上移除docker03

docker node update --availability drain docker01: 設置主機docker01以後不運行容器,但已經運行的容器並不會停止

docker node update --label-add mem=max docker03: 更改docker03主機的標籤爲mem=max

docker service update --replicas 8 --image 192.168.20.6:5000/lvjianzhao:v2.0 --container-label-add 'node.labels.mem==max' lvjianzhao05: 將服務升級爲8個容器,並且指定在mem=max標籤的主機上運行

五. docker01 初始化集羣

[root@docker01 ~]# docker swarm init --advertise-addr 192.168.1.11

--advertise-addr:指定與其它docker通信的地址。

上邊返回的結果告訴我們:初始化成功,並且,如果想要添加work節點運行下面的命令:

Docker swarm搭建(1)

注意:token令牌只有24小時的有效期

上面命令執行後,該機器自動加入到swarm集羣。這個會創建一個集羣token,獲取全球唯一的 token,作爲集羣唯一標識。後續將其他節點加入集羣都會用到這個token值。 其中,--advertise-addr參數表示其它swarm中的worker節點使用此ip地址與manager聯繫。命令的輸出包含了其它節點如何加入集羣的命令。

如果想要添加manager節點:運行下面命令

Docker swarm搭建(1)

六.swarm集羣的簡單操作

1.docker02和docker03以worker加入集羣

[root@docker03 ~]# docker swarm join --token SWMTKN-1-5kxn9wloh7npnytklwbfciesr9di7uvu521gwnqm9h1n0pbokj-1e60wt0yr5583e4mzwbxnn3a8 192.168.1.11:2377

docker01查看集羣

[root@docker01 ~]# docker node ls

Docker swarm搭建(1)

注意:這裏的”*****“代表的是當前所屬的節點

2.刪除集羣中節點

docker02和docker03申請離開一個集羣
[root@docker02 ~]# docker swarm leave 
docker刪除docker02和docker03節點
[root@docker01 ~]# docker node rm docker02 
[root@docker01 ~]# docker node rm docker03
docker01查看集羣
[root@docker01 ~]# docker node ls

Docker swarm搭建(1)

3.docker02和docker03以manager加入集羣

docker01生成manager令牌

[root@docker01 ~]# docker swarm join-token manager 

Docker swarm搭建(1)

docker02和docker03加入集羣

docker swarm join --token SWMTKN-1-5kxn9wloh7npnytklwbfciesr9di7uvu521gwnqm9h1n0pbokj-cz6hbyv9r5htyqwj5tfol65aa 192.168.1.11:2377

docker01查看集羣

[root@docker01 ~]# docker node ls

Docker swarm搭建(1)

4.docker02和docker03降級

docker01(manager)把docker02和docker03降級成worker

[root@docker01 ~]# docker node  demote docker02
[root@docker01 ~]# docker node  demote docker03

查看集羣

[root@docker01 ~]# docker node ls

Docker swarm搭建(1)

七. 部署docker swarm集羣網絡

overlay:覆蓋型網絡

overlay networks 管理Swarm中docker守護進程間的通信。可以將容器附加到一個或多個已存在的overlay網絡上,使容器與容器之間能夠通信;

[root@docker01 ~]# docker network create -d overlay --attachable docker
//attachable:這個參數必須要加,否則不能用於容器。

在創建網絡的時候,我們並沒有部署一個存儲服務,比如consul,那是因爲docker swarm自帶存儲。

docker01查看網絡

但是會發現其他兩臺並不會發現此網絡,需等基於此網絡創建service服務就可以看到了

[root@docker01 ~]# docker network ls

Docker swarm搭建(1)

八. docker01部署一個圖形化webUI界面

1.docker01 導入鏡像

[root@docker01~]# docker pull dockersamples/visualizer

2.基於鏡像啓動一臺容器

[root@docker01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.100 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualiaer  dockersamples/visualizer

3.通過瀏覽器訪問驗證http://192.168.1.11:8080/

Docker swarm搭建(1)

如果訪問不到網頁,需開啓路由轉發

[root@docker01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf 
[root@docker01 ~]# sysctl -p

九. 創建service(服務)

1. 基於nginx容器創建一個service服務

[root@docker01 ~]#docker pull nginx
//下載nginx鏡像(三臺都要)
[root@docker01 ~]# docker service create --replicas 1 --network  docker --name web1 -p 80:80 nginx:latest 
[root@docker01 ~]# docker service create --replicas 1 --network  docker --name web2 -p 80 nginx:latest 

//--replicas:副本數量

大概可以理解爲一個副本等於一個容器

2. 查看創建的service服務

[root@docker01 ~]# docker service ls

Docker swarm搭建(1)

單獨查看一個servicefuw
[root@docker01 ~]# docker service  ps web1

Docker swarm搭建(1)

[root@docker01 ~]# docker service  ps web2

Docker swarm搭建(1)

3. web界面查看

Docker swarm搭建(1)

4. 基於nginx容器創建五個service服務

[root@docker01 ~]# docker service create --replicas 5 --network  docker --name web -p 80 nginx:latest 
web界面查看

Docker swarm搭建(1)

5. 掛起docker02

web查看(發現服務都分配到其他服務器了)

Docker swarm搭建(1)

6. 恢復docker02

web查看(發現服務沒有回到docker02)

Docker swarm搭建(1)

十、實現docker容器的擴容及縮容

1. 刪除web1和web2服務

[root@docker01 ~]# docker service rm web1 web2

2. 容器的擴容和縮減

(1)擴容

[root@docker01 ~]# docker service scale web=8

Docker swarm搭建(1)

(2)縮減

[root@docker01 ~]# docker service scale web=3

Docker swarm搭建(1)

3.設置manager node不參加工作

[root@docker01 ~]# docker node update docker01 --availability drain

設置主機docker01以後不運行容器,但已經運行的容器並不會停止
“--availability”選項後面共有三個選項可配置,如下:
“active”:工作;“pause”:暫時不工作;“drain”:永久性的不工作

[root@docker01 ~]# docker node ls

Docker swarm搭建(1)

web界面查看

Docker swarm搭建(1)

十一、docker Swarm總結

在我對docker Swarm羣集進行一定了解後,得出的結論如下:

  • 參與羣集的主機名一定不能衝突,並且可以互相解析對方的主機名;
  • 集羣內的所有節點可以都是manager角色,但是不可以都是worker角色;
  • 當指定運行的鏡像時,如果羣集中的節點本地沒有該鏡像,那麼它將會自動下載對應的鏡像;
  • 當羣集正常工作時,若一個運行着容器的docker服務器發生宕機,那麼,其所運行的所有容器,都將轉移到其他正常運行的節點之上,而且,就算髮生宕機的服務器恢復正常運行,也不會再接管之前運行的容器;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章