V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
如果想在 V2EX 获得更好的推广效果,欢迎了解 PRO 会员机制:
https://www.v2ex.com/pro/about
dataman
V2EX  ›  推广

关于 Docker Swarm,你可能需要了解更多实践经验

  •  
  •   dataman · May 4, 2017 · 4443 views
    This topic created in 3290 days ago, the information mentioned may be changed or developed.

    数人云今天带来的本篇文章将分享 Docker 在应用程序生命周期每个阶段中所扮演的角色,以及迁移到 Swarm 集群时需要考虑的问题。

    利用 Docker 来开发

    Docker 让工作更轻松。如需要一个部署安装 MySQL 数据库,或者安装 Ghost,又或者 Redis 数据库,PostgreSQL,Ruby 等。实际上这些都已经被 Docker 化容器化和镜像化。

    只需要一条命令即可运行:

    docker run name_of_programe_you_need
    

    下载(镜像)—使用完—丢掉,没有其他程序搞乱本地开发环境。

    扩展现有的容器十分简单,只要拥有足够的 Docker 基础知识,就能判定从网上下载的 Docker 镜像是否是有用的镜像。

    Docker 是开发人员的利器,添加到开发环境中好处无需多言。

    若熟悉 Docker,  会经常使用 Docker-compose 一条命令来启动整个开发环境栈。

    例如,很常见的 Docker-compose 文件是这样:

    version: '2'  
    services:  
      web:
        build: .
        command: npm run dev
        ports: 
          - 8080:80
    
      redis:
        image: redis
    
      database:
        image: postgres
    

    然后运行:

    docker-compose up # --build if you want to rebuild
    

    PostgreSQL 访问地址:postgresql://database

    Redis 访问地址: http://redis

    这是一种极为简便的方法,整个开发环境栈用几行代码描述( development stack as a code ),并且内置版本控制功能。下面来讲下生产环境。

    生产环境要求

    生产环境非同一般。这里例举中等负载量的服务器要求——

    • 可用性: 必须所有的时间点上,服务都是可用的,尽可能减少宕机时间。

    • 性能: 服务器需要处理大量的访客请求,故而性能也很重要。

    • 易于部署和回滚。

    • 收集日志和指标。

    • 负载均衡: 如果有某些服务或者服务器失败了,我们期望网站可以正常访问。

    Docker 作为一个准生产的解决方案,实际上被非常多的人低估了。约一年前,PvP Center ( https://beta.pvpc.eu/)过程中,因 Docker 文件系统问题,也经历了一些失败(目前,我使用 Overlay2 文件系统,问题不复存在),现在回头想一下,这是很好的决定。

    生产部署是使用原始 Docker 命令还是 Docker-compose

    若遇到这个问题,配置好 Ansible 自动下载新版本的应用,然后自动部署到容器即可( Ansible 配置文件: https://rock-it.pl/managing-multiple-environments-with-ansible-best-practices )。 接下来查看列表——

    • 性能:Docker 进程,是正常的内核进程,不会产生显著的资源开销。
    • 易于部署: 一键部署。因 Ansible 要检查多个判断条件, 不仅仅是是判断容器的版本,所以需要花费一点时间。
    • 回滚: 所有的容器镜像都使用不同的标签后,保存在容器仓库中。对数据库迁移做了向后兼容,回滚会很容易。

    但以上的做法也会产生问题:

    1、不能满足一些非常规要求(在要求部署应用的时候服务器零宕机) 因为要维护后端动态的负载均衡节点,不能轻易的扩容到多台服务器上。

    2、需要极聪明的手段和方法才能整合 持续集成 /持续部署系统( CI/CD )。

    3、如果分别存放特定应用程序,满足部署依赖在不同的架构仓库内 。当配置文件发生变化时,回滚变得非常困难。

    坚持了这种做法一段时间,没有任何问题,但是总感觉缺失了什么东西,因为快速部署以及配置文件需要太多修改,Ansible 部署也刺激到了我(太慢了)。但是,真正促使往 Docker Swarm 迁移的决定性原因是——扩容到一台服务器以的特性。虽然可以使用相同的方式部署应用到云端,使用外部负载均衡器,但动态添加或者减少负载均衡节点依旧是痛点。把特定应用的配置文件从 Ansible 中移除,转而把这些配置文件发到应用仓库中。

    Docker Swarm

    Docker Swarm 设计的目的是方便地使用 Docker 命令来管理多台服务器之间的容器调度,是相当前沿的新功能新特性(从 Docker 1.12 版本开始)。

    • 要点:允许同时连接到多台运行 Docker 的服务器上。

    • 比较简单:对比 Kubernetes,Docker Swarm 上手更快。

    • 高可用 – 集群中有二种不同类型的节点:Master 节点和 Worker 节点。

    其中的一个 Master 节点是 Leader, 如果当前 Leader 宕机不可用,其他健康的 Master 中的一台会自动成为 Leader。如果 Worker 节点宕机不可用,宕机节点上的容器实例会被重新调度到其他健康的 Worker 节点上。

    • 声明式配置:只需明确发布什么应用以及多少份实例副本,调度系统会自动调度发布这些应用实例,并且遵循指定的限制条件等。

    • 滚动更新:Swarm 保存了发布容器时候的配置。 若新了配置文件,容器也会批量更新,所以服务会是一直是可用的。

    • 内置服务发现和负载均衡 :与 Docker-compose 实现的负载均衡类似。可以通过参考服务名,容器跑在哪里哪台服务器上已经完全不重要,这些负载均衡节点都会接收前端导过来的流量,默认是轮询策略。

    • Overlay 网络:如果容器暴露了一个服务端口,这个服务端口在集群内都可以被访问。这对使用外部负载均衡器帮助巨大。

    在什么时候才应该考虑使用 Docker Swarm

    在考虑使用 Docker Swarm 前,先过一遍下面 5 个问题——

    • 应用是否需要扩容到两台以上的服务器上?多台服务器总是比单台服务器复杂,或者只是想购买更高配置的单台服务器(译者注: 纵向扩展)?

    • 应用是否有高可用的要求?

    • 应用容器化后是否真的是无状态化的?在 Swarm 下跑容器不应该使用存储卷,虽然理论上是可以使用存储卷,但是在测试使用的时候,它依旧不是稳定可靠的。可以考虑把多媒体文件移到亚马逊 S3 上,而把数据库运行在 Docker Swarm 之外。

    • 是否有集成日志系统,例如 ELK (这个适用于所有分布式系统)。

    • 是否需要已经存在于其他更成熟解决方案(如 Kubernetes )中的高级功能和特性? 谨记,熟悉 Kubernetes 比熟悉 Docker Swarm 要难得多。

    生产环境使用 Docker Swarm 经验

    截止目前,应用跑在 Swarm 上面已经有六个月的时间,从 Docker-compose 迁移到 Swarm 花去一周的时间(包括学习如何迁移等)。需要调整配置文件,以便让应用容器完全是无状态的,使用外部集中式日志和指标收集。高峰时,共运行了 35 个节点。对集群的管理十分方便。

    例如:

    docker service scale name_of_service=30 or docker service update --env-add SECRET_ENV=youdontneedtoknowit name_of_service
    

    截屏如下:

    1.png 部署流程如下图:

    在 Deploy 区域内,使用最新 Docker-compose v3 版的语法和 Docker stack deploy 命令。把发布应用容器的配置文件存储为 VCS 这项工作变得前所未有的简单。无需要手工修改任何配置,轻松地部署应用容器到 Swarm 集群。

    配置文件例子:

    version: '3' 
    services: 
      web:
        image: registry.gitlab.com/example/example  # you need to use external image
        command: npm run prod
        ports:
          - 80:80
        deploy:
          replicas: 6
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    

    整个部署命令只有一行:docker stack deploy application . 当然,这里使用了 Gitlab.com 的流程,结果如下图所示:

    可以在 Web 界面上进行回滚操作,甚至在手机上执行回滚操作。

    结语

    以上都是个人对 Docker Swarm 的观点。之前考虑过使用其他选项,但如果想让应用容器化,进而伸缩扩容到多台服务器上,目前这种方法是最好的选择。

    原文作者:Jakub Skałecki 原文链接: https://rock-it.pl/my-experience-with-docker-swarm-when-you-need-it/

    欢迎关注数人云微信公众号,如有后续文章,我们会在第一时间进行跟进

    1 replies    2017-05-05 00:25:03 +08:00
    YzSama
        1
    YzSama  
       May 5, 2017 via iPhone
    mark 一下。明天再看。。😏😏
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2929 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 15:26 · PVG 23:26 · LAX 08:26 · JFK 11:26
    ♥ Do have faith in what you're doing.