docker swarm 管理

默北 容器docker swarm 管理已关闭评论15,3286字数 10594阅读35分18秒阅读模式

安装docker

yum remove docker \
                  docker-common \
                  container-selinux \
                  docker-selinux \
                  docker-engine
  
yum install -y yum-utils

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    
yum install docker-ce

互通端口

  • tcp 2377 集群管理通信端口
  • tcp & udp 7946 节点间通信端口
  • udp 4789 overlay网络通信接口 如果创建overlay网络使用加密选项--opt-encrypted,还需要确保50端口放开。

创建swarm

# docker swarm init --advertise-addr 10.0.3.166
Swarm initialized: current node (hyimf345yidq9qncgcuco1uaw) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-4995ewf1uzw90qe5tfem7qtcw7nx7ebwx1klt7rk8lk374i44f-dj7xhstoc8nfqnefo815ytktq \
    10.0.3.166:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

--advertise-addr 指定管理节点发布的地址。集群中的其它节点必须要能够访问该IP。 输出的内容包含新节点加入集群的命令。节点做为管理者还是工作者取决于--token值。

# docker info    
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 17.03.1-ce
Storage Driver: overlay
 Backing Filesystem: extfs
 Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: active
 NodeID: hyimf345yidq9qncgcuco1uaw
 Is Manager: true
 ClusterID: lk5ddl5ncst0lu4ojdjyq5gbz
 Managers: 1
 Nodes: 1
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot Interval: 10000
  Number of Old Snapshots to Retain: 0
  Heartbeat Tick: 1
  Election Tick: 3
 Dispatcher:
  Heartbeat Period: 5 seconds
 CA Configuration:
  Expiry Duration: 3 months
 Node Address: 10.0.3.166
 Manager Addresses:
  10.0.3.166:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-514.10.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.702 GiB
Name: manager1
ID: EESP:4QLV:HO2G:HLDR:3PTL:PWSG:DY7N:FHYD:AMBT:2XMC:DFKT:KDFX
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
hyimf345yidq9qncgcuco1uaw *  manager1  Ready   Active        Leader

节点后面的ID表明当前连接到的节点。 Docker Engine swarm模式自动的将HOSTNAME指定为节点主机名。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

添加节点到swarm

一旦创建了管理节点,就可以添加工作节点了。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

# docker swarm join \
>     --token SWMTKN-1-4995ewf1uzw90qe5tfem7qtcw7nx7ebwx1klt7rk8lk374i44f-dj7xhstoc8nfqnefo815ytktq \
>     10.0.3.166:2377
This node joined a swarm as a worker.

列出集群中所有节点。MANAGER列标识集群中的管理节点。此列为空说明是工作节点。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

[root@manager1 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
30z2pjjx3hpnyn2mqozg314te    worker1   Ready   Active        
hyimf345yidq9qncgcuco1uaw *  manager1  Ready   Active        Leader

[root@worker2 ~]# docker swarm join \
>     --token SWMTKN-1-4995ewf1uzw90qe5tfem7qtcw7nx7ebwx1klt7rk8lk374i44f-dj7xhstoc8nfqnefo815ytktq \
>     10.0.3.166:2377
This node joined a swarm as a worker.

在非manager节点上执行docker node ls 报错文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

[root@worker1 ~]# docker node ls
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.

部署服务

[root@manager1 ~]# docker service create --replicas 1 --name helloworld alpine ping docker.com
oftt3pr3fqp040iqfmn2q514p

[root@manager1 ~]# docker service ls
ID            NAME        MODE        REPLICAS  IMAGE
oftt3pr3fqp0  helloworld  replicated  1/1       alpine:latest
  • docker service create 命令创建服务
  • --name 定义服务名称
  • --replicas 指定运行实例副本
  • 参数 alpine ping docker.com 定义服务为执行ping docker.com命令的Alpine Linux容器。

docker service ls 列出运行的服务。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

检查集群服务

查看运行服务的详细信息文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

[root@manager1 ~]# docker service inspect --pretty helloworld


ID:             oftt3pr3fqp040iqfmn2q514p
Name:           helloworld
Service Mode:   Replicated
 Replicas:      1
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@manager1 ~]# docker service ps helloworld
ID            NAME          IMAGE          NODE     DESIRED STATE  CURRENT STATE           ERROR  PORTS
w3rul33d1pss  helloworld.1  alpine:latest  worker1  Running        Running 52 seconds ago  


