[docker swarm] 从单容器走向负载均衡部署

背景

    之前写过<<docker-compose真香>> 和《docker-compose、docker stack前世今生》两篇博客, 回顾一下思路:

① docker-compose是docker引擎之上的容器编排工具,Python语言编写; docker stack 是docker引擎原生支持的容器编排技术(Go语言)

② 两者都支持最近docker-compose.yml 版本3容器编排定义文件,部分指令有差异。

昨天生产环境 .NetCore程序突然爆出错误(1个月前也出现过), 先抛出来给网友看下:

exception happen when [request for 2246:5ead5a42f80e1000100000005d99f945] : System.InvalidOperationException: Stack empty.
   at System.Collections.Generic.Stack`1.ThrowForEmptyStack()
   at System.Collections.Generic.Stack`1.Pop()
   at NLog.NestedDiagnosticsContext.StackPopper.System.IDisposable.Dispose()
   at Microsoft.Extensions.Logging.Logger.Scope.Dispose()
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)

重启容器之后恢复正常 ,( 报错Stack Empty:还比较棘手, 稍后再开篇深究)。

本次借这个机会上手docker swarm

头脑风暴

之前《docker-compose真香》 编排了3个独立的容器,对应docker-compose.yml 文件中3个service,容器之间默认通过service name相互访问, , 如下图

docker-compose定义的service 与docker引擎原生定义的service还不一样:

docker service 可以理解为 发布到生产环境时某组容器的预期状态:当您将service部署到群集,群集manager 接受你的服务定义,并认定为是容器的预期状态;然后将服务安排在群集中可用节点上v,作为副本任务;任务在群集的节点上彼此独立运行。

Swarm never creates individual containers like we did in the previous step of this tutorial; instead, all Swarm workloads are scheduled as services, which are scalable groups of containers with added networking features maintained automatically by Swarm. Furthermore, all Swarm objects can and should be described in manifests called stack files; these YAML files describe all the components and configurations of your Swarm app, and can be used to easily create and destroy your app in any Swarm environment.

Swarm 将所有工作负载安排为服务,这些服务是可伸缩的容器组,具有由Swarm自动维护的附加网络功能。此外,所有Swarm对象都可以并且应该在称为堆栈文件的清单中进行描述。这些YAML文件描述了Swarm应用程序的所有组件和配置,可用于在任何Swarm环境中轻松创建和销毁您的应用程序。

下面演示在单节点上部署 带负载均衡集群应用:

receiver ,app 服务均使用2个示例,每个示例一旦崩溃则重启; 指示所有服务均使用名为webnet的负载平衡网络; 同时利用默认的   docker_gwbridge 网桥访问宿主机。

为啥不直接多节点部署?

上面这个应用,还需要考虑 有状态的Redis服务,暂时没实现。

部署目标:

操作步骤

① 初始化swarm

docker swarm init

② 使用docker stack 部署

docker stack 也使用类似于docker-compose.yml 容器编排文件,上文也提高过,部署指令各自有差异。

上文也提到过,适用于docker-compose工具的yml 文件若迁移到 docker stack, 需要做一点修改。

其中我一直吐槽的,docker stack 默认不能加载 同目录下的.env 环境变量文件, 经过搜索,有一个变通方法,这样你的docker-compose.yml  大概率不需要做大的修改。

docker stack deploy -c <(docker-compose -f docker-stack.yml -f production.yml config) eqidstack

嗯,谷歌大发好。

下面给出适用于生产环境的附加yml文件:

version: "3.7"

services:
  proxy:
    networks:
      - webnet
  receiver:
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
    networks:
      - webnet
    volumes:
      - type: bind
        source: /home/huangjun/eqidmanager/receiver.secrets.json
        target: /app/appsettings.secrets.json
  app:
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
    networks:
      - webnet
    volumes:
      - type: bind
        source: /home/huangjun/eqidmanager/appsettings.secrets.json
        target: /app/appsettings.secrets.json
networks:
  webnet:

更多的部署指令,请参考:

③  三个服务已经在单机节点上部署

#docker stack ls:
NAME                SERVICES            ORCHESTRATOR
eqidstack           3                   Swarm

#docker service ls:
ID                  NAME                 MODE                REPLICAS            IMAGE                        PORTS
bld7jkfi5ony        eqidstack_app        replicated          2/2                 12205599/eqidmanager:v2.3
98u6biliwumw        eqidstack_proxy      replicated          1/1                 nginx:latest                 *:80->80/tcp, *:8080->8080/tcp
g9qy4p2gd2uh        eqidstack_receiver   replicated          2/2                 12205599/eqidreceiver:v2.3   

