docker swarm 创建集群

默北 容器docker swarm 创建集群已关闭评论9,404字数 4683阅读15分36秒阅读模式

创建集群

当运行命令创建集群时,Docker Engine将以集群模式运行。

运行docker swarm init 在当前节点上创建一个单节点集群。设置集群如下:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

  • 将当前节点切换到集群模式
  • 创建一个名为default的集群
  • 将当前节点指定为集群的领导管理节点
  • 使用主机名命名节点
  • 配置管理者监听端口2377在活动的网络接口上
  • 设置当前节点为Active状态,意味着可以从调度器接收任务
  • 为参入集群的引擎启动内部分布式数据存储,来保持集群及其上运行的所有服务的一致性
  • 默认情况下,为集群生成一个自签跟CA
  • 默认情况下,为加入到集群的worker和manager节点生成一个令牌
  • 创建一个名为ingress网络用于发布集群服务端口到外部

docker swarm init 命令输出了将新节点加入到集群的连接命令:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

 
 $ docker swarm init
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.

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

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

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

配置宣告地址

管理节点使用宣告地址来运行集群中其它节点访问Swarmkit API和overlay网络。集群的其它节点必须能访问管理节点的宣告地址。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

如果没有指定地址,Docker将检查系统是否有单个IP地址,如果有,Docker默认使用这个IP地址来监听2377端口。如果有多个IP地址,必须明确指定--advertise-addr来启用管理者间通信和overlay网络。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

$ docker swarm init --advertise-addr <MANAGER-IP>

查看加入命令或者更新加入token

节点需要一个令牌来加入到集群。工作节点和管理节点的令牌是不同的。节点在加入集群时使用令牌。在节点加入到集群后,更新令牌不会影响集群成员资格。更新令牌可确保新加入的集群的节点无法使用旧的令牌。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

查看工作节点加入集群命令和令牌:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

$ docker swarm join-token worker

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

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

This node joined a swarm as a worker.

查看管理节点加入集群命令和令牌:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

$ docker swarm join-token manager

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

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

执行docker swarm join-token --rotate 命令来为worker或者manager节点生成一个新的令牌。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

$docker swarm join-token  --rotate worker

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

    docker swarm join \
    --token SWMTKN-1-2kscvs0zuymrsc9t0ocyy1rdns9dhaodvpl639j2bqx55uptag-ebmn5u927reawo27s3azntd44 \
    172.17.0.2:2377

加入节点到集群

  • 添加工作节点会增加容量。当将服务部署到集群时,引擎调度任务到可用节点上,不管是工作节点还是管理节点。当工作节点加入到集群时,可扩展集群处理任务规模不会影响管理者raft使用。
  • 管理节点增加容错能力。管理节点执行集群编排和管理功能。在所有管理节点中,会选择出一个领导者,来执行编排任务。当该领导者故障了,其余的管理节点选择出一个新的领导者,并恢复对集群状态的编排和管理。默认情况下,管理节点也运行任务。

加入工作节点

$ docker swarm join \
  --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
  192.168.99.100:2377

This node joined a swarm as a worker.

docker swarm join命令执行以下操作:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

  • 将当前节点上Docker Engine切换成集群模式
  • 从管理者请求一个TLS证书
  • 使用主机名命名节点
  • 基于集群令牌将当前节点加入到管理者监听的集群中
  • 设置当前节点状态为Active,意味着可以从调度器接收任务
  • 将ingress网络扩展到当前节点

加入管理节点

加入操作过程与worker相同。新加入的管理节点也参入raft共识,现有的领导者仍然是集群领导者。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

Docker建议每个集群使用三个或者五个管理节点来实现高可用性。由于集群管理节点使用Raft共享数据,因此必须是奇数个管理节点。只要有一半以上的管理节点可用,集群才可以继续运行。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

$ docker swarm join \
  --token SWMTKN-1-61ztec5kyafptydic6jfc1i33t37flcl4nuipzcusor96k7kby-5vy9t8u35tuqm7vh67lrz9xp6 \
  192.168.99.100:2377

This node joined a swarm as a manager.

在集群中管理节点

列出节点

在管理节点上执行docker node ls命令:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