[root@worker1 ~]# docker ps
CONTAINER ID        IMAGE                                                                            COMMAND             CREATED              STATUS              PORTS               NAMES
636363ca51d5        alpine@sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4   "ping docker.com"   About a minute ago   Up About a minute                       helloworld.1.w3rul33d1psszwoti5u8hqyyb

[root@worker2 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@worker2 ~]# 

docker service ps 查看哪些节点运行了该服务。 docker ps 在运行该任务的节点上执行以查看该任务容器的详细信息。 docker node ps [NODE-HOSTNAME] 查看集群内节点运行的任务。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

缩放集群中服务

通过docker service scale =命令来扩展文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

[root@manager1 ~]# docker service scale helloworld=5
helloworld scaled to 5

[root@manager1 ~]# docker service ps helloworld
ID            NAME          IMAGE          NODE      DESIRED STATE  CURRENT STATE             ERROR  PORTS
w3rul33d1pss  helloworld.1  alpine:latest  worker1   Running        Running 3 minutes ago            
e4mwqwgyojxm  helloworld.2  alpine:latest  manager1  Running        Running 15 seconds ago           
zaypoj337tyj  helloworld.3  alpine:latest  worker2   Running        Preparing 15 seconds ago         
ws8jcrd2n0gf  helloworld.4  alpine:latest  worker2   Running        Preparing 15 seconds ago         
g5wbf5bi3tdc  helloworld.5  alpine:latest  worker1   Running        Running 15 seconds ago  
  • 集群创建了4个新的任务来扩展helloworld。任务分布在集群中的三个节点中,其中一个在manager1节点上。
  • 默认情况下管理节点也可以分配任务。可以设置管理节点为DRAIN,只用于管理,任务全分配到工作者节点上。
[root@manager1 ~]# docker ps
CONTAINER ID        IMAGE                                                                            COMMAND             CREATED             STATUS              PORTS               NAMES
9d405ab6fce8        alpine@sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4   "ping docker.com"   3 minutes ago       Up 3 minutes                            helloworld.2.e4mwqwgyojxmt1t0icsjxd49u

[root@worker1 ~]# docker ps
CONTAINER ID        IMAGE                                                                            COMMAND             CREATED             STATUS              PORTS               NAMES
66f13f0869fa        alpine@sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4   "ping docker.com"   4 minutes ago       Up 4 minutes                            helloworld.5.g5wbf5bi3tdca59nzvg66f7zv
636363ca51d5        alpine@sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4   "ping docker.com"   8 minutes ago       Up 8 minutes                            helloworld.1.w3rul33d1psszwoti5u8hqyyb

[root@worker2 ~]# docker ps
CONTAINER ID        IMAGE                                                                            COMMAND             CREATED             STATUS              PORTS               NAMES
2eae6a6d96cc        alpine@sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4   "ping docker.com"   4 minutes ago       Up 4 minutes                            helloworld.4.ws8jcrd2n0gf5zly0fm300kk7
24a2f3cc3c9a        alpine@sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4   "ping docker.com"   4 minutes ago       Up 4 minutes                            helloworld.3.zaypoj337tyjct6158rg9werk

删除服务

docker service rm helloworld

即使服务被删除,任务容器可能需要少许时间来清理这些容器。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

滚动更新服务

redis 3.0.6 升级为 3.0.7.文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

