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,也就是說,不能夠羣龍無首,而且,參與羣集的全部主機名,千萬不能夠衝突。
[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
[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
[root@k8s-node02 ~]# docker node promote k8s-node02 #將k8s-node02從worker升級爲manager
[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」選項 #最後一個刪除後,這個羣集也就不存在了
[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之後不運行容器,但已經運行的容器並不會中止
[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
[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查看
在上述的配置中,若運行指定數量的容器,那麼將是羣集中的全部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
[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是不運行任務的
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:8081node