Dcker Swarem集群

151 阅读7分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

Docker Swarm概述

Docker Swarm是一个用于创建和管理Docker集群的工具,开发者可以不用安装额外的软件包,只需使用简单的命令就可以创建并管理Docker Swarm集群。

Docker Swarm集群主要特点:

  • 方便创建和管理集群

    Docker Swarm是Docker源生的集群管理工具,可以直接使用Docker客户端来创建并管理一个Docker Swarm集群,然后在其中部署应用程序服务,而不需要额外的编配软件来创建或管理集群

  • 可扩展

    对于集群中的每个服务,都可以声明要运行的副本任务数量,当向上或向下进行扩展时,集群管理器将通过添加或删除副本任务来自动适应所需的状态

  • 可实现期望的状态调节

    集群管理器节点不断监视集群状态,并协调实际状态和所期望状态之间的任何差异。例如,如果启动一个服务的10个副本任务,当一个Docker节点承载其中两个副本崩溃时,那么管理器将创建两个新的副本来替换崩溃的副本

  • 集群中多主机网络自动扩展管理

    Docker Swarm为集群提供了一个覆盖网络,当它初始化或更新应用程序时,集群管理器会自动将在工作节点创建或更新网络来管理服务

  • 提供服务发现功能

    集群管理器节点为集群中每个服务分配一个唯一的DNS名称,通过Docker Swarm集群提供的负载均衡功能,可以通过嵌入在集群中的DNS服务器来查询集群中运行的每个容器

  • 可实现负载均衡

    可以将容器中服务的端口暴露给外部负载均衡器,而在内部,集群允许指定如何在节点之间分配服务容器

  • 安全性强

    集群中的每个节点强制使用TLS相互认证和加密,以确保自身和其他节点之间的通信安全。除此之外,集群还支持使用自定义的自签名证书来保护安全

  • 支持延迟更新和服务回滚

    在进行服务更新时,可以将服务更新逐步延伸到每个节点上,集群管理器允许服务部署到不同节点组之间时出现延迟,如果某个节点出现问题,还可以将服务回滚到以前的版本

Docker Swarm使用

环境搭建

  • 准备用于搭建集群的3个Linux系统主机,每台主机上都需要安装Docker并可以连接网络,同时要求Docker版本都必须是1.12及以上

  • 集群管理节点Linux主机IP地址必须固定,集群中的所有节点都能够访问该管理节点

  • 集群节点之间必须使用相应的协议并保证其以下端口可用:

    • 用于集群管理通信的TCP端口2377
    • TCP和UDP端口7946,用于节点间的通信
    • UDP端口4789,用于覆盖网络流量

现准备三台主机,其主机名称与对应IP地址如下

manager:192.168.130.130         # 管理节点
worker1:192.168.130.131         # 工作节点1
worker2:192.168.130.134         # 工作节点2

创建Docker Swarm集群

在manager主机上创建Swarm集群,执行如下指令:

docker swarm init --advertise-addr 192.168.130.130

指令执行完成后,Docker会自动在IP为192.168.130.130的主机上创建一个Swarm集群,并将该IP地址的机器设置为集群管理节点。如果只是测试单节点的集群,直接使用docker swarm init指令即可。指令执行成功结果如下:

202208220926516.png

图中的两条指令分别是添加工作节点和管理节点时使用的

在管理节点上可以使用如下命令查看集群节点信息

docker node ls

添加工作节点

启动另外两台主机,并在终端中执行加入工作节点的指令,即上图中第一条指令:

docker swarm join --token SWMTKN-1-2lnf3s2bbp9nwtu3oa9zprtzndrjmj8vi8i7tmyagfyvnhtwzc-ddihsajkxpftvr6vffwteeiea 192.168.130.130:2377
  • --token:表示向指定集群中加入工作节点的认证信息

如果忘记添加到集群的指令,可以使用如下命令进行查看

docker swarm join-token worker

添加完成节点后,在集群管理节点查看集群节点信息,就可以看到新添加的工作节点

部署服务

向Docker Swarm集群中部署服务时,既可以使用Docker Hub上自带的镜像来启动服务,也可以使用自己通过Dockerfile构建的镜像来启动服务,但在这之前必须先将镜像推送到Docker Hub仓库。

在这里使用Docker Hub上自带的alpine镜像为例来部署集群服务,操作指令如下:

docker service create --replicas 1 --name helloword alpine ping docker.com
  • docker service create:用于在Swarm集群中创建服务的指令
  • --replicas:指定了该服务的副本实例数量
  • --name:指定创建成功后的服务名称
  • ping docker.com:表示服务启动后执行的命令

查看集群中的服务

服务部署完成后,在管理节点上可以通过如下命令查看当前集群中的服务列表信息:

docker service ls

还可以使用如下命令查看某个服务的具体详情:

docker service inspect helloword

还可以使用如下命令查看指定服务在集群节点上的分配和运行情况:

docker service ps helloword

更改集群服务副本数量

在管理节点上,更改服务副本数量的指令如下:

docker service scale helloword=5

202208221927358.png

在集群环境下,服务副本是随机均衡分配到不同节点上的。另外,有些镜像较大,所以其他工作节点在拉取镜像运行服务实例时可能需要一定时间,这时该服务副本就会处于preparing状态

删除服务

对于不需要的服务,可以使用如下命令进行删除:

docker service rm helloword

在集群管理节点上执行删除服务命令后,该服务就会在集群中彻底删除。但在执行删除服务命令后,在集群中有该服务副本运行的节点上,这些服务副本仍需要一定的时间清除,此时可以使用docker ps查看具体清除情况。

访问服务

前面部署的服务没有向外界暴露服务端口,外界也无法正常访问。接下来通过自定义overlay驱动网络对集群进行网络管理和服务访问。

在集群管理节点查看当前网络列表,可以发现与在非集群环境下的网络列表对比多了一个overlay驱动的网络。

在集群中发布服务时,如果没有指定网络,那么默认是使用名为ingress网络连接的,而在实际开发中,则会使用自定义的overlay网络进行服务管理。

在集群管理节点上创建以overlay为驱动的自定义网络:

docker network create -d overlay my-net

然后指定新建的网络再次部署服务:

docker service create --network my-net --name my-web --publish 8080:80 --replicas 2 nginx
  • --network:指定使用的网络
  • --name:服务启动后的名称
  • --publish:可简写为-p,用于映射服务端口
  • --replicas:指定服务副本数量
  • nginx:基础镜像

服务启动成功后,可以在管理节点上查看服务副本运行分配情况。

这时就可以通过主机的” IP+端口号 “对部署的服务进行访问了,并且在任意节点上访问服务时,都可以正常的访问部署的服务,前提是服务部署在同一网络中。这是由于集群负载均衡器将请求路由到一个活动容器,从而实现容器内部服务的正常访问,这也体现出了Docker Swarm负载均衡的特点。