栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Docker Swarm 学习实践2

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Docker Swarm 学习实践2

1:Docker swarm 的认识

Swarm是Docker公司推出的用来管理docker集群的平台,使用GO 语言编写的 服务编排和调度工具,代码开源路径:GitHub - docker-archive/classicswarm: Swarm Classic: a container clustering system. Not to be confused with Docker Swarm which is at https://github.com/docker/swarmkit

它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,访问不同机器上的Docker实例

Swarm内置了对Docker网络插件的支持,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务.

Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,

不需要再配置Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器 Etcd 或者 Consul 来进行服务发现配置了.Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器

即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,他会收集重建集群信息

2:Docker Swarm 基本结构图

 Docker Client使用Swarm对 集群(Cluster)进行调度,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持

3:Swarm的几个概念

Swarm  :  集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm

Node : 一个节点是docker引擎集群的一个实例

Service :一个服务是任务的定义,在管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主体。创建服务需要指定要使用的容器镜像。

Task :任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点

docker swarm:集群管理,子命令有init, join, leave, update ,--help

docker service:服务创建,子命令有create, inspect, update, remove, tasks ,docker service--help

docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm ,docker node --help

node是加入到swarm集群中的一个docker引擎实体,可以在一台物理机上运行多个node,node分为:

manager(Leader、Reachable)nodes,也就是管理节点

worker nodes,也就是工作节点

manager node管理节点:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。

worker node工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载task。

service服务:一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。

service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。

task任务:一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务

DockerSwarm 架构图

Swarm的调度策略 包含  Random  Spread  Binpack 三种

Random    随机调度分配资源

Spread  选择资源比较空闲的节点 ,服务分布比较均匀

Binpack  选择紫云比较密集的docker实例 ,减少碎片化 ,但是可能导致某个机器负载过重

4:Dcoker Swarm 集群部署

准备6台机器

修改主机名命令

hostnamectl set-hostname centos701  其他机器 也一样 只需修改 后面的名称

在每台机器中 添加 hosts

vim /etc/hosts
192.168.217.129 centos701   
192.168.217.130 centos702
192.168.217.131 centos703
192.168.217.132 centos704
192.168.217.133 centos705
192.168.217.134 centos706

关闭机器上的防火墙。如果开启防火墙,则需要在所有节点的防火墙上依次放行2377/tcp(管理端口)、7946/udp(节点间通信端口)、4789/udp(overlay 网络端口)端口

systemctl disable firewalld.service

systemctl stop firewalld.service

然后在每台机器都安装 docker 引擎 和 docker compose

请参考我之前的文章

Docker centos 安装_Java 码农的博客-CSDN博客

Docker Compose 示例_Java 码农的博客-CSDN博客

在 129 这台机器上执行集群初始化命令

docker swarm init --advertise-addr 192.168.217.129

然后 分别 执行 

docker swarm join-token manager

docker swarm join-token worker 

获取到 添加 manager 和 worker 的命令

 生成的manager 命令 拷贝到 基数结尾的 机器上执行

生成的worker命令 拷贝到 偶数结尾的 机器上执行

 完成之后 可以在管理节点上执行

docker node ls 查看swarm 中 集群节点的信息

带星号的表示是当前选举出来的 Leader 节点 , Reachable 是 备用的 Leader 节点

 docker swarm leave -f   f参数强制删除节点

docker info  查看信息

更改节点的availablity状态

swarm集群中node的availability状态可以为 active或者drain,其中:

active状态下,node可以接受来自manager节点的任务分派;

drain状态下,node节点会结束task,且不再接受来自manager节点的任务分派

docker node update --availability drain centos706

 重新让节点加入集群  docker node update --availability active centos706

 5:在集群中部署服务

以添加 nginx 服务为例

创建网络在部署服务

docker network create -d overlay nginx_net

docker network ls

执行添加服务并指定端口和副本数

docker service create --replicas 1 --network nginx_net --name nginx_test -p 88:80 nginx

overall progress: 1 out of 1 tasks

1/1: running   [==================================================>]

使用 docker service ls 查看正在运行服务的列表

docker service ps nginx_test  查看 服务在哪个节点上启动了

 修改 扩展结点数量

docker service scale nginx_test=4

docker service ps nginx_test

 模拟宕机 :

systemctl stop docker  在某个 worker

在使用docker node ls 和 docker service ps nginx

查看服务 发现 某个节点上的服务shutDown 并且 节点 状态为down

 而之前扩展的服务将会 被转移到其他机器上

 除了上面使用scale进行容器的扩容或缩容之外,还可以使用docker service update 命令

docker service update --replicas 1 nginx_test

删除 服务

 假设 nginx_test 为 nginx_test  的升级的镜像

可以使用如下命令升级 

docker service update --image nginx_test:new nginx_test

6: 在docker swarm 中使用 数据卷

