资讯专栏INFORMATION COLUMN

Docker Swarm介绍

番茄西红柿 / 3135人阅读

摘要:后续将其他节点加入集群都会用到这个值将节点加入集群查看节点信息相关命令创建服务更新服务删除服务减少服务实例增加服务实例查看所有服务查看服务的容器状态查看服务的详细信息。

前言

本篇是Docker第十三篇,Docker的使用至此就介绍完成,接下来继续Kubernetes。

Docker系列文章:
  1. 为什么要学习Docker
  2. Docker基本概念
  3. Docker镜像基本原理
  4. Docker容器数据卷
  5. Dockerfile
  6. Docker单机网络上
  7. Docker单机网络下
  8. Docker单机网络实战
  9. Docker隔离技术
  10. Docker限制
  11. Docker Compose
  12. Docker多机网络

为什么需要Docker Swarm

  1. 我们从Docker到Docker Compose都是在单机上完成,这样会带来一个很现实的问题就是高可用的问题,如果只部署到一台机器是无法做到高可用的,这样就不具备生产的条件;

  2. Docker Compose只是简单做了单机服务的编排、扩容,对于多机器的管理、发布、服务发现、负载均衡都没有很好的解决;

  3. 目前我们所有的容器都是在单个宿主机上进行网络通信,多机情况的网络通信也没有解决方案;

针对以上三点,Docker给出了Docker Swarm的解决方案,Docker swarm可以让用户轻松在多个机器上发布和管理应用,并且我们不需要关注每个容器实例具体落在哪一个节点,Docker swarm把我们的应用以服务的形式暴露出去,并内置服务发现和负载均衡,让运行在多个节点上的容器集群感觉就像只有一个应用在跑一样简单,可以轻松实现扩容和自动容错。Docker swarm集群通常有几个工作程序节点和至少一个管理程序节点,负责高效地处理工作程序节点的资源并确保集群有效地运行,提高了应用可用性。

Docker Swarm概念介绍

Manager Node

Manger 节点是负责管理工作的,从名字就可以看出,注意负责以下事情:

  1. 维护集群的状态;

  2. 对 Services 进行调度;

  3. 为 Swarm 集群提供外部可调用的 API 接口;

  4. 提供服务注册发现、负责均衡等功能;

Manager 节点需要时刻维护和保存当前 Swarm 集群中各个节点的一致性状态,在保证一致性上,Manager 节点采用 Raft 协议来保证分布式场景下的数据一致性;

Worker Node

Worker 节点是用来执行 Task 的;默认情况下 Manager 节点也同样是 Worker 节点,同样可以执行 Task;

Service

Services 是指一组任务的集合,服务定义了任务的属性,比如任务的个数、服务策略、镜像的版本号等等,服务有两种模式:

  1. replicated services 按照一定规则在各个工作节点上运行指定个数的任务;
  2. global services 每个工作节点上运行一个任务;

Task

Task是 Swarm 集群中的最小的调度单位,任务包含一个Docker容器和在容器内运行的命令,如果某一个任务奔溃,那么协调器将创建一个新的副本任务,该任务将生成一个新的容器;

Task调度

Task调度主要分为两部分: Manager节点的任务分配和Worker节点的任务执行;

Manager节点的任务分配主要有以下四步:

  1. 用户通过 Docker Engine Client 使用命令 docker service create 提交 Service 定义;

  2. Manager节点根据定义创建相应的 Task,并分配IP地址;

  3. 将Task分发到对应的节点上;

  4. 节点进行相应的初始化使得它可以执行Task;

Worker节点的任务执行主要有两步:

  1. 连接Manager节点的分配器检查该Task相关定义的信息;
  2. 验证通过以后,开始在 Worker 节点上执行Task;

注意,上述 Task 的执行过程是一种单向机制,比如它会按顺序的依次经历 assigned, prepared 和 running 等执行状态,不过在某些特殊情况下,在执行过程中,某个 Task 执行失败了,Manager 的编排器会直接将该 Task 以及它的 Container 给删除掉,然后在其它节点上另外创建并执行该 Task;