$ docker node ls

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
46aqrk4e473hjbt745z53cr3t    node-5    Ready   Active        Reachable
61pi3d91s0w3b90ijw3deeb2q    node-4    Ready   Active        Reachable
a5b2m3oghd48m8eu391pefq5u    node-3    Ready   Active
e7p8btxeu3ioshyuj6lxiv6g0    node-2    Ready   Active
ehkv3bcimagdese79dn78otj5 *  node-1    Ready   Active        Leader

AVAILABILITY列显示调度器是否可以将任务分配给该节点:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

  • Active 调度器可以分配任务给该节点
  • Pause 调度器不会向该节点分配新的任务,但是现有任务仍然运行
  • Drain 调度器不会向该节点分配新的任务,同事,关闭现有任务,并在其他可用节点上运行他们

MANAGER STATUS列显示节点参入Raft共识:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

  • 空值 表示是工作节点,不参入集群管理
  • Leader 主管理节点对集群进行所有管理和编排
  • Reachable 参入raft共识,如果领导者不可用,有资格被选举为新的领导者
  • Unavailable 该管理节点无法与其它管理者通信。如果管理节点变为不可用,你要么新加入一个管理节点到集群,要么将一个工作节点提升为管理节点

查看单个节点

在管理节点上执行docker node inspect 命令查看单个节点详细信息。默认输出json格式,可使用--pretty人性化格式打印结果。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

$ docker node inspect self --pretty

ID:                     ehkv3bcimagdese79dn78otj5
Hostname:               node-1
Joined at:              2016-06-16 22:52:44.9910662 +0000 utc
Status:
 State:                 Ready
 Availability:          Active
Manager Status:
 Address:               172.17.0.2:2377
 Raft Status:           Reachable
 Leader:                Yes
Platform:
 Operating System:      linux
 Architecture:          x86_64
Resources:
 CPUs:                  2
 Memory:                1.954 GiB
Plugins:
  Network:              overlay, host, bridge, overlay, null
  Volume:               local
Engine Version:         1.12.0-dev

更新节点

可以修改节点属性:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

  • 改变节点可用性
  • 添加或者删除标签元数据
  • 改变节点角色

更改节点可用性

  • drain管理节点使其只关注与集群管理任务,不用于任务的分配
  • drain节点使其下线维护
  • pause节点使其不接收新的任务
  • 恢复unavailable或者pause节点到可用状态

更改管理节点为Drain状态:文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

$ docker node update --availability drain node-1

node-1

添加或者删除标签元数据

节点标签提供了节点组织的灵活方法。还可以在服务约束中使用节点标签。在创建服务时,将任务限制在满足标签的节点上。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

在管理节点上执行docker node update --label-add命令来为节点添加标签。--label-add 支持 或者 = 对。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

$ docker node update --label-add foo --label-add bar=baz node-1

node-1

升级或者降级节点

可以将工作节点升级为管理节点。也可以将管理节点降级为工作节点。文章源自运维生存时间-https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/

不管如果升级或者降级,都必须确保集群内法定人数的管理节点。

在管理节点上操作:

$ docker node promote node-3 node-2

Node node-3 promoted to a manager in the swarm.
Node node-2 promoted to a manager in the swarm.

$ docker node demote node-3 node-2

Manager node-3 demoted in the swarm.
Manager node-2 demoted in the swarm.

docker node promote 和 docker node demote 命令可以分别使用 docker node update --role manager 和 docker node update --role worker 来代替。

退出集群

在节点上运行docker swarm leave命令将其从群集中删除。

 $ docker swarm leave

Node left the swarm.

当一个节点离开群集时,Docker Engine停止在群集模式下运行。协调者不再将任务调度到节点。

如果节点是管理节点,将收到关于维护法定人数的警告。要忽略该警告使用--force。如果最后一个管理节点退出集群,集群将变得不可用了。需要采取灾难恢复措施了。

节点退出集群后,可以在管理节点上执行docker node rm命令,从节点列表中删除该节点。

$ docker node rm node-2
weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
默北
  • 本文由 发表于 20/05/2017 01:01:28
  • 转载请务必保留本文链接:https://www.ttlsa.com/docker/docker-swarm-how-to-deploy/