docker volume --help

 docker volume create --name nginx_volume    创建数据卷

docker volume inspect nginx_volume  查看数据卷

创建新的服务并挂载nginx_volume

docker service create --replicas 3 --mount type=volume,src=nginx_volume,dst=/wl --name t_nginx   -p 89:80 nginx

 docker service ls

docker service ps t_nginx 

 docker exec -it d1a4e1ccf9fc /bin/bash     查看是否挂载成功

 验证数据挂载

 docker volume inspect nginx_volume

 cd  /var/lib/docker/volumes/nginx_volume/_data  并查看数据圈里的数据

再次执行 docker exec -it d1a4e1ccf9fc /bin/bash     查看是否挂载成功

 查看其他 机器数据卷是否挂载成功

 7:Swarm集群部署多服务

mkdir swarmcompose

cd swarmcompose/

touch docker-compose.yml 

vim docker-compose.yml 

编写 dockercompose.yml 的时候 一定要注意缩进问题 ,否则在使用docker stack docker stack deploy -c docker-compose.yml   + 服务名  会提示 各种属性错误 比如:

replicas Additional property replicas is not allowed

经过网络上查找该类 错误原因 得到一个 回到

 大概意思是

缩进在docker-compose.yml中非常重要。按照您设置它的方式,“部署”是一种服务,这不是您想要的。deploy部分旨在指定有关如何部署“web”服务的信息。以下允许docker compose up和docker stack deploy web--compose文件docker-compose.yml为我成功运行:

 添加如下内容    代码缩进的样例

此时 运行 服务正常启动

docker stack deploy -c docker-compose.yml deploy_swarm

 删除 这个服务 添加多个服务进行编排 ,并指定容器启动在那种类型的节点上

注意 从一个新的services 行开始 每下降一行需要的是新增两个英文的空格键 ,不能是tab,也不能是换行后默认的位置,能写在同一个列同级别的属性与其父级别的空格个数是相同的.

docker stack deploy -c docker-compose.yml multi 

version: "3"

services:
  nginx:
    image: nginx
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
    ports:
      - "80:80"
  visualizer:
    image: dockersamples/visualizer
    ports:
      - "8800:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
  portainer:
    image: portainer/portainer
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

在 manager 节点上执行

docker stack deploy -c docker-compose.yml multi    multi  是服务的前缀 ,生成服务完成后 ,会在服务名前面都加上

 分别访问 上面的节点的nginx

 

 

 

 docker version | Docker documentation    docker  官方命令手册  

docker stack  常用命令

docker stack deploy    部署新的堆栈或更新现有堆栈
docker stack ls    列出现有堆栈
docker stack ps    列出堆栈中的任务
docker stack rm    删除一个或多个堆栈
docker stack services    列出堆栈中的服务

8:Docker Swarm 容器网络

在Docker版本1.12之后swarm模式原生支持覆盖网络(overlay networks),可以先创建一个覆盖网络,然后启动容器的时候启用这个覆盖网络

只要是这个覆盖网络内的容器,不管在不在同一个宿主机上都能相互通信,不同覆盖网络内的容器组之间是相互隔离的,相互不能通信

swarm模式的覆盖网络包括以下功能:

1》可以添加多个服务到同一个网络

2》默认情况下service discovery为每个swarm服务分配一个虚拟IP地址(vip)和DNS名称,使得在同一个网络中容器之间可以使用服务名称为互相连接。

3》可以配置使用DNS轮循而不使用VIP

4》为了可以使用swarm的覆盖网络,在启用swarm模式之前你需要在swarm节点之间开放以下端口或者关闭防火墙(关闭防火墙只适用于自己开发测试,生产需要添加防火墙端口规则配置)

TCP/UDP端口7946 – 用于容器网络发现

UDP端口4789 – 用于容器覆盖网络

在Swarm集群中创建overlay网络: 

docker network create --driver overlay --opt encrypted --subnet ip/24 nxxx_net  (网络名称)

–opt encrypted 默认情况下swarm中的节点通信是加密的。在不同节点的容器之间,可选的–opt encrypted 参数能在它们的vxlan流量启用附加的加密层。

--subnet 命令行参数指定overlay网络使用的子网网段。当不指定一个子网时,swarm管理器自动选择一个子网并分配给网络。

docker network ls

 

其中"nginx_net"网络是我们在部署容器时所创建的。而"ingress"覆盖网络则为默认提供。

Swarm 管理节点会利用 ingress 负载均衡以将服务公布至集群之外,SCOPE表示将服务部署到Swarm时可以使用此网络

docker service create --replicas 5 --network ngx_net --name my-test -p 80:80 nginx  在指定的网络上创建5个副本的nginx

docker network inspect ngx_net  查看网络信息、加入同一个网络 ,如ngx_net网络的容器彼此之间可以通过IP地址通信,也可以通过名称通信


 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/362045.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号