云原生之容器编排-Docker Swarm

news/发布时间2024/5/15 22:24:36

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.bcls.cn/NAyf/521.shtml

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

相关文章

Spring源码:手写SpringIOC

文章目录 一、分析二、实现1、版本1&#xff1a;实现Bean注入IOC容器&#xff0c;并从容器中获取1&#xff09;定义BeanDefinition2&#xff09;定义BeanDefinition实现类3&#xff09;定义BeanDefinitionRegistry4&#xff09;定义Beanfactory5&#xff09;定义默认Beanfactor…

GitLab私有Git

GitLab私有Git 1 GitLab简介 GitLab是整个DevOps生命周期的第一个单一应用程序。只有GitLab才能启用Concurrent DevOps&#xff0c;从组件链的约束中解锁组织。GitLab提供无与伦比的可见性&#xff0c;更高的效率和全面的治理。这使得软件生命周期加快了200&#xff05;&…

Stable Diffusion 模型下载:ToonYou(平涂卡通)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

【前端高频面试题--git篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 前端高频面试题--git篇 往期精彩内容常用命令git add 和 git stage 有什么区别怎么使用git连接…

内存管理详解

一些相关 【iOS】内存管理 什么是内存&#xff1f; 冯诺依曼结构 冯诺依曼结构中&#xff0c;存储器存放着程序的指令和数据&#xff0c;在程序运行时提供给CPU使用。 冯诺伊曼结构的瓶颈 CPU的运算速度远远大于了访存的速度&#xff0c;所以要找到一个速度、容量和成本都…

C# CAD SelectionFilter下TypedValue数组

SelectionFilter是用于过滤AutoCAD实体的类&#xff0c;在AutoCAD中&#xff0c;可以使用它来选择具有特定属性的实体。构造SelectionFilter对象时&#xff0c;需要传入一个TypedValue数组&#xff0c;它用于定义选择规则。 在TypedValue数组中&#xff0c;每个元素表示一个选…

vscode 开发代码片段插件

环境准备 node - 20v版本 &#xff0c;推荐使用nvm进行版本控制全局安装 "yo" 是 Yeoman 工具的命令行工具&#xff0c; npm i yo -g全局安装 generator-code 是一个 Yeoman 脚手架 gernerator-code npm i gernerator-code -g全局安装 npm install -g vsce官方文档 …

1.Electron初始与安装

这里写目录标题 一、前言二、下载三、简要总结 一、前言 原文以及该系列后续文章请参考&#xff1a;安装Electron 随着前端的不断强盛&#xff0c;现在的前端已经不再满足于网页开发了&#xff0c;而是在尝试能否使用前端的开发逻辑来开发PC端的桌面软件。 即用html、js、css…

服务器遭受 DDoS 攻击的常见迹象有哪些?

服务器遭受 DDoS 攻击的现象很常见&#xff0c;并且有时不容易预防&#xff0c;有部分原因是它们的形式多种多样&#xff0c;而且黑客手段越来越隐蔽。如果您怀疑自己可能遭受 DDoS 攻击&#xff0c;可以寻找多种迹象。以下是 DDoS 攻击的5个常见迹象&#xff1a; 1.网络流量无…

全视通智慧社区居家养老解决方案如何让老人住的更舒心?

随着老龄化社会的加速发展&#xff0c;老年人的养老问题愈发受到社会关注。传统的养老方式已经无法满足现代老年人的需求&#xff0c;他们更加注重生活的品质和舒适度。为了响应《城市居家适老化改造指导手册》要求&#xff0c;全视通智慧社区&居家养老解决方案应运而生&am…

人工智能技术应用笔记(二):OpenAI SORA文生视频模型技术报告全文中英对照 (GPT4翻译+人工润色)

目录 Video generation models as world simulators&#xff08;视频生成模型作为世界模拟器&#xff09; Turning visual data into patches &#xff08;将视觉数据转换为图像块&#xff09; Video compression network &#xff08;视频压缩网络&#xff09; Spacetim…

JMeter 测试脚本编写技巧

是一款开源软件&#xff0c;用于进行负载测试、性能测试及功能测试。测试人员可以使用 JMeter 编写测试脚本&#xff0c;模拟多种不同的负载情况&#xff0c;从而评估系统的性能和稳定性。以下是编写 JMeter 测试脚本的步骤。 第 1 步&#xff1a;创建测试计划 在JMeter中&am…

【前端工程化面试题目】webpack 的热更新原理

可以在顺便学习一下 vite 的热更新原理&#xff0c;请参考这篇文章。 首先有几个知识点需要明确 热更新是针对开发过程中的开发服务器的&#xff0c;也就是 webpack-dev-serverwebpack 的热更新不需要额外的插件&#xff0c;但是需要在配置文件中 devServer 属性中配置 hot&a…

【学习iOS高质量开发】——接口与API设计

文章目录 一、用前缀避免命名空间冲突1.为什么用前缀避免明明冲突2.应当如何避免3.要点 二、提供“全能初始化方法”1.什么是全能初始化方法2.如何重写初始化方法3.一个类有多个全能初始化方法要注意的问题3.要点 三、实现description方法1.什么是description方法2.在descripti…

语言与科技创新(大语言模型对科技创新的影响)

1.语言因素对科技创新的影响 科技创新中的语言因素至关重要&#xff0c;具体体现在以下几个方面&#xff1a; 科技文献交流&#xff1a; 英语作为全球科学研究的通用语言&#xff0c;极大地推动了科技成果的国际传播与合作。在国际上&#xff0c;科学家们在发表论文、报告研究…

.NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库

一、效果 记录日志为文档 记录日志到数据库 二、添加NuGet包 三、log4net.config代码配置 <?xml version"1.0" encoding"utf-8" ?> <log4net><!-- Debug日志 --><appender name"RollingFileDebug" type"log4net…

三防平板丨平板终端丨三防平板电脑丨建筑工地应用

随着建筑工程越来越复杂和规模越来越大&#xff0c;工地管理和协调变得越来越复杂。在这个过程中&#xff0c;工业设备的作用越来越重要&#xff0c;而三防平板作为一种实用的工业设备&#xff0c;在工地上的应用越来越广泛。本文将介绍三防平板在工地使用中的优势和应用。 一…

[AudioRecorder]iPhone苹果通话录音汉化破解版-使用巨魔安装-ios17绕道目前还不支持

首先你必须有巨魔才能使用&#xff01;&#xff01; 不会安装的&#xff0c;还没安装的移步这里&#xff0c;ios17 以上目前装不了&#xff0c;别看了&#xff1a;永久签名 | 网址分类目录 | 路灯iOS导航-苹果签名实用知识网址导航-各种iOS技巧-后厂村路灯 视频教程 【Audio…

STM32Cubemx TB6612直流电机驱动

一、TB6612FNG TB6612是一个支持双电机的驱动模块&#xff0c;支持PWM调速。PWMA、AIN1、AIN2 为一组控制引脚&#xff0c;PWMA 为 PWM 速度控制引脚&#xff0c;AIN1、AIN2 为方向控制引脚&#xff1b;PWMB、BIN1、BIN2 为一组控制引脚&#xff0c;PWMB 为 PWM 速度控制引脚&…
推荐文章