云原生之容器编排-Docker Swarm

1. 前言

        上一篇我们讲到Docker Compose可以定义和运行多容器应用程序,用一个YAML配置文件来声明式管理服务,在一台安装了Docker engine的Linux系统上可以很好的工作,但是现实中不可能只有一台Linux系统,一台Linux系统不可能有足够的资源运行所有的云原生应用系统,为了支撑整个业务平台,势必要在很多台Linux系统运行云原生应用系统,共同组成一个容器集群,Docker Compose工具并不能管理这样的容器集群,势必有新工具出现。

        开源界管理容器集群的系统一般叫作容器编排系统,主要有三个系统:Docker Swarm、Mesos、Kubernetes。当然众所周知,Mesos背后的支撑公司已经出现了问题,Docker Swarm也是有气无力的状态,只有Kubernetes如日中天,成为事实上的标准。

        既然Kubernetes是事实上的标准,为什么四年前我还是选择了Docker Swarm?基于简单的三个理由:

  1.  系统的规模:我们的最大客户线上环境只有几十台Linux服务器,100台物理机都不到,其实也不是所有机器都安装容器集群,存储系统和大数据集群也占了一少部分机器。最小的客户线上环境才10几台Linux服务器,规模就更小了。Docker Swarm足够管理这点容器集群了,一直以来运行基本没出现过问题。
  2.  操作的复杂度:K8s从安装到运维技术复杂性众所周知,而Docker Swarm本身就集成进Docker Engine中,操作相对来说算非常简单了,中小公司只有少量的运维人员,而且技艺也不够精,选择Docker Swarm就显得更为适合了。
  3.  内网的问题:大部分在互联网工作的企业,安装什么软件都非常方便,但是少部分安全行业,系统都是部署在严格控制的内网环境里,绝对不能访问外部互联网、移动互联网等,只有一条只准进不准出的FTP通道给企业发包使用。在这样的环境下,大部分Linux服务器已经存在,不可能搬出来到外网安装软件了,如果我们安装K8s难度有多大不可而知,但是我们用二进制包去安装Docker Engine,部署Docker Swarm,整个过程非常顺利。

        所以我推荐选择Docker Swarm而不是K8s,如果你的真实系统环境和我差不多的话,不要给公司运维人员带来额外的技术债务。

2. Docker Swarm简介

        从Docker Engine 1.12版本开始,Docker Swarm已经包含在其中了,负责容器集群管理和编排。下面列举一下Docker Swarm有哪些特性:

  • 集群管理功能直接整合进Docker引擎中:不需要额外单独安装容器编排软件,操作命令直接集成进docker工具里,降低了学习曲线。
  • 去中心化设计:在运行时处理任何特殊化,而不是在部署时,也就是部署时不需要管不同角色的节点问题,你能使用Docker engine提供的工具,同时部署managers和works两种类型的nodes。反正我们用docker swarm提供的命令对管理节点和工作节点进行操作即可。
  • 声明式服务模式:Docker引擎使用声明性方法来定义应用程序栈中各种服务的所需状态,一般就是在编排文件docker-compose.yml里定义各种状态参数,如容器数量。
  • 弹性:对每一个服务,你都可以在编排文件中定义它容器运行的数量,当你增加或减少编排文件里服务的容器数量时,swarm管理功能会自动增加和删除运行容器的数量,不需要人工干预。
  • 期望状态的调节功能:管理节点一直监控着集群的运行状态,调节集群实际状态和你期望的状态之间的差异。比如你在编排文件你定义一个服务要10个容器,管理节点一直会监控并满足这个状态,中途如果有节点down掉了,它会在其它活动的节点上运行新容器以便始终满足10个容器。
  • 跨多主机网络:你可以对所有服务指定一个overlay类型网络,服务之间就可以无缝通讯了。
  • 服务发现功能:在集群中每一个服务都有一个唯一的DNS名,通过这个域名你访问每一个运行中的容器。
  • 负载均衡功能:你可以指定服务的一个或多个端口,暴露给外部访问,Swarm会在多个节点之间处理好负载均衡问题。
  • 缺省支持安全:支持CA证书,内网方案一般也可以不关心这个。
  • 滚动更新:就是新服务发布出错了,可以回滚到先前稳定的版本。

        Docker Swarm有几个关键概念需要我们明白:

  • Nodes: 节点,一个节点是docker引擎集群的一个实例,你可以将其视为Docker节点。你可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的Docker节点。Swarm节点包括两类:管理节点和工作节点,我们把服务定义发送给管理节点,管理节点把任务分配给工作节点去执行。
  • Services: 一个服务就是任务的定义,在docker-compose.yml里主要就是定义一个个服务。
  • Tasks: 任务,一个任务就是一个容器以及在容器里运行的命令。
  • Load Balancing: 负载均衡。

