在AWS上设置Docker Swarm Mode

在之前文章“2016年容器技术思考: Docker, Kubernetes, Mesos将走向何方?” 中作者介绍了Swarm。在Docker 的 1.12 内置了 Swarm(准确的说是 SwarmKit),几个命令就将多个单机版本的 Docker daemon 变成一个 cluster,还支持了 service 概念(多个容器实例副本的抽象),1.13 支持了 stack 的概念(多个 service 的组合) 和 Compose(编排定义文件),基本上一个略完备的编排调度系统已经成型。本文作者Jim Rohrer将介绍在AWS上设置Docker Swarm Mode,供已经熟悉使用Kubernetes同学增加知识点学习使用Swarm。如果你是更想了AWS上使用K8S,你可以查看中文文档 AWS EC2快速入门好了,现在开始在AWS上设置Docker Swarm Mode正文部分。

Docker Swarm Mode是广大容器编排系统领域里的新成员。Docker Swarm最初作为单独产品发布,在一个服务器集群上运行master和代理容器来进行容器编排部署。随着2016年7月Docker1.12发布,它改变了。Docker Swarm Mode现在是docker-engine正式的一部分,集成到每个Docker安装内。Swarm Mode比单独Swarm产品带来许多改进,包括:

  • 内置服务发现:为了服务发现,Docker Swarm最初包含驱动来与Consul,etcd或者Zookeeper集成。然而,这需要一个单独的集群设置用于服务发现。Swarm Mode现在管理nodes,在集群中分配一个唯一的DNS名称给每个服务,并且在这些服务内,运行中的容器间负载均衡。
  • Mesh routing:Docker Swarm Mode最独特的特点之一就是mesh routing。在一个集群内的所有节点通过gossip知道集群内每个容器的位置。这意味着如果一个请求到达一个节点,当前运行的服务不是为该请求而打算,请求将发送到一个正在运行该服务的容器的节点上。这么做以便不需要为特定服务创建节点。任何节点可以运行任何服务,并且每个节点可以平等的负载均衡,减少复杂性,和一个应用所需要的资源数目。
  • 安全:Docker Swarm Mode在服务和默认节点间使用TLS加密通讯。
  • Docker API:Docker Swarm Mode利用同样的API,每个Docker的使用者都已经熟悉。无需安装或学习额外的软件。
  • 但是等等,还有更多!在Docker的Swarm Mode Overview (https://docs.docker.com/engine/swarm/)页面上看一些其他的特点。

企业面临Docker容器部署和管理上日益复杂,Docker Swarm Mode提供一个方便的、成本效益好的,和性能工具来满足这些需求。

 

20170224204009

 

为了简单点,我就不在这重复一些内容和复习手工集群创建了。反而,我支持你在Docker官网上看fantastic tutorial (https://docs.docker.com/engine/swarm/swarm-tutorial/)。

我将说说Docker最近发布的新的Docker for AWS(https://docs.docker.com/docker-for-aws/) 工具。这是一个AWS Cloudformation模板,可以用来快速简单的设置一个高可用Docker Swarm集群必要的资源,因为它是一个Cloudformation模板,你可以编辑模板增加任何额外的资源,例如Route53 hosted zones 或者S3 buckets 到应用。

这个工具非常有趣的特点之一就是它为Elastic Load Balancer (ELB).动态配置listeners。一旦你在Docker Swarm上部署一个服务,内置的管理服务baked 到Docker for AWS启动的实例中,将会为服务任何发布的端口自动创建一个listener。当一个服务迁移,listener也会随之删除。

如果你想创建一个Docker for AWS堆栈,仔细阅读 list of prerequisites(https://docs.docker.com/docker-for-aws/#/prerequisites),然后点击下面的Launch Stack按钮。记住你可能需要支付创建资源的费用。如果你正在部署Docker for AWS到一个仍然有EC2-Classic的老账户中,或者希望部署Docker for AWS到一个现有的VPC中,看下这个read the FAQ here (https://docs.docker.com/docker-for-aws/faqs/#/how-can-i-use-docker-for-aws-with-an-aws-account-in-an-ec2-classic-region)。

随着在2017年1月发布的Docker1.13,主要的改进是增加了Docker Swarm Mode,很大的提高了易用性。Docker Swarm Mode现在直接与Docker Compose v3合并,并且通过docker-compose.yml 文件公开支持“stacks”部署(服务群)。随着在 Docker Compose v3中新的属性被推出,它可以通过tags规定node的亲和性,rolling update机制,重启机制,和设计容器扩展。同样的docker-compose.yml文件可以用来测试本地应用,现在可以用来部署到生产环境。这有个具有一些新属性的样本服务:

version: "3"
services:
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
     - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == worker]
networks:
  frontend:

当在这个YAML结构内大部分的属性,任何人都将很熟悉使用Docker Compose v2,v3的depoly属性是新的。replicas 字段显示服务内容器运行的数量。update_config字段告诉swarm多少容器在并行中更新,并且在更新间要等多久。当一个容器需要重启时restart_policy字段进行确定。最后placement字段允许容器与基于tags或node属性的设置亲和,例如Node Role。当部署本地docker-compose文件,使用docker-compose up,depoly属性简单忽略。

部署一个stack是非常简单的,下载Docker’s example voting app stack file(https://github.com/docker/example-voting-app/blob/master/docker-stack.yml) 并跟着步骤操作,在你的集群上运行一下。

SSH into any one of your Manager nodes with the user 'docker' and the EC2 Keypair you specified when you launched the stack.

curl -O https://raw.githubusercontent.com/docker/example-voting-app/master/docker-stack.yml

docker stack deploy -c docker-stack.yml vote

现在可以看到Docker创建了服务,卷和网络。现在运行接下来的命令,观察stack的状态和在它内部运行的服务。

docker stack ps vote

你会得到类似这样的输出:

 

20170224204000

 

这显示了容器的id,容器名称,容器镜像,节点上当前运行的容器,它的需求和当前的状态,和可能发生的任何错误。如你所见,vote_visualizer.1 容器在运行时间失败,因此它关闭了,一个新容器spun up来代替它。

这个样本应用在 Elastic Load Balancer (ELB)上开放了3个端口:5000给投票接口,5001给实时的投票接口,8080给Docker Swarm visualizer。你可以通过AWS控制台的任一将要到EC2 Load Balancers(负载均衡)页面发现ELB的DNS Name,或者在AWS控制台的Cloudformation 页面观察Cloudformation 堆栈输出tab。这有一个 Cloudformation输出tab例子:

 

20170224204018

 

默认的DNS Target是你可以使用进入应用的URL。

如果你在8080端口进入Visualizer,你将看到一个属性类似下面这样:

 

20170224204026

 

这是一个方便的工具来看哪个容器正在运行,在哪个节点上。

扩展服务

扩展服务很简单,运行命令docker service scale SERVICENAME=REPLICAS,例如:

docker service scale vote_vote=3

那个命令将扩展投票服务到3个容器,从2个提升。因为Docker Swarm使用覆盖网络,它可以在同样的节点上运行同样服务的多个容器,允许扩展服务与你的CPU和内存分配允许的一样高。

如果你对 docker-compose文件做任何改变,更新stack非常容易。只要运行之前用来创建stack同样的命令就可以了:

docker stack deploy -c docker-stack.yml vote

Docker Swarm将更新从上个版本改变的任何服务,并且遵守任何update_configs 在docker-compose文件中指定的内容。在上述投票服务指定的情况下,只有一个容器将更新一次,一旦在第二个容器更新前第一个容器成功更新,将会发生10秒的延迟。

下一步计划

这只是一个Docker1.13里Docker Swarm Mode性能的简短概述。为了进一步阅读,可随意看看Docker Swarm Modeand Docker Compose 文档。在其他文章里,我将重温一些Docker Swarm Mode相比其他容器编排系统的优缺点,比如ECS和Kubernetes。