前言:
Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排項目,但不同的是,Docker Compose 是一個在單個服務器或主機上創建多個容器的工具,而 Docker Swarm 則可以在多個服務器或主機上創建容器集羣服務,對於微服務的部署,顯然 Docker Swarm 會更加適合。
從 Docker 1.12.0 版本開始,Docker Swarm 已經包含在 Docker 引擎中(docker swarm),並且已經內置了服務發現工具,我們就不需要像之前一樣,再配置 Etcd 或者 Consul 來進行服務發現配置了。
Docker Swarm集羣中有三個角色:manager(管理者);worker(實際工作者)以及service(服務)。
在上面的三個角色中,其本質上與我們公司的組織架構類似,有領導(manager),有搬磚的(worker),而領導下發給搬磚者的任務,就是Docker Swarm中的service(服務)。
需要注意的是,在一個Docker Swarm羣集中,每臺docker服務器的角色可以都是manager,但是,不可以都是worker,也就是說,不可以羣龍無首,並且,參與羣集的所有主機名,千萬不可以衝突。
Docker Swarm規劃
Docker安裝
[root@k8s-master01 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@k8s-master01 ~]# mv docker-ce.repo /etc/yum.repos.d/
[root@k8s-master01 ~]# yum install -y docker-ce
[root@k8s-master01 ~]# systemctl daemon-reload
[root@k8s-master01 ~]# systemctl start docker
設置互通和開放iptables訪問(三臺都執行)
[root@k8s-master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub k8s-master01:
[root@k8s-master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub k8s-node03:
[root@k8s-master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub k8s-node02:
[root@k8s-master01 ~]# iptables -A INPUT -p tcp -s 192.168.1.29 -j ACCEPT
[root@k8s-master01 ~]# iptables -A INPUT -p tcp -s 192.168.1.101 -j ACCEPT
設置集羣
設置k8s-master01爲manage節點
[root@k8s-master01 ~]# docker swarm init --advertise-addr 192.168.1.23
配置node節點加入Swarm節點
升級節點爲manager
[root@k8s-node02 ~]# docker node promote k8s-node02 #將k8s-node02從worker升級爲manager
若docker02或者docker03要脫離這個羣集 (k8s-node03節點爲例子)
[root@k8s-node03 .ssh]# docker swarm leave #在k8s-node03上執行此命令
Node left the swarm.
[root@k8s-master01 ~]# docker node rm k8s-node03 #然後manager節點移除k8s-node03
[root@k8s-master01 ~]# docker swarm leave -f #若是最後一個manager上進行刪除羣集,則需要加“-f”選項
#最後一個刪除後,這個羣集也就不存在了
Docker Swarm常用命令
[root@k8s-master01 ~]# docker node ls ####查看節點數量
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
zdtrj1duj7rz2m0a0w4bh3kww * k8s-master01 Ready Active Leader 19.03.4
nnc6df9g6gzwpstjspdvrvl5u k8s-node02 Ready Active 19.03.3-rc1
vkxwfe025vp3m3dxyphkfc0u6 k8s-node03 Ready Active 19.03.4
[root@k8s-master01 ~]# docker service ls #查看service服務
[root@k8s-master01 ~]# docker swarm join-token worker #如果後期需要加入worker端,可以執行此命令查看令牌(也就是加入時需要執行的命令)
[root@k8s-master01 ~]# docker swarm join-token manager #同上,若要加入manager端,則可以執行這條命令查看令牌。
[root@k8s-master01 ~]# docker service scale nginx=3 #容器的動態擴容及縮容
[root@k8s-master01 ~]# docker service ps nginx #查看創建的容器運行在哪些節點
[root@k8s-master01 ~]# docker service ls #查看創建的服務
[root@k8s-master01 ~]# docker service rm helloworld #刪除服務
[root@k8s-master01 ~]#docker service inspect helloworld #查看服務信息
#將docker03脫離這個羣集
[root@k8s-master01 ~]# docker swarm leave #k8s-node02脫離這個羣集
[root@k8s-master01 ~]# docker node rm k8s-node02 #然後在manager角色的服務器上移除k8s-node02
[root@k8s-master01 ~]#docker node promote k8s-node02 #將k8s-node02從worker升級爲manager。
#升級後docker02狀態會爲Reachable
[root@k8s-master01 ~]# docker node demote k8s-node02 #將k8s-node02從manager角色降級爲worker
[root@k8s-master01 ~]# docker node update --availability drain k8s-node02 #設置主機k8s-node02以後不運行容器,但已經運行的容器並不會停止
搭建Docker Swarm的WEB界面
[root@k8s-master01 ~]# docker run -d -p 8000:8080 -e HOST=172.168.1.3 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
搭建service服務
[root@k8s-master01 ~]# docker service create --replicas 1 --name helloworld alpine ping docker.com
[root@k8s-master01 ~]# docker service ls #查看服務
ID NAME MODE REPLICAS IMAGE PORTS
le5fusj4rses helloworld replicated 1/1 alpine:latest
[root@k8s-master01 ~]# docker service inspect --pretty helloworld
ID: le5fusj4rsesv6d4ywxwrvwno
Name: helloworld
Service Mode: Replicated
Replicas: 1
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Update order: stop-first
RollbackConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Rollback order: stop-first
ContainerSpec:
Image: alpine:latest@sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Args: ping docker.com
Init: false
Resources:
Endpoint Mode: vip
此時服務運行在集羣的這臺機器,我們擴展下,使他運行到work兩臺上
[root@k8s-master01 ~]# docker service scale helloworld=3 #擴縮容器 只需要修改 helloword=#數字即可
.
然後你可以到各個worker查看 docker ps -a查看
設置特定worker不運行容器
在上述的配置中,若運行指定數量的容器,那麼將是羣集中的所有docker主機進行輪詢的方式運行,直到運行夠指定的容器數量,那麼,如果不想讓k8s-master01這個manager角色運行容器呢?可以進行以下配置:
[root@k8s-master01 ~]# docker node update --availability drain k8s-master01 #
k8s-master01
#設置主機k8s-master01以後不運行容器,但已經運行的容器並不會停止
# “--availability”選項後面共有三個選項可配置,如下:
# “active”:工作;“pause”:暫時不工作;“drain”:永久性的不工作
在擴容查看
[root@k8s-master01 ~]# docker service scale helloworld=6
創建一個nginx服務
[root@k8s-master01 ~]# docker service create --replicas 2 --name nginx15 -p 80 192.168.1.23:5000/nginx:1.15
[root@k8s-master01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
le5fusj4rses helloworld replicated 6/6 alpine:latest
tw7s5ps953lm nginx15 replicated 2/2 192.168.1.23:5000/nginx:1.15 *:30001->80/tcp
發現k8s-master是不運行任務的
Docker swarm集羣節點路由網絡
swarm可以輕鬆的發佈服務和端口,所有節點都參與入口的路由網絡,路由網絡能夠使得集羣中每個節點都能夠接受已經發布端口上的任何服務。即使在節點上沒有運行任何服務,也可以在集羣中運行任何服務。路由網絡將所有傳入請求路由到可用節點上,也就是存活的容器上。
[root@k8s-master01 ~]# docker service create --replicas 2 --name nginx --publish 8081:80 192.168.1.23:5000/nginx:1.15
[root@k8s-master01 ~]# curl http://192.168.1.29:8081
[root@k8s-master01 ~]# curl http://192.168.1.101:8081