使用Docker在AWS中创建Swarm集群之前,需要生成一个密钥对,用于通过SSH登录到EC2实例。
要创建新的密钥对,请执行以下命令:
执行aws ec2 create-key-pair命令,并将devops21作为密钥的名字。使用jq过滤输出,只返回实际的值。最后,将输出发送到devops21.pem文件。
如果有人拿到你的密钥文件,你的实例就可以被访问了。因此,应该把钥匙转移到安全的地方。
Linux/OSX系统中放置SSH密钥的一个常用位置是$HOME/.ssh。如果你是Windows用户,可以修改下面的命令以使用你认为合适的任何位置:
我们还应该修改权限,只给当前用户读权限,并删除其他用户或组的所有权限。Windows用户可以跳过下面的命令:
最后,将密钥的路径设置在环境变量KEY_PATH中:
现在已经准备好了在AWS中使用Docker创建Swarm集群。
请打开Docker for AWS Release Notes页面(https://docs.docker.com/docker-for-aws/release-notes/)并点击“Deploy Docker Community Edition for AWS”按钮。
登录到AWS控制台后,将会看到Select Template页面。它是一个通用的CloudFormation页面,已经选择了Docker for AWS模板,如图12-1所示。
图12-1 Docker for AWS Select Template页面
没有其他需要做的了,所以请点击“Next”按钮。
下一页面允许我们指定将要启动的栈的细节。这些字段的意思应该很清楚。我们要做的唯一修改是将Swarm workers从5减少到1。本章的练习不需要超过四台服务器,所以三个managers和一个worker应该足够了。我们会使用默认的实例类型t2.micro。只创建四个微节点,整个练习的成本几乎可以忽略不计,你也不会向朋友抱怨因为我而破产。总成本可能比你读本书时喝的一罐苏打水或一杯咖啡的价格还要低。
Which SSH key to use?字段应该包含我们刚刚创建的密钥devops21。请选择它,如图12-2所示。
点击“Next”按钮。
图12-2 Docker for AWS指定详细信息页面
我们不会改变Options页面上的任何内容。稍后,当你熟悉了AWS中的Docker后,可能想要回到这个页面修改其他选项。现在请忽略它的存在,如图12-3所示。
图12-3 Docker for AWS Options页面
点击“Next”按钮。
我们到达了最后一个页面。请检查与栈有关的信息。完成后,选择“I acknowledge that AWS CloudFormation might create IAM resources”复选框,然后点击“Create”按钮,如图12-4所示。
图12-4 Docker for AWS Review页面
你会看到允许创建新栈的页面。请单击位于右上角的“refresh”按钮。你将看到Docker栈的状态是CREATE_IN_PROCESS。
创建所有资源需要花点时间。如果你想查看进度,请选择Docker stack并单击位于页面右下角的“restore”按钮。你将看到Docker for AWS模板生成的所有事件的列表。在等待栈创建完成时,请随意查看选项卡的内容,如图12-5所示。
图12-5 Docker for AWS stack status页面
一旦Docker stack的状态变为CREATE_COMPLETE,就可以继续了。
集群已经准备好了,可以进入一个manager实例并浏览集群的详细信息。
若要查找有关Swarm manager实例的信息,请单击“Outputs”选项卡,如图12-6所示。
图12-6 Docker for AWS Stack outputs页面
你将看到两行。
我们将DefaultDNSTarget的值保存在环境变量中。它很快就会派上用场:
请将[…]替换为DefaultDNSTarget实际的值。
如果这是一个“真正的”生产集群,则将使用它来更新DNS记录。这是你系统的公开入口。
单击“Managers”列旁边的链接,你将看到EC2 Instances页面,该页面只包含manager节点。workers节点被隐藏了,如图12-7所示。
图12-7 被manager节点过滤的Docker for AWS EC2实例
选择一个manager并找到它的公开IP。和DNS一样,我们将它保存在环境变量中:
请将[…]替换为实际的公开IP地址。
最后,我们准备好了登录到一个manager中,并探索刚刚创建的集群:
一旦登录到服务器,就将收到一条欢迎消息。专门为这个栈制作的OS非常简约,就像这条消息一样:
与往常一样,我们将列出构成集群的节点:
输出如下(为简洁起见,移除了ID):
剩下的事情就是创建一些服务,以确认集群工作正常。
与使用Docker Machine创建集群一样,我们将部署相同的Compose文件vfarcic/docker-flow-proxy/docker-compose-stack.yml(https://github.com/vfarcic/ docker-flow-proxy/blob/master/docker-compose-stack.yml)和vfarcic/go-demo/docker-compose-stack.yml(https://github.com/vfarcic/go-demo/blob/master/docker-compose-stack.yml):
下载Compose文件并部署该栈。
让我们确认服务确实已经启动并正在运行:
一段时间后,输出如下(为简洁起见,移除了ID):
让我们退出服务器,并确认go-demo服务是可以公开访问的:
正如预期的那样,我们收到的响应确认了该集群已投入运行并可访问:
如果服务器变得过于拥挤将会发生什么?需要扩容吗?如何增加(或减少)构成集群的节点数量?答案在于AWS Auto Scaling Groups。请点击EC2控制台左侧菜单AUTO SCALING group中的Auto Scaling Groups链接,并选择组名字以Docker-NodeAsg开头的行,如图12-8所示。(www.xing528.com)
图12-8 Docker for AWS Auto Scaling Groups
要增加或减少节点的数量,只需点击Actions菜单中的“Edit”按钮,将Desired字段的值从1改为2,然后点击“Save”按钮。Desired实例的数量将立刻变为2。然而,实例的实际数量可能需要一段时间才能与期望的数量一致。让我们登录到一个manager服务器,以确认我们想要做的确实发生了:
创建新的实例并将其加入集群可能需要一段时间。最终结果应该如下所示(为简洁起见,移除了ID):
如果其中一台服务器失效,会发生什么?毕竟,一切迟早都会失效的。可以通过删除其中一个节点来测试这种情况。
请点击EC2控制台左侧菜单中的Instances链接,选择一个Docker-worker节点,点击“Actions”按钮,并将实例的状态改为Terminate。
点击“Yes”按钮、“Terminate”按钮确认终止:
一段时间后,node ls命令的输出应该如下(为简洁起见,移除了ID):
一旦auto scaling group意识到该节点已停机,它就会启动创建新节点并将其加入集群中:
不久后,node ls命令的输出应该如下(为简洁起见,移除了ID):
终止的服务器仍然被标记为Down,并创建了一个新的服务器并将其添加到集群中。
AWS中Docker栈的内容比我们涉及的要多得多。我希望你在这次简短的探索中,能够给你提供足够的基本信息来扩展自己的知识。
与其探讨更多关于栈的细节,不如看看如何在不需要UI的情况下实现相同的结果。此时你应该足够了解我,我更喜欢自动化和可重复的任务运行方式。打破了我的“除非必要不用UI”规则,只是为了让你更好地理解AWS中Docker栈是如何工作的。接下来是一种完全自动化的方法。
在继续之前,我们将删除栈,并与其一起删除集群。这将是你在本章中最后一次看到UI。
请点击顶部菜单中的Services链接,然后点击CloudFormation链接。选择Docker栈,然后点击Actions菜单中的Delete Stack选项,如图12-9所示。
图12-9 Docker for AWS Delete Stack页面
点击Delete Stack后,再点击“Yes”按钮、“Delete”按钮确认删除。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。