一、Docker Swarm上的容器选择

并非所有服务都应该部署在Swarm集群内。数据库以及其他有状态服务就不适合部署在Swarm集群内。

理论上,你可以通过使用labels将容器部署到特定节点上,但是这样的话,Swarm集群外的节点就很难访问它们了(Docker 1.12没有很好的方法,但是1.13之后可以使用attachable network)。

如果你允许集群外的节点访问数据库,则所有节点都可以访问它,这显然不符合你的需求。

另外,Docker Swarm的跨节点数据卷(cross-host mounted volumes)并不可靠,一个简单的文件上传都可能引起问题。

无状态的容器就非常适合部署在Swarm集群中,它们可以由环境变量进行配置(使用ENV指令)。建议为开源工具构建镜像,例如,可以将Nginx的配置文件放到Docker镜像中。

在Swarm集群中的服务:

  • Django channels (网页应用)
  • Nginx(代理)
  • Celery(周期性任务)
  • Sensu(监控)

在Swarm集群之外的容器:

  • Mysql(数据库)
  • Redis(缓存)

由于一个获取真正IP的问题,我很可能会将Nginx运行在Swarm集群之外,或者采用host模式。

二、设置资源限制

就经验而言,可以为所有服务设置CPU使用限制。当某一个容器应用占用掉所有主机资源时,此限制可以避免这种情况发生。

当想把所有容器均匀地发布在所有主机上或是想确保有足够的资源来响应操作时,需使用Reserve-cpu这个参数。

例如:

# 限制服务占用的CPU资源
docker service update
--limit-cpu 0.25
--reserve-cpu 0.1
webapp

三、将半无状态的服务变得完全无状态

所谓半无状态服务,就是容器需要依赖一些不太重要的外部文件。你可以使用数据卷(volume),但是更好的选择是使用S3或者其他云存储服务。

记住,想要获得扩展性,云是最好的选择。

例如,我不得不构建Nginx镜像,将配置文件放到镜像中。使用数据卷挂载Nginx配置文件不是很方便。

四、创建可附加的网络

network是一个非常重要的特性。你最好使用它,否则docker run创建的容器将无法接入Swarm集群的网络,特别是跨宿主机通讯时。

这是Docker 1.13之后的版本才有的功能,也许你需要升级。

创建network的命令如下:

docker network create --driver=overlay --attachable core

五、增加环境变量