完成以上操作,这只麻雀虽小的项目SLA应该进一步提升了。

后续集群部署,需要考虑的磁盘,网络、 有状态 知识点更多, 请关注官网。

https://docs.docker.com/get-started/part4/

https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/

https://docs.docker.com/compose/compose-file/

原文地址:https://www.cnblogs.com/JulianHuang/p/11641040.html

时间: 2024-07-28 13:38:19

[docker swarm] 从单容器走向负载均衡部署的相关文章

IceGrid负载均衡部署 z

[IceGrid负载均衡部署步骤]1.环境主机1:IP=192.168.0.239,上面部署注册表服务器registry和节点node1,registry和node1运行在同一进程中:主机2:IP=192.168.0.25,上面部署节点node2:其中每个节点中包含一个服务程序,服务程序均在节点启动时启动. 2.主机1配置(1)服务程序部署XML:app_rep.xml,内容如下<icegrid> <application name="Simple"> #分布式

[转]Nginx反向代理和负载均衡部署指南

Nginx反向代理和负载均衡部署指南 1.        安装 1)         从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最新版本(目前是1.5.13版本)安装包: 2)         解压后复制到部署目录. 2.        启动和停止Nginx Nginx目前只支持命令行操作,操作前先进入Dos命令环境,并进入Nginx部署目录. 1)         启动Nginx:start nginx 2)         停

linux下nginx负载均衡部署

nginx负载均衡部署 Nginx("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 IgorSysoev 为俄罗斯访问量第二的 Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日.其将源代码以类BSD许可证的形式发布,因它的稳定性.丰富的功能集.示例配置文件和低系统资源的消耗而闻名.2011年6月1日,nginx 1.0.4发布. 一般我们都需要先装pcre,

HAproxy负载均衡部署

HAproxy负载均衡部署 1.安装HAproxy yum -y install haproxy 2.编辑配置文件 #--------------------------------------------------------------------- # Example configuration for a possible web application. See the # full configuration options online. # # http://haproxy.1

Docker+nginx+tomcat7配置简单的负载均衡

本文介绍在Docker上配置简单的负载均衡,宿主机为Ubuntu 14.04.2 LTS,两个CentOS容器,宿主机安装Nginx,两台容器安装tomcat7.结构如下: 此方案的原理是将宿主机的端口和docker容器的端口做一个映射(即访问宿主机的某端口会映射到docker容器对应的端口),然后在宿主机通过配置Nginx,即可达到访问宿主机的某端口,按规则分配到指定的服务地址,即完成了负载均衡. 配置步骤 1.准备宿主机,宿主机是Ubuntu 14.04.2 LTS,安装在Vmware中,具

使用nginx的ngx_upstream_jdomain模块实现k8s容器的负载均衡

使用背景最近一直在准备k8s上线事宜,目前已经在测试环境中全面部署并通过压力测试环境检验.离正式上线基本只剩下时间问题.我们目前测试环境中的容器负载均衡大量使用到了nginx,就是借助了ngx_upstream_jdomain模块,从而放弃了k8s官方的ingress. 在这里简单说下k8s的ingress.k8s官方的ingress controller其实也是通过nginx来实现的,但是Ingress本身依赖于service,它通过查询service的映射,来找到service后端的pod的

Docker系列-(3) Docker-compose使用与负载均衡

上一篇文章介绍了docker镜像的制作与发布,本文主要介绍实际docker工程部署中经常用到的docker-compose工具,以及docker的网络配置和负载均衡. Docker-compose介绍 实际开发过程中,在一个项目中,我们常将不同的模块放在单独的docker中,方便维护和扩展.比如我们一个项目可能有MySQL镜像.Nginx镜像.Spring Boot后端镜像,我们在实际部署中可以采用上篇文章介绍的方法,分别打包,分别启动:但是这样太费精力,而且还容易出错. 因此Docker-co

基于vue+springboot+docker网站搭建【九】负载均衡

后台mall-admin 负载均衡 1.新启动一个mall-admin docker实例 docker run -p 9002:9001 --name mall-admin-9002 --link mysql:db -v /etc/localtime:/etc/localtime -v /mydata/app/admin-9002/logs:/var/logs -d mall-admin 端口:9002 实例名字:mall-admin-9002 注意防火墙和阿里云安全组开启9002 2.配置ng

Nginx反向代理和负载均衡部署指南

1.        安装 1)         从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最新版本(目前是1.5.13版本)安装包: 2)         解压后复制到部署目录. 2.        启动和停止Nginx Nginx目前只支持命令行操作,操作前先进入Dos命令环境,并进入Nginx部署目录. 1)         启动Nginx:start nginx 2)         停止Nginx:nginx -s sto