3. Docker Swarm架构分析

3.1 节点怎样工作

        Swarm支持多个管理节点,管理节点负责处理集群的管理任务:1)维护集群状态;2)调度服务;3)提供Swarm模式HTTP API端点服务。工作节点就是执行服务的任务。

3.2 服务怎样工作

        上图阐述了服务、任务和容器的协作关系,服务service有多个replicas,分派成多个task去执行,task在container里去执行。 

3.3 任务和调度

3.4 副本服务和全局服务

 

        副本服务就是指定了多少副本,就会执行多少个任务和运行容器,一般我们的业务系统服务就是采用这种方式的。

        全局服务是每个节点运行一个任务,不需要预先指定副本,每次你添加一个新节点进入Swarm集群,新节点也会被分派执行一个任务,这种服务一般是监控代理、杀毒扫描等服务。

4. Docker Swarm集群部署

        我们要部署一个应用程序到Swarm集群,一般的操作步骤是:

  • 初始化一个Swarm模式的集群;
  • 添加节点到Swarm集群;
  • 部署应用服务到Swarm集群;
  • 管理Swarm集群。 
4.1 部署前环境准备
  • 准备几台Linux服务器,安装好Docker Engine,服务器之间网络互通;
  • 选择一台Linux服务器为管理节点,查询其IP地址;
  • 服务器之间开放协议端口:
    • Port 2377 TCP for communication with and between manager nodes;
    • Port 7946 TCP/UDP for overlay network node discovery;
    • Port 4789 UDP (configurable) for overlay network traffic。
4.2 创建一个Swarm

        在管理节点执行:

$ docker swarm init --advertise-addr <MANAGER-IP>

        例如:

$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

        查看swarm当前状态:

$ docker info 

        查看swarm节点情况:

$ docker node ls 

4.3 添加工作节点到Swarm集群

        在你规划的各个worker node上执行: 

$ docker swarm join \
  --token  SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
  192.168.99.100:2377

This node joined a swarm as a worker.

        如果你不记得token了,则去管理节点去执行:

$ docker swarm join-token worker

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

4.4 部署一个服务到Swarm集群

        在管理节点上执行:

$ docker service create --replicas 1 --name helloworld alpine ping docker.com

9uk4639qpg7npwf3fn2aasksr

  • docker service create : 创建服务命令.
  • --name :服务名 helloworld.
  • --replicas :指定副本数量,即运行任务的容器数量.
  • alpine ping docker.com:alpine是镜像,执行任务命令是: ping docker.com.

        查看运行中的服务命令:

$ docker service ls

ID            NAME        SCALE  IMAGE   COMMAND
9uk4639qpg7n  helloworld  1/1    alpine  ping docker.com 

4.5 探查一个服务

         探查一个服务情况执行:

$ docker service inspect --pretty <SERVICE-ID>

$ docker service ps <SERVICE-ID>

4.6 Scale一个服务 

$ docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>

例如:

$ docker service scale helloworld=5

helloworld scaled to 5

$ docker service ps helloworld

4.7 删除一个运行中的服务

$ docker service rm helloworld

helloworld

 4.8 部署一个stack到swarm

        采用docker service create 命令部署一个服务太麻烦,太多参数需要自己手工在命令行指定,不是高效的做法,最终我们还是要用docker-compose.yml来定义一切参数,一个简单命令来提交是最好的。

        假如我们已经做好了几件事情:

  • 应用程序部署需要的所有镜像已经做好了;
  • docker-compose.yml编排文件已经做好了;
  • 镜像仓库已经存在了,如Docker Register、Docker Hub、Harbor;
  • 在本地已经用docker compose测试了应用程序的正确性;
  • 应用程序的所需镜像已经推送到镜像仓库。