如果创建Docker镜像的时候,遵循了最佳实践原则(https://rock-it.pl/how-to-wri...),允许在运行的时候通过环境变量设置一切配置项,那么把应用迁到Swarm的过程完全没有问题。

相关命令:

# 创建服务时指定环境变量
docker service create \
--env VAR=VALUE \
--env-file FILENAME \
...

# 增加、删除环境变量
docker service update \
--env-add VAR=NEW_VALUE \
--env-rm VAR \
..

六、设置适当实例和批量更新

保持适当数量的实例,以应对高流量和实例或者节点不可用的情况。同时太多的实例数也会占用CPU和内存,并且导致争抢CUP资源。

update-parallelism的默认值是1,默认只有一个实例在运行。但这个更新速度太慢了,建议是 replicas / 2。

相关命令:

# 将同时更新的容器数设为10
docker service update \
--update-parallelism 10 \
webapp # 同时增加多个服务的容器数
docker service scale redis=1 nginx=4 webapp=20 # 查看服务状态
docker service ls # 查看服务的详情(排除关闭的容器)
docker service ps webapp | grep -v "Shutdown"

七、把Swarm配置保存为代码

最好使用Docker Compose v3版本的语法(https://docs.docker.com/compo...)。

他允许使用代码指定几乎所有的服务选项。作者在开发的时候使用 Docker-compose.yml,在生产环境(swarm)配置使用 Docker-compose.prod.yml . 部署Docker-compose文件中所描述的服务,需要Docker stack deploy 命令(属于新版本 Stack命令集合中的一部分[https://docs.docker.com/engin...

Docker compose v3例子:

version: '3'
services:
webapp:
image: registry.example.com/webapp
networks:
- ingress
deploy:
replicas: ${WEBAPP_REPLICAS}
mode: replicated
restart_policy:
condition: on-failure proxy:
image: registry.example.com/webapp-nginx-proxy
networks:
- ingress
ports:
- 80:80
- 443:443
deploy:
replicas: ${NGINX_REPLICAS}
mode: replicated
restart_policy:
condition: on-failure networks:
ingress:
external: true

部署的例子(创建或者更新服务):

export NGINX_REPLICAS=2 WEBAPP_REPLICAS=5

docker login registry.example.com
docker stack deploy \
-c docker-compose.prod.yml\
--with-registry-auth \
frontend

提示:Docker-compose文件支持环境变量 (${VARIABLE}), 所以,可以动态调整配置作为测试等。

八、配置日志收集服务

使用分布式系统时,集中管理日志是非常必要的。我们有很多方案,包括开源工具或者SaaS服务,比如ELK,Grafana, Graylog…自己搭建完整的系统是非常复杂的,所以我建议搭建先使用SaaS服务(比如LogglyLogentries),当费用太高时,则自己搭建一个系统。ELK可以这样配置:

docker service update \
--log-driver gelf \
--log-opt gelf-address=udp://monitoring.example.com:12201 \
--log-opt tag=example-tag \
example-service

参考:https://www.cnblogs.com/fundebug/p/6823897.html

Docker Swarm(十一)生产环境使用的一些建议的更多相关文章

  1. Docker Swarm 集群环境搭建及弹性服务部署

    上一篇文章<Docker Swarm 集群管理利器核心概念扫盲>中我们把 Swarm 重要的概念性知识给大家讲解了一波,理论完事就该实战了,这篇文章带大家从零开始,搭建 Docker Sw ...

  2. 建设Kubernetes生产环境的16条建议

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! Kubernetes是用于构建高度可扩展系统的强大工具. ...

  3. 生产环境下,不建议用早期版本的Mono........

    一个BUG修复需要4年!!!!!!!!!!!!!也是醉了....不造被微软收购后的Xamarin会不会好起来

  4. Docker Swarm 集群管理利器核心概念扫盲

    Swarm 简介 Docker Swarm 是 Docker 官方推出的容器集群管理工具,基于 Go 语言实现.代码开源在:https://github.com/docker/swarm 使用它可以将 ...

  5. 生产环境中使用Docker Swarm的一些建议

    译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...

  6. Docker Swarm(一)集群部署

    一.机器环境 机器规划 172.16.0.89 swarm的manager节点 manager-node 172.16.0.90 swarm的node节点 node1 机器版本(均是:CentOS L ...

  7. Docker Swarm 创建服务

    Docker Swarm 创建服务 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理节点:192.168.1.79 工作节点:192.168.1.78 工作节点 ...

  8. Docker Swarm 服务版本更新与回滚

    Docker Swarm 服务版本更新 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理节点:192.168.1.79 工作节点:192.168.1.78 工作 ...

  9. 云计算之路-阿里云上-2017年最错误的选择: 生产环境使用 docker swarm

    2017年12月29日 10:18 ~ 11:00 左右,由于整个 docker swarm 集群宕机,造成我们迁移至 .net core 跑在 docker swram 上的所有站点无法正常访问,由 ...

随机推荐

  1. 配置IIS虚拟站点(5)

    开发完ASP.NET网站后,想要直接浏览,不通过开发环境,那么就需要配置IIS虚拟站点 1.开始菜单->控制面板->所有控制面板->管理工具->双击打开Internet信息服务 ...

  2. 2021软工-调研作业-Notion

    2021软工-调研作业-Notion 项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 案例分析作业要求 我在这个课程的目标是 学习软件开发的工业化 ...

  3. Java高级【Junit、反射、注解】

    1.Junit单元测试 * 测试分类:     1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值.     2. 白盒测试:需要写代码的.关注程序具体的执行流程. * Junit使用 ...

  4. DevOps之Jenkins相关知识

    目录 认识Jenkins 持续集成 持续交付 Jenkins简介 为什么需要Jenkins Jenkins的目标 Jenkins安装 初次使用Jenkins 加速插件安装 Jenkins-CI Jen ...

  5. Boxes in a Line UVA - 12657

      You have n boxes in a line on the table numbered 1...n from left to right. Your task is to simulat ...

  6. JAVAEE_Servlet_15_HttpServletRequest中常用方法(二)

    HttpServletRequest中常用方法 ## HttpServletRequest中的第二类方法 获取各种路径 和 IP地址 * 获取路径和地址 - 获取ServletContext上下文对象 ...

  7. 使用Power BI构建数据仓库与BI方案

    杀手级特性 今年Power BI的几大杀手级特性的GA,可以让其构建完整的数据仓库/数据湖和BI分析一站式方案. Power BI Premium Per User-超低的价格 Large datas ...

  8. 1026 Table Tennis

    A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For a ...

  9. Android最新敲诈者病毒分析及解锁(11月版)

    一.样本信息 文件名称:久秒名片赞,(无需积分s)(2)(1)(1).apk 文件大小:1497829字节 文件类型:application/jar 病毒类型:Android.CtLocker 样本包 ...

  10. Linux文件共享服务之NFS

    NFS(Network File System) 网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可 ...