侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

Docker Swarm 集群基本使用

barwe
2023-06-07 / 0 评论 / 0 点赞 / 957 阅读 / 3,747 字
温馨提示:
本文最后更新于 2023-06-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

多主机

在没有多个物理主机的情况下我们可以使用 docker-machine 启动多态虚拟主机(参考 Docker Machine 的安装和使用)。

启动主管理节点

在管理节点启动 Swarm 集群:

$ docker-machine ssh m0
$ docker swarm init --advertise-addr 192.168.56.102                                                                                                         
Swarm initialized: current node (w3mcx5az7hle83x54myigl8ej) is now a manager.

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

    docker swarm join --token SWMTKN-1-16os6vw7xyxsru81wdq46dh33e1ypbgvikaxiqxivngyq7wkfz-0d77s470esvona8tvedyy66uw 192.168.56.102:2377

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

这里我们是将虚拟机 m0 作为了主管理节点。我们还可以将宿主机添加为管理节点:

# 在 m0 执行
$ $ docker swarm join-token manager                                                                                                                                 
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-16os6vw7xyxsru81wdq46dh33e1ypbgvikaxiqxivngyq7wkfz-44j3lbw94vmhzjwr8g65opuoi 192.168.56.102:2377
    
# 在宿主机执行
$ docker swarm join --token SWMTKN-1-16os6vw7xyxsru81wdq46dh33e1ypbgvikaxiqxivngyq7wkfz-44j3lbw94vmhzjwr8g65opuoi 192.168.56.102:2377
This node joined a swarm as a manager.

检查集群信息:

$ docker info
...
Swarm: active
  NodeID: emjyva9udrhuet3eof6f57mvu
  Is Manager: true
  ClusterID: ec1rip1hudoepr4g8tvhi7zne
  Managers: 2
  Nodes: 5
  Default Address Pool: 10.0.0.0/8  
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
  Raft:
   Snapshot Interval: 10000
   Number of Old Snapshots to Retain: 0
   Heartbeat Tick: 1
   Election Tick: 10
  Dispatcher:
   Heartbeat Period: 5 seconds
  CA Configuration:
   Expiry Duration: 3 months
   Force Rotate: 0
  Autolock Managers: false
  Root Rotation In Progress: false
  Node Address: 192.168.56.1
  Manager Addresses:
   192.168.56.102:2377
   192.168.56.1:2377
...

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
emjyva9udrhuet3eof6f57mvu *   barwe-deepin        Ready               Active              Reachable           19.03.8
pxnrxz35fkwx4opftt6qesl5d     c0                  Ready               Active                                  19.03.12
wgx447gnd1y10qmqruqv8h7wb     c1                  Ready               Active                                  19.03.12
xmqom69sj40gteu25i14oq4mv     c2                  Ready               Active                                  19.03.12
w3mcx5az7hle83x54myigl8ej     m0                  Ready               Active              Leader              19.03.12

可以看到我们的宿主机在集群中的地址是 192.168.56.1,这与我们创建虚拟机时使用的虚拟网关地址是一致的。

也就是说,对于集群所在的子网来说,我们的宿主机不仅仅是一个节点,也相当于网关。

启动工作节点

将工作节点加入 Swarm 集群(以 c0 为例):

$ docker-machine ssh c0
$ docker swarm join --token SWMTKN-1-16os6vw7xyxsru81wdq46dh33e1ypbgvikaxiqxivngyq7wkfz-0d77s470esvona8tvedyy66uw 192.168.56.102:2377
This node joined a swarm as a worker.

检查集群和节点

查看 Swarm 集群:

$ docker-machine ssh m0 # 任意管理节点均可
$ docker info
...
Swarm: active								# swarm 集群处于激活状态
  NodeID: w3mcx5az7hle83x54myigl8ej
  Is Manager: true
  ClusterID: ec1rip1hudoepr4g8tvhi7zne
  Managers: 1								# 管理节点数量
  Nodes: 4									# 节点总数(管理节点 + 工作节点)
  Default Address Pool: 10.0.0.0/8  
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
  Raft:
   Snapshot Interval: 10000
   Number of Old Snapshots to Retain: 0
   Heartbeat Tick: 1
   Election Tick: 10
  Dispatcher:
   Heartbeat Period: 5 seconds
  CA Configuration:
   Expiry Duration: 3 months
   Force Rotate: 0
  Autolock Managers: false
  Root Rotation In Progress: false
  Node Address: 192.168.56.102				# 当前(管理)节点地址
  Manager Addresses:
   192.168.56.102:2377
...

在任意管理节点可查看集群节点:

$ docker node ls                                                                                                                                            
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
pxnrxz35fkwx4opftt6qesl5d     c0                  Ready               Active                                  19.03.12
wgx447gnd1y10qmqruqv8h7wb     c1                  Ready               Active                                  19.03.12
xmqom69sj40gteu25i14oq4mv     c2                  Ready               Active                                  19.03.12
w3mcx5az7hle83x54myigl8ej *   m0                  Ready               Active              Leader              19.03.12

MANAGER STATUS

  • 没有值:工作节点
  • Leader: 管理节点中的老大,负责该集群的集群管理和编排决策
  • Reachable: 其他管理节点,当老大挂掉之后会从这些节点中选出新的老大
  • Unavailable: 不可用的管理节点,管理员应该手动检查并处理这个节点(管理员:小老弟你怎么肥四?)

AVAILABILITY

  • Active: 该节点可以正常执行任务
  • Pause: 该节点不会接受新的任务,但是正在运行的任务仍然可以继续运行
  • Drain: 该节点不再接受新的任务,正在运行的任务也会被停止,然后转移到其他可用的节点上

删除节点

删除管理节点

删除之前先迁移该节点上的服务:

docker node update --availability drain 节点名称|节点ID

降级节点:

docker node demote 节点名称|节点ID

在降完级后的工作节点中执行命令离开集群:

docker swarm leave

回到管理节点中删除该节点:

docker node rm 节点名称|节点ID

删除工作节点

同样先迁移服务:

docker node update --availability drain 节点名称|节点ID

然后主动离开集群:

docker swarm leave

最后在管理节点中删除该节点:

docker node rm 节点名称|节点ID

服务管理

创建服务

docker service create --replicas 1 --name mynginx -p 80:80 nginx
  • --replicas: 该服务需要运行多少个实例(一个实例就是一个任务)
  • --name: 服务名称

查看服务

查看运行的所有服务:

docker service ls

查看某个服务的详细信息:

docker service ps xxx

弹性服务

增加或者减少实例数量:

# 将 xxx 服务实例数改成2,多退少补
docker service scale xxx=2
# 或者
# docker service update --replicas 2 xxx

删除服务

docker service rm xxx
0

评论区