V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dataman
V2EX  ›  推广

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

  •  
  •   dataman · 2017-05-04 18:25:48 +08:00 · 3860 次点击
    这是一个创建于 2564 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数人云今天带来的本篇文章将分享 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 条回复    2017-05-05 00:25:03 +08:00
    YzSama
        1
    YzSama  
       2017-05-05 00:25:03 +08:00 via iPhone
    mark 一下。明天再看。。😏😏
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2841 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:55 · PVG 17:55 · LAX 02:55 · JFK 05:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.