Docker Swarm网络

核心概念介绍

  1. Overlay Network:管理 Swarm 中 Docker 守护进程间的通信。你可以将服务附加到一个或多个已存在的 overlay 网络上,使得服务与服务之间能够通信;

  2. Ingress Network:一个特殊的 overlay 网络,用于服务节点间的负载均衡。当任何 Swarm 节点在发布的端口上接收到请求时,它将该请求交给一个名为 IPVS 的模块。IPVS 跟踪参与该服务的所有IP地址,选择其中的一个,并通过 ingress 网络将请求路由到它。初始化或加入 Swarm 集群时会自动创建 ingress 网络,大多数情况下,用户不需要自定义配置,但是 docker 17.05 和更高版本允许你自定义;

  3. Docker Gwbridge Network:一种桥接网络,将 overlay 网络连接到一个多带带的 Docker 守护进程的物理网络。默认情况下,服务正在运行的每个容器都连接到本地 Docker 守护进程主机的 docker_gwbridge 网络,一种桥接网络,将 overlay 网络(包括 ingress 网络)连接到一个多带带的 Docker 守护进程的物理网络。默认情况下,服务正在运行的每个容器都连接到本地 Docker 守护进程主机的 docker_gwbridge 网络;

流量分类

Docker Swarm 数据流量分为两个层面:

  1. 控制管理流量(control and management plane traffic): 包括 Swarm 管理消息,例如加入/退出 Swarm 的请求,这些流量总是被加密的;
  1. 应用数据流量(Application data plane traffic): 包括容器之间的数据交换,以及容器与外部网络的数据交换,关于这块的原理探讨放在实践的地方;

集群搭建

资源准备

节点全部使用CentOS8.2版, 这边准备了两个node节点和一个master节点:

  1. IP:172.16.0.191 主机名:demo-master-1 担任角色:Swarm Manager
  2. IP:172.16.0.45 主机名:demo-slave-1  担任角色:Swarm Node
  3. IP:192.168.0.231 主机名:demo-slave-2:Swarm Node

保证每个主机之间都能相互ping通并且2377端口可以telnet保持畅通, 每个节点都安装了Docker。

集群安装

  1. 初始化Master节点,命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值;
docker swarm init --advertise-addr 172.16.0.191
  1. 将Node节点加入集群;
docker swarm join --token SWMTKN-1-3cap7omkvmyuf0q1ybm868880eo5reoil8pcbovmejfzw6pil8-73hc367s4gitudqivrdirvu63 172.16.0.191:2377
  1. 查看Master节点信息;
docker node ls
  1. 相关命令;
# 创建服务
docker service create /  
  --image nginx /
  --replicas 2 /
  nginx 

# 更新服务
docker service update /  
  --image nginx:alpine /
  nginx 

# 删除服务
docker service rm nginx

# 减少服务实例
docker service scale nginx=0

# 增加服务实例
docker service scale nginx=5

# 查看所有服务
docker service ls

# 查看服务的容器状态
docker service ps nginx

# 查看服务的详细信息。
docker service inspect nginx

实战

  1. 在Manager节点部署Nginx服务,服务数量为2个,对外暴露的端口是8080映射容器内部的80端口,使用Nginx镜像;
docker service create --replicas 2 --name nginx --publish 8080:80  nginx
  1. 查看容器分布状况;
docker service ps swarm-nginx
  1. 访问服务;
curl 172.16.0.45:8080
curl 192.168.0.231:8080

Internal

Internal容器与容器之间通过overlay网络进行访问,通过service name进行通信,但是service name所对应的ip不是真实ip而是VIP,我们可以下面这个案例进行验证:

  1. 开始实验前移除创建的服务,创建一个overlay的Network;
docker network create --driver overlay swarm-overlay
#查看网络状况
docker network ls
  1. 创建一个nginx的service ,使用swarm-overlay网络;
docker service create --name nginx -p 8080:80 --network swarm-overlay -d nginx
  1. 再创建一个busybox服务;
