docker swarm练手

来源:互联网 发布:网络投保车险 编辑:程序博客网 时间:2024/06/06 21:15

swarm就不多说了,官网有介绍

https://docs.docker.com/engine/swarm/

下面是我根据官网的做的一些笔记,供自己以后翻看,大神勿喷

1、创建swarm
[root@server ~]# docker swarm init --listen-addr 192.168.1.7:2377


2、在node上添加worker和manager
[root@node1 ~]# docker swarm join \
    --token SWMTKN-1-0pzork4xouglxzu1yismyz6uckgb3dlcttec1xbchhu787cj5u-8r1zi8eboxgq7xxlovw20hbsx \
    192.168.1.7:2377
在高可用环境下,我们得为集群添加至少三个(奇数个manager),MANAGER同样也能执行任务

上面的token只能添加worker节点,现在生成MANAGER的token
[root@server ~] docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-0pzork4xouglxzu1yismyz6uckgb3dlcttec1xbchhu787cj5u-4y1r9wn6c50n4i0915ylbrufz \
    192.168.1.7:2377


在其他节点上执行上面输出的命令就可以将节点添加为MANAGER角色,当主不可用时,参与投票,保证集群的高可用
原来是:


将另外两个节点以manager角色添加后:


关于 MANAGER STATUS的解释:
1、空:表示不参与群组管理的工作节点。---工作节点
2、leader:意味着节点是对集群进行所有群体管理和编排决策的主要管理器节点。---领导节点
3、reachable:意味着节点是参与投票的管理节点。 如果领导节点不可用,则该节点有资格被选为新的领导者。---备用领导节点
4、unavailable:意味着节点是无法与其他管理员通信的管理员。 如果管理员节点变得不可用,您应该将一个新的管理员节点加入群集,或者将一个工作节点提升为管理员。



3、创建服务
[root@server ~]# docker service create --replicas 2 --name helloworld alpine ping docker.com


4、查看你创建的服务
[root@server ~]# docker service ls
ID            NAME        MODE        REPLICAS  IMAGE
tfsglpoo1gdq  helloworld  replicated  2/2       alpine:latest


5、审查服务
[root@server ~]# docker service inspect --pretty helloworld
ID:        tfsglpoo1gdqihk1bzetnvzj1
Name:        helloworld
Service Mode:    Replicated
 Replicas:    2
Placement:
UpdateConfig:
 Parallelism:    1
 On failure:    pause
 Max failure ratio: 0
ContainerSpec:
 Image:        alpine:latest@sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4
 Args:        ping docker.com
Resources:
Endpoint Mode:    vip
[root@server ~]#


6、使用docker service ps <SERVICE-ID>查看服务运行在哪个节点上
[root@server ~]# docker service ps helloworld
ID            NAME              IMAGE          NODE            DESIRED STATE  CURRENT STATE          ERROR                      PORTS
ay4192cdqxvh  helloworld.1      alpine:latest  server          Running        Running 8 minutes ago                             
vku5p66pdlbv   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 8 minutes ago   "task: non-zero exit (1)" 
i5qz8vppvn6r   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 8 minutes ago   "task: non-zero exit (1)" 
fcp189dtgl19   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 9 minutes ago   "task: non-zero exit (1)" 
gipphcz9jqld   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 9 minutes ago   "task: non-zero exit (1)" 
sxsa8x3pe6x0  helloworld.2      alpine:latest  server          Running        Running 9 minutes ago                             
[root@server ~]#


7、扩展服务  Scale service
[root@server ~]# docker service scale helloworld=6
helloworld scaled to 6


[root@server ~]# docker service ps helloworld
ID            NAME              IMAGE          NODE            DESIRED STATE  CURRENT STATE           ERROR                      PORTS
ay4192cdqxvh  helloworld.1      alpine:latest  server          Running        Running 10 minutes ago                             
vku5p66pdlbv   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 10 minutes ago   "task: non-zero exit (1)" 
i5qz8vppvn6r   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 10 minutes ago   "task: non-zero exit (1)" 
fcp189dtgl19   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 10 minutes ago   "task: non-zero exit (1)" 
gipphcz9jqld   \_ helloworld.1  alpine:latest  viroyal-ubuntu  Shutdown       Failed 11 minutes ago   "task: non-zero exit (1)" 
sxsa8x3pe6x0  helloworld.2      alpine:latest  server          Running        Running 10 minutes ago                             
zwzokl53lj3l  helloworld.3      alpine:latest  server          Running        Running 17 seconds ago                             
ip0smw10aaqh  helloworld.4      alpine:latest  viroyal-ubuntu  Running        Running 10 seconds ago                             
qn8poyny1k4z  helloworld.5      alpine:latest  viroyal-ubuntu  Running        Running 9 seconds ago                             
jw51jivjuu31  helloworld.6      alpine:latest  viroyal-ubuntu  Running        Running 9 seconds ago


8、删除service
$docker service rm helloworld


9、滚动升级
$docker service create --replicas 3 --name redis --update-delay 10s --update-parallelism 1 redis:3.0.6

$docker service update --image redis:3.0.7 redis

--update-parallelism标签配置服务中同步升级的任务数量.
--update-delay标签配置一个服务任务或一系列任务升级的时延.


10、node下线

