docker swarm

无人久伴 提交于 2020-10-28 20:39:23

详情参考:http://c.biancheng.net/view/3176.html

Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。

1.初始化一个全新的 Swarm

(1)登录到 mgr1 并初始化一个新的 Swarm

docker swarm init \
--advertise-addr 10.0.0.1:2377 \
--listen-addr 10.0.0.1:2377

docker swarm init 会通知 Docker 来初始化一个新的 Swarm,并将自身设置为第一个管理节点。同时也会使该节点开启 Swarm 模式。

--advertise-addr 指定其他节点用来连接到当前管理节点的 IP 和端口。这一属性是可选的,当节点上有多个 IP 时,可以用于指定使用哪个IP。此外,还可以用于指定一个节点上没有的 IP,比如一个负载均衡的 IP。

--listen-addr 指定用于承载 Swarm 流量的 IP 和端口。其设置通常与 --advertise-addr 相匹配,但是当节点上有多个 IP 的时候,可用于指定具体某个 IP。并且,如果 --advertise-addr 设置了一个远程 IP 地址(如负载均衡的IP地址),该属性也是需要设置的。建议执行命令时总是使用这两个属性来指定具体 IP 和端口。

Swarm 模式下的操作默认运行于 2337 端口。虽然它是可配置的,但 2377/tcp 是用于客户端与 Swarm 进行安全(HTTPS)通信的约定俗成的端口配置。

(2)列出 Swarm 中的节点。

docker node ls

(3)在 mgr1 上执行 docker swarm join-token命令用来获取添加新的工作节点和管理节点到 Swarm 的命令和 Token

(4)登录到 wrk1,并使用包含工作节点接入 Token 的 docker swarm join 命令将其接入 Swarm。

docker swarm join \
--token SWMTKN-1-0uahebax...c87tu8dx2c \
10.0.0.1:2377 \
--advertise-addr 10.0.0.4:2377 \
--listen-addr 10.0.0.4:2377

2.Swarm服务的部署及相关操作

(1)使用 docker service create 命令创建一个新的服务。

docker service create --name web-fe \
-p 8080:8080 \
--replicas 5 \
nigelpoulton/pluralsight-docker-ci

需要注意的是,该命令与熟悉的 docker container run 命令的许多参数是相同的。这个例子中,使用 --name 和 -p 定义服务的方式,与单机启动容器的定义方式是一样的。

通过上面的命令和输出可以看出。使用 docker service creale 命令告知 Docker 正在声明一个新服务,并传递 --name 参数将其命名为 web-fe。将每个节点上的 8080 端口映射到服务副本内部的 8080 端口。接下来,使用 --replicas 参数告知 Docker 应该总是有 5 个此服务的副本。最后,告知 Docker 哪个镜像用于副本,重要的是,要了解所有的服务副本使用相同的镜像和配置。

敲击回车键之后,主管理节点会在 Swarm 中实例化 5 个副本,管理节点也会作为工作节点运行。相关各工作节点或管理节点会拉取镜像,然后启动一个运行在 8080 端口上的容器。

这还没有结束。所有的服务都会被 Swarm 持续监控,Swarm 会在后台进行轮训检查(Reconciliation Loop),来持续比较服务的实际状态和期望状态是否一致。如果一致,则无须任何额外操作;如果不一致,Swarm 会使其一致。换句话说,Swarm 会一直确保实际状态能够满足期望状态的要求。

举例说明,假如运行有 web-fe 副本的某个工作节点宕机了,则 web-fe 的实际状态从 5 个副本降为 4 个,从而不能满足期望状态的要求。Docker 变回启动一个新的 web-fe 副本来使实际状态与期望状态保持一致。这一特性功能强大,使得服务在面对节点宕机等问题时具有自愈能力。

(2)使用 docker service ls 命令可以查看 Swarm 中所有运行中的服务

docker service ls

(3)执行 docker service ps 命令可以查看服务副本列表及各副本的状态。
docker service ps web-fe

(4)关于服务更为详细的信息可以使用 docker service inspect 命令查看

docker service inspect --pretty web-fe

以上例子使用了 --pretty 参数,限制输出中仅包含最感兴趣的内容,并以易于阅读的格式打印出来。
不加 --pretty 的话会给出更加详尽的输出。

(5)副本服务vs全局服务

服务的默认复制模式(Replication Mode)是副本模式(replicated)。