4.8.1 创建一个stack 

        使用docker stack deploy命令来执行,stack名为stackdemo: 

$ docker stack deploy --compose-file docker-compose.yml stackdemo

Ignoring unsupported options: build

Creating network stackdemo_default
Creating service stackdemo_web
Creating service stackdemo_redis

4.8.2 检查stack的运行情况

         使用docker stack services命令来执行,指定stack名:

$ docker stack services stackdemo

ID            NAME             MODE        REPLICAS  IMAGE
orvjk2263y1p  stackdemo_redis  replicated  1/1       redis:3.2-alpine@sha256:f1ed3708f538b537eb9c2a7dd50dc90a706f7debd7e1196c9264edeea521a86d
s1nf0xy8t1un  stackdemo_web    replicated  1/1       127.0.0.1:5000/stackdemo@sha256:adb070e0805d04ba2f92c724298370b7a4eb19860222120d43e0f6351ddbc26f

 4.8.3 删除一个stack

        如果你不需要这个stack,则删除它,执行docker service rm:

$ docker stack rm stackdemo

Removing service stackdemo_web
Removing service stackdemo_redis
Removing network stackdemo_default

5. Docker Swarm的官方文档

5.1 Docker Swarm的用户手册

        我基本上是按照这个地址来学习操作的,篇幅不大,耐心阅读完就够了,无须阅读其它二手资料:Swarm mode overview | Docker Docs。 

5.2 Docker Swarm的命令参考手册

        命令参考手册地址:docker swarm | Docker Docs

6. 总结

         Docker Swarm 是 Docker 官方推出的容器编排工具,不同于Docker Compose 是一个在单个服务器或主机上创建多个容器的工具, Docker Swarm 是在多个服务器或主机上创建容器集群服务,对于微服务的部署,自然 Docker Swarm 才是解决之道。

         对于中小公司的小型云原生应用系统而言,选择Docker Swarm可能更为适合,适合才是最好的,系统架构师需要根据公司实际情况进行慎重选择。

         

         

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机学习笔记---LCD1602功能函数代码

目录 LCD1602.c 模拟写指令的时序 模拟写数据的时序 初始化 显示字符 显示字符串 显示数字 显示有符号的数字 显示16进制数字 显示二进制数 LCD1602.h main.c 上一篇讲了LCD1602的工作原理&#xff0c;这一节开始代码演示&#xff01; 新创建工程&#xff1a;LCD1…

黑马程序员——移动Web——day02

目录 空间转换 空间转换简介平移视距旋转左手法则rotate3d-了解立体呈现案例-3d导航缩放动画 动画实现步骤animation复合属性animation拆分写法案例-走马灯精灵动画多组动画综合案例-全名出游 背景云彩位置和动画文字动画 1.空间转换 空间转换简介 空间&#xff1a;是从坐标…

AcWing 112. 雷达设备(区间贪心)

[题目概述] 假设海岸是一条无限长的直线&#xff0c;陆地位于海岸的一侧&#xff0c;海洋位于另外一侧。 每个小岛都位于海洋一侧的某个点上。 雷达装置均位于海岸线上&#xff0c;且雷达的监测范围为 d&#xff0c;当小岛与某雷达的距离不超过 d 时&#xff0c;该小岛可以被雷…

[Angular 基础] - 自定义事件 自定义属性

[Angular 基础] - 自定义事件 & 自定义属性 之前的笔记&#xff1a; [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上是能够实现渲染静态页面的基础 之前的内容主要学习了怎么通过…

第13章 网络 Page727~728 asio定时器例子:后创建的定时器先产生到点事件

代码&#xff1a; 35行&#xff0c;42行&#xff0c;51行&#xff0c;分别构造三个对象&#xff0c; 36行&#xff0c;43行&#xff0c;52行&#xff0c;设置了三个任务peng1、peng2、peng3&#xff0c;并将任务交给io_service对象&#xff08;不需要ios的run()方法启动起来&a…

如何创建和填写 PDF 表单,简化您的文档工作流

阅读本文&#xff0c;了解如何在开源办公套件 ONLYOFFICE 中创建和填写 PDF 表单。 ONLYOFFICE表单发展小史 ONLYOFFICE 表单首个版本发布于2022年1月18日&#xff0c;是 ONLYOFFICE 版本 7.0 更新的一部分。 您可以使用 ONLYOFFICE 表单&#xff0c;创建各种类型的模板文档&a…