docker service create --name busybox -d --network swarm-overlay  busybox:1.28.3 sh -c while true; do sleep 7200; done
  1. 查看服务列表;
docker service ls
  1. 进入busybox服务内部,使用ping命令访问nginx服务,我们会发现可以访问;
docker exec -it 2f55d73adfb4 sh
ping nginx

Ingress

当在任何一个Swarm节点去访问端口服务的时候会通过本节点的IPVS ( ip virtual service )到真正的Swarm节点上。提供以下三种功能:

  1. 外部访问的均衡负载;

  2. 服务端口暴露到各个Swarm节点;

  3. 内部通过IPVS进行均衡负载;

接着Internal案例继续进行探索,Swarm节点内部是如何进行转发的;

  1. 查看工作节点的转发规则,我们可以看到把请求转发到172.18.0.2:8000这个地址上去了;
iptables -nL -t nat
  1. 接下来我们查看下本机的网络情况,我们找到了docker_gwbridge,可以看到两个ip处于同一网段,那么172.18.0.2应该也连接上docker_gwbridge;
  1. 查看docker_gwbridge的interface 信息,我们会发现有多个interface;
brctl show
  1. 接下来我们查看下docker_gwbridge网络信息,我们可以发现ingress-sbox就是我们要找的命名空间,gateway_ingress-sbox就是所属的容器;
docker network inspect docker_gwbridge
  1. 进入ingress_sbox内部,查看iptables规则,可以看到发送到该ip地址下的8000端口的请求被负载掉了;
#查找ingress_sbox位置
ls /var/run/docker/netns
#进入ingress_sbox
nsenter --net=/var/run/docker/netns/ingress_sbox
#查看ingress_sbox iptables 
iptables -nL -t mangle

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125378.html

相关文章

  • Docker 实践(五):生产环境容器化

    摘要:不要用百度搜索中文资料,一定要看最新的英文资料。感谢感谢能容忍我无数次搞挂生产环境的老板。群蜗牛大神所建中文交流群,基本配置过程中遇到的问题都能得到解决。 前言 最近花了将近一个月的时间研究了 Docker 在生产环境中的使用,作为新手,期间走了无数的弯路,这里纪录一下,希望给别人带来微小的帮助。 前面几部分,介绍了在搭建集群之前需要做的一些工作,后面 一块结合实际应用,介绍如何架构...

    sydMobile 评论0 收藏0
  • 生产环境中使用Docker Swarm的一些建议

    摘要:译者按实践中会发现,生产环境中使用单个节点是远远不够的,搭建集群势在必行。集群的网络通信服务发现,负载均衡以及容器间通信非常可靠。负载均衡也是由提供的。 译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行。然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它们之中,Swarm是Docker原...

    loonggg 评论0 收藏0
  • 基于 Docker 1.12 Swarm 的集群管理开发实践

    摘要:由于没有了中心化的负载均衡器,集群不会因某台机器异常而导致整个服务对外不可用,很好的避免了单点问题,同时也带了可扩展性。 Mesos/Marathon 折腾久了,我们一直希望有机会深入到 Swarm 内部一探究竟。 另外, Mesos 这一套东西虽然是久经企业级考验的, 但是安装、部署和使用相对复杂,上手有门槛。同时,在今年的 DockerCon 上,内置了Swarm 功能的 Dock...

    My_Oh_My 评论0 收藏0
  • 代码篇 | Docker1.12+Swarm构建动态微服务应用

    摘要:首先启动该命令。这项机制在实际生产当中无疑非常重要。那么下面我们回顾一下之前了解到的信息我们创建了一款小型动态微服务应用,完全由构成。在多数情况下,这能够为应用后端服务建立起独立的代理机制。 这次数人云与大家分享的文章里,主要介绍了Docker Swarm如何凭借革新对整体场景进一步加以简化。事实上,如今我们已经可以轻松且直观地构建起一套Docker Swarm集群,快来一起体验一下吧...

    JellyBool 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<