所有操作都在本地一台机器进行,容器都在一台机器。但有些app部署在一台机器上根本无法满足需求,需要部署在多台机器,那问题来了,如下:
如上图问题,这时候就需要用到容器编排技术,docker swarm 是docker 自带的一种编排工具
docker swarm 是一个集群架构
既然是集群,肯定有node,而node又有角色(如leader,follower等)
swarm共有2种角色,manager 和 worker
manager:swarm集群的大脑。
在生产环境中为了避免单点故障,manager至少要有2个。而manager有多个的话,就涉及到一个状态同步的问题,
即1个manager产生的数据如何同步到另外的节点上?
这里用到一个内置的分布式存储数据库,数据库用 ratf (一个分布式一致性协议)协议实现数据同步,ratf 协议能确保manager之间的信息是同步的。
worker:干活节点,大部分的容器都运行在worker节点上,worker之间有些数据也需要同步,通过 gossip network
来做信息同步
docker swarm的容器服务运行在manager 节点和 worker 节点上
docker swarm 的service 跟docker-compose 的service 意思基本一样,1个service代表1个容器
replicas:在replica模式下,做3个横向扩展,部署时生成3个容器,3个容器通过调度系统部署在不同worker,也就是说通过swarm去部署容器时,不知道最终这容器最终运行在哪里的。调度系统根据一定算法去算的,比如看哪些节点负载轻一些等等
这张图基本上是 swarm 模式下创建容器的过程
大概就是manager做决策,决定放在哪的node,之后执行实际操作
docker swarm init --help //初始化1个docker swarm 集群的方法
如上,创建了3个节点的swarm 集群
创建service
docker service create
大概来讲docker service 有点像 docker run,区别是docker run 是本地创建容器,
而docker service 是在swarm 上面创建容器
刚好被平均分配到3个node 上,再扩展成5个
回到manager节点,查看
一开始是4,后面又变成5,node2上又新建了1个service。
也就是说swarm 会监控运行中的service,如果某个service不能服务了,swarm会重新起1个service,
新起的service未必在原来的node上,这里只是刚好还在原来的node2上,确保达到5个service在工作
收缩成3个,成功
删除demo service,worker节点上也没了,worker节点上可能会有点延迟删除,等一下就没
在前面的例子中,需要1个etcd 来实现不同机器上container之间通信,但在swarm模式,并不需要,
swarm底层会有1个机制,去同步网络创建,因为要service之间的通信,要通过 overlay 网络来实现
swarm 有内置类似dns的服务,可以直接ping serviceName
位于worker1 节点,进去这service
扩展成2个
10.0.0.7是虚拟ip,这个虚拟 ip 是不会变的,而service 容器的 IP 随着收缩扩展会变
这个 虚拟ip 和 实际容器ip 有个对应 map 关系,通过这map关系找到实际容器ip
docker swarm内会自动实现类似负载均衡,比如有3个replicas,每次都是访问虚拟IP,之后会讲虚拟IP的流量分配到这3个replicas
比如说whoami 这个service绑定8000,端口,前面的wordpress则是绑定80端口,
那通过任意swarm 节点+端口,都能访问该服务
比如client 要访问web,通过访问 vip 10.0.9.4,之后swarm的负载均衡转发流量,决定由web1 或者 web2 响应
下图演示整个流程
swarm 的负载均衡(LVS)叫全称叫 linux virtual server ,主要用于实现在系统级别的负载均衡,是Linux内核的一部分,
由国人实现,感兴趣可以去 搜索 lvs keepalived 配置,做一些实验和配置,通过 lvs 和 keepalived ,通过这2个东西,
可以搭建一个高可用的负载均衡。和nginx的区别是,lvs 功能有点较少,nginx功能多,可以根据具体的情况做选择,
一般用nginx较多
比如上图,访问的是host3,但host3没这个服务,没关系,会通过ipvs 通过 ingress network 转发到另外有这个服务的host。
再将responde 返回来,这就是ingress 的主要功能
换一个节点,worker1,worker1是没有这个whoami 服务的,同样能返回whoami 服务的结果
这就是ingress network 实现的作用