[root@manager1 ~]# docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6
ieycvblfdcd2dkrugawahmpw1

[root@manager1 ~]# docker service inspect --pretty redis

ID:             ieycvblfdcd2dkrugawahmpw1
Name:           redis
Service Mode:   Replicated
 Replicas:      3
Placement:
UpdateConfig:
 Parallelism:   1
 Delay:         10s
 On failure:    pause
 Max failure ratio: 0
ContainerSpec:
 Image:         redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842
Resources:
Endpoint Mode:  vip

[root@manager1 ~]# docker service update --image redis:3.0.7 redis
redis

[root@manager1 ~]# docker service inspect --pretty redis

ID:             ieycvblfdcd2dkrugawahmpw1
Name:           redis
Service Mode:   Replicated
 Replicas:      3
UpdateStatus:
 State:         paused
 Started:       58 seconds
 Message:       update paused due to failure or early termination of task f0jk6wc0ebuo8h2o8xrgyow4h
Placement:
UpdateConfig:
 Parallelism:   1
 Delay:         10s
 On failure:    pause
 Max failure ratio: 0
ContainerSpec:
 Image:         redis:3.0.7@sha256:29f740b256f47f413f4ba7a03c8fc800edda4e3439e0754974819d8dbcf4e986
Resources:
Endpoint Mode:  vip
  • 出现 Message: update paused due to failure or early termination of task f0jk6wc0ebuo8h2o8xrgyow4h 执行 docker service update

可以在服务部署时配置滚动更新策略:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

  • --update-delay 配置更新服务任务之间的延迟时间。数字加上时间单位,如10m10s标识10分钟10秒。
  • 默认情况下,更新调度一次更新一个任务。--update-parallelism来配置更新调度同时更新的最大服务任务数。
  • 默认情况下,当单个任务的更新返回RUNNING状况时,调度另一个任务更新,直至所有更新都完成为止。如果在更新期间,更新的任务返回FAILED,则暂停更新。可以通过--update-failure-action标志来控制Docker服务创建或更新的行为。
[root@manager1 ~]# docker service update redis
redis
[root@manager1 ~]# docker service inspect --pretty redis

ID:             ieycvblfdcd2dkrugawahmpw1
Name:           redis
Service Mode:   Replicated
 Replicas:      3
UpdateStatus:
 State:         updating
 Started:       3 seconds
 Message:       update in progress
Placement:
UpdateConfig:
 Parallelism:   1
 Delay:         10s
 On failure:    pause
 Max failure ratio: 0
ContainerSpec:
 Image:         redis:3.0.7@sha256:29f740b256f47f413f4ba7a03c8fc800edda4e3439e0754974819d8dbcf4e986
Resources:
Endpoint Mode:  vip


[root@manager1 ~]# docker service ps redis                        
ID            NAME         IMAGE        NODE      DESIRED STATE  CURRENT STATE                ERROR                             PORTS
pd8p88zn5xbr  redis.1      redis:3.0.7  worker2   Running        Running about a minute ago                                     
ms0dptzw9owe   \_ redis.1  redis:3.0.6  worker2   Shutdown       Shutdown about a minute ago                                    
vfq7q3amryps  redis.2      redis:3.0.7  worker1   Running        Running about a minute ago                                     
olpcxjjx0a5a   \_ redis.2  redis:3.0.7  worker1   Shutdown       Shutdown about a minute ago                                    
wces10o0jj73   \_ redis.2  redis:3.0.6  worker1   Shutdown       Shutdown 4 minutes ago                                         
9eexaufh8t77  redis.3      redis:3.0.7  worker2   Running        Running 2 minutes ago                                          
kgoi0zeei1ra   \_ redis.3  redis:3.0.7  manager1  Shutdown       Rejected 3 minutes ago       "No such image: redis@sha256:2…"  
f0jk6wc0ebuo   \_ redis.3  redis:3.0.7  manager1  Shutdown       Rejected 3 minutes ago       "No such image: redis@sha256:2…"  
11r7vfmp37fj   \_ redis.3  redis:3.0.7  manager1  Shutdown       Shutdown 3 minutes ago                                         
qvgarw9yudj9   \_ redis.3  redis:3.0.7  manager1  Shutdown       Rejected 3 minutes ago       "No such image: redis:3.0.7"    