Linux多线程[一]

引入知识 进程在线程内部执行是OS的系统调度单位。 内核中针对地址空间&#xff0c;有一种特殊的结构&#xff0c;VM_area_struct。这个用来控制虚拟内存中每个malloc等申请的空间&#xff0c;来区别每个malloc的是对应的堆区哪一段。OS可以做到资源的精细度划分。 对于磁盘…

Android之Android.bp文件格式语法(一百八十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

vue学习106-120

创建项目p106 router&#xff0c;store和app.vue不用删 清一下router里的路由配置 vant组件库p107 目标&#xff1a;认识第三方vue组件库vant-ui&#xff08;cv战士&#xff09; 封装好了的组件整合在一起就是组件库 http://vant-contrib.gitee.io/vant/v2/#/zh-CN/ vue2用va…

2024.02.13作业

21. c 22. b 23. b 5先出栈意味着1234都在栈内&#xff0c;此时1不能比2&#xff0c;3先出栈 24. b, c, d: 10, 12, 120 25. 2, 5 26. 数组越界&#xff0c;可能出现段错误 27. 0, 41 28. 1, 320 29. *a *b; *b *a - *b; *a - *b; 30. 0x801005&#xff1b;0x8…

计算机设计大赛 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

Java实现贫困地区人口信息管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 人口信息管理模块2.2 精准扶贫管理模块2.3 特殊群体管理模块2.4 案件信息管理模块2.5 物资补助模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 人口表3.2.2 扶贫表3.2.3 特殊群体表3.2.4 案件表3.2.5 物资补助表 四…

NARF关键点检测及SAC-IA粗配准

一、生成对应深度图 C #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/io.h> #include <pcl/range_image/range_image.h> #include <pcl/visualization/range_image_visualizer.h>…

动态内存管理:new和delete的底层探索

之前我们在C语言上是学过malloc和calloc还要realloc等函数来在堆上获取相应的内存&#xff0c;但是这些函数是存在缺陷的&#xff0c;今天引入对new和delete的学习&#xff0c;来了解new和delete的底层实现。 首先就是在C中我们为什么要对内存进行区域的分块&#xff1f; 答案…

ChatGPT高效提问—prompt实践(漏洞风险分析-重构建议-识别内存泄漏)

ChatGPT高效提问—prompt实践&#xff08;漏洞风险分析-重构建议-识别内存泄漏&#xff09; 1.1 漏洞和风险分析 ChatGPT还可以帮助开发人员预测代码的潜在风险&#xff0c;识别其中的安全漏洞&#xff0c;而不必先运行它&#xff0c;这可以让开发人员及早发现错误&#xff0…

【vscode】在vscode中如何导入自定义包

只需要额外添加这两条语句即可&#xff1a; import os,sys sys.path.append("../..") 需要注意的是&#xff0c;ipynb 文件打开的工作目录是文件本身的路径&#xff0c;而 py 文件打开的工作路径是 vscode 打开的路径。 相比较而言 pycharm 中创建好项目之后并不…

FT2232调试记录(2)

FT2232调试记录 &#xff08;1&#xff09;获取当前连接的FTDI设备通道个数:&#xff08;2&#xff09;获取当前连接的设备通道的信息:&#xff08;3&#xff09;配置SPI的通道:&#xff08;4&#xff09;如何设置GPIO:&#xff08;5&#xff09;DEMO测试&#xff1a; FT2232调…

【阅读笔记】空域保边降噪《Side Window Filtering》

1、保边滤波背景 保边滤波器的代表包括双边滤波、引导滤波&#xff0c;但是这类滤波器有一个问题&#xff0c;它们均将待处理的像素点放在了方形滤波窗口的中心。但如果待处理的像素位于图像纹理或者边缘&#xff0c;方形滤波核卷积的处理结果会导致这个边缘变模糊。 基于这个…

揭秘 2024 春晚刘谦魔术——代码还原

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、魔术大概流程 二、代码实现各个步骤 2.1 partition&#xff08;对半撕牌&#xff09; 2.2 bottom&#xff08;将 n 张牌置底…

基于微信小程序的智能社区服务小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…