有些时候需要维护一个节点,此时此节点可能会网络断开或者需要关机,造成节点上服务可用。使用
docker node update --availability drain <NODE-ID>将节点下线,swarm会将当前节点上的容器关闭并在其他节点上启动。
当维护完成,需要上线时,将节点状态修改为active状态即可,命令如下:docker node update --availability active <NODE-ID>

11、在Swarm集群中创建overlay网络
docker network create \
   --driver overlay \
   --subnet 10.0.9.0/24 \
   my-network

   --subnet命令行参数指定overlay网络使用的子网网段。创建完成后使用docker network ls查看创建的网络:



将服务连接到overlay网络
在创建服务时可以通过--network参数将服务连接到某个网络:

docker service create \
   --replicas 3 \
   --name my-web \
   --network my-network \
   nginx


docker service inspect \
   --format='{{json .Endpoint.VirtualIPs}}' \
   my-web


加入my-network网络的容器彼此之间可以通过IP地址通信,也可以通过名称通信。

使用swarm模式的服务发现

默认情况下,当创建了一个服务并连接到某个网络后,swarm会为该服务分配一个VIP。此VIP根据服务名映射到DNS。在网络上的容器共享该服务的DNS映射,所以网络上的任意容器可以通过服务名访问服务。


在同一overlay网络中,不用通过端口映射来使某个服务可以被其它服务访问。Swarm内部的负载均衡器自动将请求发送到服务的VIP上,然后分发到所有的active的task上。
下面的实例展示了在同一个网络中添加了一个busybox服务,此服务可以通过名称my-web访问前面创建的nginx服务:

在manager节点上,部署一个busybox服务到与my-web服务相同的网络中,也就是my-network中:

docker service create \
   --name my-busybox \
   --network my-network \
   busybox \
   sleep 3000
3rdnz62u2n8d916d5zxbo9lax



https://andyyoung01.github.io/2016/11/26/%E5%9F%BA%E4%BA%8ESwarm%E7%9A%84%E5%A4%9A%E4%B8%BB%E6%9C%BA%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C/



12、检查集群manager和worker的状态

MANAGER节点:
docker node inspect server  --format "{{ .ManagerStatus.Reachability }}"


worker节点:
docker node inspect server  --format "{{ .Status.State }}"


我们这台服务器,既是manager,也是worker节点

如果MANAGER节点挂了,我们通过如下操作来恢复:
1、重启docker daemon
2、重启机器
3、如果以上都不行的话
     - 将其他的worker节点提升为manager
     - 清除当前失败的manager节点 
          docker node demote <NONE>
          docker node rm <id-node>



一个节点无法使用、无法响应,需要删除的时候,如果docker node rm报错


加上--force即可

docker node rm --force node9

13、备份swarm

数据目录
/var/lib/docker/swarm/

1、如果swarm开启了auto-lock,那么在恢复备份启动集群的时候,你需要秘钥
2、在manager上停止docker,然后备份,虽然可以热备,但是不建议这么做,可能会导致数据的不一致
3、备份/var/lib/docker/swarm/ 文件夹
4、重启manager

14、恢复swarm


1、关闭docker
2、删除/var/lib/docker/swarm下所有的文件
3、将备份的文件还原到此目录下
4、启动docker,并且重新初始化swarm,防止它作为node加入别的集群
docker swarm init --force-new-cluster
5、确认你的集群信息
     docker sercvice ls
6、如加锁,请解锁
7、加入manager和worker节点
8、恢复以前的备份方案


15、从失去投票中恢复

群组可以忍受多达(N-1)/ 2个永久性故障,超出了无法处理涉及群管理的请求。 例如,在有5名经理的群体中,至少3名必须运作并相互沟通。
这些类型的故障包括数据损坏或硬件故障。
如果你失去了经理的数量,你就不能管理这个群。如果您已经失去了法定人数,并尝试对群组执行任何管理操作,则会发生错误:
Error response from daemon: rpc error: code = 4 desc = context deadline exceeded
从失去法定人数恢复的最佳方法是将失败的节点重新联机。 如果不能这样做,则从此状态恢复的唯一方法是使用管理器节点的--force-new-cluster操作。 这将除去运行该命令的管理器之外的所有管理器。
实现法定人数是因为现在只有一名经理。 促进节点成为管理员,直到您拥有所需数量的管理员。

docker swarm init --force-new-cluster --advertise-addr node01:2377


16、强制swarm重新负载均衡

当您向群集添加新节点时,或者节点在不可用后重新连接到集群,集群不会自动向空闲节点分配任务。这是设计决定的。如果集群为了平衡而将任务定期地转移到不同的节点,则使用这些任务的客户端将被中断。目的是避免扰乱运行的服务,以便在整个群组中实现平衡。当新任务启动时,或当具有运行任务的节点变得不可用时,这些任务被赋予较不繁忙的节点。目标是最终平衡,最终对最终用户的影响最小。

在Docker 1.13及更高版本中,您可以使用-force或-f标志与docker service update命令强制服务在可用的工作节点之间重新分配其任务。这将导致服务任务重新启动。客户端应用程序可能会中断。如果您已配置,您的服务将使用滚动更新。


喜欢运维技术可以加这个群一起讨论devops技术  293342374
























0 0
原创粉丝点击