云原生之容器编排-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可能更为适合,适合才是最好的,系统架构师需要根据公司实际情况进行慎重选择。

         

         

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】模板(超详细!!!!!!)

文章目录 前言1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则2.6 声明和定义分离 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化 4. 模板分离编译4.1 什么是分离编译4.2 模板的分离编译 总结 前言 …

python-分享篇-GUI界面开发-PyQt5-禁止窗体显示最大化按钮及调整窗体大小

代码 # -*- coding: utf-8 -*-# Form implementation generated from reading ui file nochange.ui # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! 禁止窗体显示最大化按钮及调整窗体大小from PyQt5 import QtCo…

CleanMyMac X2024中文版值不值得考虑下载?

CleanMyMac X是一款值得考虑的Mac电脑清理和优化工具。它提供了多种功能&#xff0c;如智能清理、系统垃圾清理、恶意软件移除、个人隐私保护、优化加速等&#xff0c;可以帮助用户解决Mac系统维护问题&#xff0c;保持Mac电脑的最佳运行状态。 CleanMyMac X全新版下载如下: …

C++的进阶泛型编程学习(1):函数模板的基本概念和机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、模板1.1 模板的概念1.1.1 形象的解释&#xff1a;模板就是通用的模具&#xff0c;目的是提高通用性1.1.1 模板的特点&#xff1a;1.1.2 综述模板的作用 1.2…

上位机图像处理和嵌入式模块部署(上位机主要功能)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前关于机器视觉方面&#xff0c;相关的软件很多。比如说商业化的halcon、vision pro、vision master&#xff0c;当然也可以用opencv、pytorch自…

计算机服务器中了360后缀勒索病毒怎么办?360后缀勒索病毒处理流程

网络技术的不断应用与发展&#xff0c;为企业的生产运营提供了有利保障&#xff0c;越来越多的企业走向数字化办公模式&#xff0c;并且企业的发展离不开数据支撑&#xff0c;重视数据安全成为了众多企业关心的主要话题。春节前后&#xff0c;云天数据恢复中心接到很多企业的求…

用163邮箱或者outlook接收国科大邮箱的邮件

使用如图下路径&#xff0c;创建一个新的密码&#xff0c;用于在163大师邮箱或者outlook登录即可 如果不行&#xff0c;则需要手动配置邮箱服务器 参考网址&#xff1a;中国科学院邮件系统帮助中心

cool Node后端 中实现中间件的书写

1.需求 在node后端中&#xff0c;想实现一个专门鉴权的文件配置&#xff0c;可以这样来解释 就是 有些接口需要token调用接口&#xff0c;有些接口不需要使用token 调用 这期来详细说明一下 什么是中间件中间件顾名思义是指在请求和响应中间,进行请求数据的拦截处理&#xf…

【sql】sqlite3数据库

一、介绍 SQLite是一个轻量级的、开源的嵌入式数据库&#xff0c;由D. Richard Hipp使用C语言编写。由于其资源占用少、性能良好和零管理成本的特点&#xff0c;SQLite在嵌入式系统中得到了广泛应用&#xff0c;如Android和iPhone等操作系统中都有内置的SQLite数据库供开发人员…

尚硅谷最新Node.js 学习笔记(二)

目录 五、HTTP协议 5.1、概念 5.2、请求报文的组成 5.3、HTTP 的请求行 5.4、HTTP 的请求头 5.5、HTTP 的请求体 5.6、响应报文的组成 5.7、创建HTTP服务 操作步骤 测试 注意事项 5.8、浏览器查看 HTTP 报文 查看请求行和请求头 查看请求体 查看URL查询字符串 …

如何在Django中使用分布式定时任务并结合消息队列

如何在Django中使用分布式定时任务并结合消息队列 如何在Django中使用分布式定时任务并结合消息队列项目背景与意义实现步骤1. 安装Celery和Django-celery-beat2. 配置Celery3. 配置Django-celery-beat4. 定义定时任务5. 启动Celery worker 和 beat6. Celery 指令7. 对接消息队…

ClickHouse--08--SQL DDL 操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SQL DDL 操作1 创建库2 查看数据库3 删除库4 创建表5 查看表6 查看表的定义7 查看表的字段8 删除表9 修改表9.1 添加列9.2 删除列9.3 清空列9.4 给列修改注释9.5 修…

基于LightGBM的回归任务案例

在本文中&#xff0c;我们将学习先进的机器学习模型之一&#xff1a;Lightgbm。在对XGB模型进行了越来越多的改进以获得更好的性能之后&#xff0c;XGBoost是一种极限梯度提升机器&#xff0c;但通过lightgbm&#xff0c;我们可以在没有太多计算的情况下实现类似或更好的结果&a…

对(一维)数组与指针的深入理解(1)

目录 1.数组名的理解2.使用指针访问&#xff08;一维&#xff09;数组3.&#xff08;一维&#xff09;数组传参的本质 1.数组名的理解 以前我们在使用指针访问数组内容时&#xff0c;有这样的代码&#xff1a; #include <stdio.h>int main() {int arr[10] { 1,2,3,4,5…

CTF-web 之 burp suite 使用

burp suite 使用 一般其是作为一个辅助工具&#xff0c;直接使用来解题的部分是少数&#xff0c;我们可以使用它来观察请 求和响应&#xff0c;并且可以反复的提交&#xff0c;关键的是他还带有很多其他的功能&#xff0c;在我们做题的过程中&#xff0c; 使用的关键点包括&…

C++LNK1207中的 PDB 格式不兼容;请删除并重新生成

在打开别人发的C文件时&#xff0c;可能出现该报错 解决办法 打开资源管理器&#xff0c;找到原来的路径 进入Debug&#xff0c; 找到对应的PDB文件删除即可。

OpenAI ChatGPT 记忆功能怎么实现?

你的聊天助手现在能“记住”你的对话了&#xff01; 2月14日凌晨&#xff0c;OpenAI宣布正在测试ChatGPT的新功能——记住用户提问内容&#xff0c;并自由控制内存。这意味着&#xff0c;ChatGPT能帮你记住那些重要的聊天内容&#xff0c;让你的对话更流畅、更自然。 想象一下…

政安晨:【示例演绎】【用TensorFlow编写线性分类器】—— 同时了解一点TensorFlow与Keras的基本概念

环境准备 如果小伙伴们第一次接触TensorFlow与Keras&#xff0c;可以先看一下我的这篇文章做些环境准备&#xff08;可以先忽略这篇文章里面代码实现部分&#xff0c;仅查看这里的环境准备部分即可&#xff09;。 文章如下&#xff1a; 政安晨&#xff1a;【详细解析】【用T…

Ps:焦点堆栈

焦点堆栈 Focus Stacking是一种摄影和图像处理技术&#xff0c;通过合并多张在不同焦距拍摄的照片来创建一张具有更大景深的图像&#xff0c;特别适用于微距摄影、风景摄影和任何需要在整个场景中保持尖锐对焦的情况。 ◆ ◆ ◆ 拍摄注意事项 1、使用三脚架 为了确保图像之间…

Spring 事务原理总结四

作为一名认知有限的中国人&#xff0c;我对年的喜爱&#xff0c;胜过其他一切&#xff0c;因为它给了我拒绝一切的合理理由。每到这个时候&#xff0c;我都会用各种理由来为自己的不作为开脱&#xff0c;今年亦是如此。看着频频发出警报的假期余额&#xff0c;我内心的焦躁变得…