这种模式会部署期望数量的服务副本,并尽可能均匀地将各个副本分布在整个集群中。

另一种模式是全局模式(global),在这种模式下,每个节点上仅运行一个副本。可以通过给 docker service create 命令传递 --mode global 参数来部署一个全局服务。

(6)服务的扩缩容

假设业务呈爆发式增长,则 Web 前端服务接收到双倍的流量压力。所幸通过一个简单的 docker service scale 命令即可对 web-fe 服务进行扩容。

docker service scale web-fe=10

该命令会将服务副本数由 5 个增加到 10 个。后台会将服务的期望状态从 5 个增加到 10 个。
运行 docker service ls 命令来检查操作是否成功。

docker service scale web-fe=5
再次执行 docker service scale 命令将副本数从 10 个降为 5 个。

(7)删除服务

docker service rm web-fe

docker service rm 命令可用于删除之前部署的服务。

(8)滚动升级

对部署的应用进行滚动升级是常见的操作。长期以来,这一过程是令人痛苦的。我曾经牺牲了许多的周末时光来进行应用程序主版本的升级,而且再也不想这样做了。

然而,多亏了 Docker 服务,对一个设计良好的应用来说,实施滚动升级已经变得简单多了!

为了演示如何操作,下面将部署一个新的服务。但是在此之前,先创建一个新的覆盖网络(Overlay Network)给服务使用。

这并非必须的操作,只是希望能够让大家了解如何创建网络并将服务接入网络。

docker network create -d overlay uber-net

该命令会创建一个名为 uber-net 的覆盖网络,接下来会将其与要创建的服务结合使用。覆盖网络是一个二层网络,容器可以接入该网络,并且所有接入的容器均可互相通信。

即使这些容器所在的 Docker 主机位于不同的底层网络上,该覆盖网络依然是相通的。本质上说,覆盖网络是创建于底层异构网络之上的一个新的二层容器网络。

执行 docker network ls 来查看网络是否创建成功,且在 Docker 主机可见。

下面创建一个新的服务,并将其接入 uber-net 网络。

docker service create --name uber-svc \
--network uber-net \
-p 80:80 --replicas 12 \
nigelpoulton/tu-demo:v1

首先,将服务命名为 uber-svc,并用 --network 参数声明所有的副本都连接到 uber-net 网络。
然后,在整个 swarm 中将 80 端口暴露出来,并将其映射到 12 个容器副本的 80 端口。
最后,声明所有的副本都基于 nigelpoulton/tu-demo:v1 镜像。

执行 docker service lsdocker service ps 命令以检查新创建服务的状态。

通过对服务声明 -p 80:80 参数,会建立 Swarm 集群范围的网络流量映射,到达 Swarm 任何节点 80 端口的流量,都会映射到任何服务副本的内部 80 端口。
默认的模式,是在 Swarm 中的所有节点开放端口,称为入站模式(Ingress Mode)。此外还有主机模式(Host Mode),即仅在运行有容器副本的节点上开放端口

即使某个节点上并未运行服务的副本,依然可以进入该页面,所有节点都配置有映射,因此会将请求转发给运行有服务副本的节点。

update
假设本次投票已经结束,而公司希望开启一轮新的投票。现在已经为下一轮投票构建了一个新镜像,并推送到了 Docker Hub 仓库,新镜像的 tag 由 v1 变更为 v2。
此外还假设,本次升级任务在将新镜像更新到 Swarm 中时采用一种阶段性的方式,每次更新两个副本,并且中间间隔 20s。
那么就可以采用如下的 docker service update 命令来完成。

docker service update \
--image nigelpoulton/tu-demo:v2 \
--update-parallelism 2 \
--update-delay 20s uber-svc

仔细观察该命令,docker service update 通过变更该服务期望状态的方式来更新运行中的服务。
这一次我们指定了 tag 为 v2 的新镜像。接下来用 --update-parallelism 和 --update-delay 参数声明每次使用新镜像更新两个副本,其间有 20s 的延迟。最终,告知 Docker 以上变更是对 uber-svc 服务展开的。

(9)Docker Swarm服务日志及相关配置

Docker 节点默认的配置是,服务使用 json-file 日志驱动,其他的驱动还有 journald(仅用于运行有 systemd 的 Linux 主机)、syslog、splunk 和 gelf。
json-file 和 journald 是较容易配置的,二者都可用于 docker service logs 命令。

命令格式为:

docker service logs <service-name>

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!