默认情况下,调度应用滚动更新如下:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

  • 停止第一个任务
  • 调度已停止的任务更新
  • 启动已更新完成的容器
  • 如果更新任务返回RUNNING,等待指定的延迟时间,然后启动下一个任务。
  • 如果在更新期间,任务返回FAILED,更新将暂停。

移除集群上的某个节点

节点AVAILABILITY列为Active,表明该节点可以接收任务。 如果需要对某个节点进行维护,可以将该节点设置为DRAIN。DRAIN状态节点将阻止从管理节点接收新的任务,同时,管理节点将停止该节点上当前运行的任务,并在其它Active状态的节点上启动该任务副本。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/

[root@manager1 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
30z2pjjx3hpnyn2mqozg314te    worker1   Ready   Active        
hyimf345yidq9qncgcuco1uaw *  manager1  Ready   Active        Leader
jfrta08n3qm3edtdj51upmiqq    worker2   Ready   Active   


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

[root@manager1 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
30z2pjjx3hpnyn2mqozg314te    worker1   Ready   Drain         
hyimf345yidq9qncgcuco1uaw *  manager1  Ready   Active        Leader
jfrta08n3qm3edtdj51upmiqq    worker2   Ready   Active     

[root@manager1 ~]# docker node inspect --pretty worker1
ID:                     30z2pjjx3hpnyn2mqozg314te
Hostname:               worker1
Joined at:              2017-03-29 08:22:12.963602242 +0000 utc
Status:
 State:                 Ready
 Availability:          Drain
 Address:               10.0.2.53
Platform:
 Operating System:      linux
 Architecture:          x86_64
Resources:
 CPUs:                  1
 Memory:                992.6 MiB
Plugins:
  Network:              bridge, host, macvlan, null, overlay
  Volume:               local
Engine Version:         17.03.1-ce

[root@manager1 ~]# docker service ps redis | grep Running
pd8p88zn5xbr  redis.1      redis:3.0.7  worker2   Running        Running 8 minutes ago                                          
cqfdsa7v0eqh  redis.2      redis:3.0.7  manager1  Running        Running 47 seconds ago                                         
9eexaufh8t77  redis.3      redis:3.0.7  worker2   Running        Running 9 minutes ago   
[root@manager1 ~]# docker node update --availability active worker1
worker1

[root@manager1 ~]# docker node inspect --pretty worker1
ID:                     30z2pjjx3hpnyn2mqozg314te
Hostname:               worker1
Joined at:              2017-03-29 08:22:12.963602242 +0000 utc
Status:
 State:                 Ready
 Availability:          Active
 Address:               10.0.2.53
Platform:
 Operating System:      linux
 Architecture:          x86_64
Resources:
 CPUs:                  1
 Memory:                992.6 MiB
Plugins:
  Network:              bridge, host, macvlan, null, overlay
  Volume:               local
Engine Version:         17.03.1-ce

[root@manager1 ~]# docker service ps redis | grep Running
pd8p88zn5xbr  redis.1      redis:3.0.7  worker2   Running        Running 10 minutes ago                                     
cqfdsa7v0eqh  redis.2      redis:3.0.7  manager1  Running        Running 3 minutes ago                                      
9eexaufh8t77  redis.3      redis:3.0.7  worker2   Running        Running 12 minutes ago    
文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-manager/
weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
默北
  • 本文由 发表于 24/04/2017 14:08:02
  • 转载请务必保留本文链接:https://www.ttlsa.com/docker/docker-swarm-manager/