PHP-微服务(五)

62 阅读30分钟

PHP 微服务(五)

原文:zh.annas-archive.org/md5/32377e38e7a2e12adc56f6a343e595a0

译者:飞龙

协议:CC BY-NC-SA 4.0

第十二章:云和 DevOps

我们不希望在没有谈论云和 DevOps 功能的情况下结束这本书。当云平台存在时,在家中拥有服务器不是一个好的解决方案;因此,在本章中,您将了解为什么应该为您的应用程序使用云以及哪个提供商最适合您的需求。此外,您还将学习如何使用自动化工具将您的应用程序部署到这些云平台中。

DevOps 的角色与云密切相关,因此我们将介绍这个主题以及 DevOps 的任务是什么。

什么是云?

解释我们所知的云的最快方法是说云是托管在互联网上的在线服务的交付,但我们也可以说云允许我们以非常简单的方式消耗数字资源。如今使用的一些常见云服务是磁盘存储、虚拟机或电视服务等。正如您所想象的,云的主要好处是我们无需在家中建立和维护这些基础设施。

作为开发人员,您会知道云对我们的应用程序是一个很好的方法。让我们看看一些优势。

可自动扩展和弹性

当您的应用程序在线时,不可能预测未来几个月甚至几天的流量是否会非常高。云允许我们拥有一个自动扩展的基础设施,以匹配我们应用程序的流量或消耗资源。如果您的流量更高,它可以增长;如果您的应用程序没有您希望的流量,它可以减少。

通常,当您想要调整服务器大小时,有三种选项。在下一张图片中,我们将以图形方式向您展示调整服务器大小的不同选项。黄线是您的应用程序可以处理的最大负载,蓝线是您站点的当前负载:

  • 图片 1:在高峰流量发生时使用比您需要的更多的服务器,以避免流量问题。

  • 图片 2:为正常流量使用足够的服务器。您应该知道在特定日期可能会出现问题。例如,如果您的应用是一个在线商店,可能会在像黑色星期五这样的日子出现问题。

  • 图片 3:使用弹性云;根据高峰流量的增加或减少自动添加或移除服务器,以便您始终拥有所需的基础设施。可自动扩展和弹性

调整方式

降低管理工作量

如果您花费时间设置服务器并执行维护任务,那么您正在浪费可以用来改进应用程序的时间。云允许我们只关注我们的应用程序,因为它为我们提供了一种新的开发应用程序的方式,提供了预配置的资源,使我们能够开发应用程序而不必担心我们正在使用的基础设施。

此外,云通常为我们提供完整而有用的仪表板来管理机器,因此我们不再需要使用 SSH 控制台,使我们的任务更加轻松。它甚至为我们提供了更好的方法来管理我们的数据库和负载均衡器或证书。

更便宜

使用云比在家中拥有服务器更便宜。这些节省是因为以下原因:

  • 您只需一直支付您所需的基础设施,因此当您的应用程序的流量增长时,您无需更改您的机器

  • IT 人员(如果您需要他们)将更加高效,因为他们只会专注于云无法帮助解决的问题

请注意,当您支付云服务器时,您不仅支付服务器;此服务器还包括存储、操作系统、虚拟化、物理空间、更新、冷却系统以及许多其他东西,如能源或数据中心运营。

快速增长

这一点与上一点密切相关。如果您的应用程序是新的,而且您不知道它是否会成功,那么购买物理服务器和所有相关事项将不是一个好主意,因为这样可以将您的应用程序上线。

使用云,您可以按月支付所需的服务器,如果应用程序不如预期,您可以降低计划甚至关闭它,这样您将花费更少的资金。

此外,在开始阶段节省资金将使您能够更快地增长,关注并将资金投入应用程序而不是花费在硬件上。

上市时间

如果您想测试新想法并将其上线,云服务将更快。这是云的主要优势,在互联网上非常宝贵。对于大公司来说,要像小公司一样快速发展是非常困难的,云允许它们以一种简单快速的方式在线包含变化,使其成为非常具有竞争力的优势。

选择您的云服务提供商

选择最佳的云服务提供商并不容易,但您可以根据应用程序需求选择最适合它的提供商。

考虑以下事项:

  • 确保您的提供商了解您的需求:您的团队与云服务提供商之间的沟通至关重要。非常重要的是,您的提供商了解诸如每秒读/写次数、用户所在地、是否有并发用户、您的部署脚本如何工作,或者您的开发、暂存和生产环境是什么样的等事项。

  • 我的数据在哪里:云服务器位于某个地方,因此了解它们的位置很重要,因为如果您存储客户数据,法律可能不允许您在某些国家存储数据。

  • 安全性:如果您的应用程序不安全,您随时都面临风险,因此了解您的云服务提供商具有哪些保护系统(如防火墙或硬件隔离)是很重要的,以避免入侵,并了解他们是否提供 24 小时支持。

  • 在迁移应用程序之前进行测试:您的云服务提供商可能允许您在迁移整个应用程序之前测试服务,因此使用此选项以检查服务器是否足够应对您的流量和资源。

亚马逊网络服务(AWS)

互联网巨头亚马逊.com 拥有自己的云。它提供网络托管以及许多其他服务来帮助公司。亚马逊网络服��AWS)上最重要的功能是负载均衡器和将应用程序的某些任务(如处理数据或网络托管)发送到亚马逊的可能性。

总之,AWS 不仅仅是一个简单的云,它包括许多服务(超过 50 个)供网络专家和其他需要亚马逊提供的特定功能的人使用。

亚马逊根据使用时间为我们提供了一些不同的价格计划选项--按小时、按年,甚至 3 年的价格都是 AWS 的可能选择。

云上的一个重要事项是服务级别协议SLA)。对于亚马逊来说,这包括每月 99.95%的正常运行时间保证。

AWS 上的定制工作方式类似于模板;换句话说,目前不可能对应用程序的 CPU、RAM 和空间进行全面配置;您应该在一些模板选项之间进行选择,因此如果您只需要更多的 RAM,您不能只升级 RAM,您应该选择一个可以升级 CPU 和硬盘的不同模板。

通常,云服务器位于世界各地的许多国家。亚马逊 EC2(AWS 的服务器)目前位于北美(16)、南美(3)、欧洲(7)、亚洲(14)。

值得注意的是,目前根据一般共识,AWS 在带宽和处理能力等方面给我们提供了最差的成本效益比。它仍然是市场上功能最完整的解决方案,但可能并不是最适合您的选择。

微软 Azure

Azure 是微软的操作系统,为我们提供了在云上执行和部署应用程序和服务的环境。它为我们提供了自定义环境和位于微软数据中心的服务器。

我们在 Azure 上存储的应用程序应该在 Windows Server 2008 R2 上运行,并且可以在.NET、PHP、C++、Ruby 或 Java 上开发。此外,Azure 还为我们提供了一些数据库机制,如 NoSQL、blobs、消息队列和 NTFS 驱动器来进行读/写磁盘操作。

Windows Azure 的主要优势如下:

  • 降低应用程序的运营成本和配置

  • 对客户需求变化的快速响应

  • 可扩展性

Azure 为我们提供了不同的付款方式,可以按小时支付,也可以进行年度付款。Azure 的 SLA 与亚马逊相同,包括 99.95%的正常运行时间保证,以月为周期;定制也可以使用模板。

Azure 云服务器目前位于北美(9)、南美(1)、欧洲(6)、亚洲(9)和澳大利亚(2)。

总之,亚马逊和 Azure 非常相似;它们之间的主要区别是所使用的操作系统。如果您的应用程序是在.NET 上开发的,或者需要 Windows 服务器,Azure 是最佳选择。

Rackspace

Rackspace 不是最大的(如亚马逊或微软),但在谈论云服务时,它被认为是我们应该提到的一个。

当我们雇佣 Rackspace 时,我们是在支付使用服务的费用,例如当我们需要在特定时刻增加应用程序的容量。Rackspace 的服务器由他们管理,甚至可以只雇佣支持系统,将我们的服务器放在 Rackspace 之外。

Rackspace 为我们提供了支付少于一小时、年度甚至 3 年的选项。SLA 是 99.90%的正常运行时间保证,以月为周期,定制使用模板,与亚马逊和 Azure 一样。

服务器目前位于北美(3)、欧洲(1)、亚洲(1)和澳大利亚(1)。

总之,Rackspace 比亚马逊或 Azure 便宜,是一个非常好的开始使用云的解决方案。此外,它拥有非常好的分布式 DNS,并且他们是 OpenStack 的创造者,这是一种用于通过虚拟化实现云服务器的不同软件组件的开源堆栈。这提供了一个新的仪表板,附加服务与数据库、服务器监控、块存储和虚拟网络的创建。

DigitalOcean

DigitalOcean 是世界上第二大的托管公司。他们的计划是最便宜的,DigitalOcean 社区非常好 - 他们为开发人员提供论坛和许多关于管理服务器的教程。

可以选择按小时或按月支付。此外,SLA 是 99.99%的正常运行时间保证,甚至比亚马逊或 Azure 更好,定制使用模板,就像亚马逊、Azure 和 Rackspace 一样。

他们目前在北美有五个服务器,在欧洲有五个,在亚洲有一个。

DigitalOcean 对于专家来说是一个很好的解决方案,因为他们不管理服务器。服务器始终是 Linux,因此对于需要 Windows 的项目来说,这不是一个解决方案。此外,使用 DigitalOcean 的一个优势是,如果您的项目增长,可以轻松快速地扩展服务器。

Joyent

三星收购了 Joyent。这个云具有巨大的潜力。它是为了与亚马逊 EC2 竞争而创建的,并且有一些重要的客户,如 Twitter 和 LinkedIn。

Joyent 创建了 Node.js,并且他们拥有最好的容器技术;它是从 Solaris 继承并实现在他们自己的操作系统 SmartOS 上(一种为云设计的操作系统)。如果您寻求最佳性能并且不在乎价格,Joyent 是您的最佳选择。

您可以选择按小时、按年甚至每 3 年付款。此外,SLA 是 100%的正常运行时间保证,每 30 分钟循环一次,是最好的。定制使用模板,就像亚马逊、Azure、Rackspace 或 DigitalOcean 一样。

他们目前在北美有三台服务器,在欧洲有一台。

Rackspace 和 Joyent 拥有开源基础设施,因此可以下载并在自己的机器上使用。

谷歌计算引擎

谷歌计算引擎是一个完整的产品,包括基础设施和服务,允许我们在与谷歌相同的基础设施上执行带有 Linux 的虚拟机。

谷歌计算引擎仪表板无可挑剔。它干净且易于导航。此外,在部署和可伸缩过程中非常快速,以及此云中包含的工具使谷歌计算引擎成为分析和大数据的良好解决方案。

对于谷歌计算引擎,SLA 是 99.95%的正常运行时间保证,每月循环一次。它允许我们免费存储最多七个快照。

他们目前在北美有九台服务器,在欧洲有三台,在亚洲有六台。

将您的应用程序部署到云中

在整本书中,我们一直在使用容器;我们已经告诉过您它们对您的项目有多么有益。现在,是时候将您的应用程序部署到云中了。市场上有不同的提供商,我们已经为您提供了一些关于如何选择最佳提供商的提示。在本节中,我们将向您展示一些有趣的选项,让您在生产中编排和管理容器。

Docker Swarm

在整本书中,我们一直在使用 Docker 及其Docker 引擎。使用 Docker 引擎,我们能够启动和关闭我们应用程序中使用的容器。您可以想象,您可以在生产服务器上安装 Docker 引擎,并像我们的开发环境一样使用它,但您认为这种方法是容错的吗?显然答案是否定的。您可以尝试在不同服务器上拥有多个 Docker 引擎,但设置和维护将会很困难。幸运的是,Docker 创建了 Docker Swarm;这个软件为您提供了本地集群功能,并将您的一组 Docker 引擎转换为单个虚拟 Docker 引擎。就像在您的开发机器上工作一样;Swarm 将为您处理所有困难的事情,您只需要关注您的应用程序。

由于我们希望您全面了解 Docker Swarm,以下是此工具的主要功能:

  • 与 Docker 工具兼容:Docker Swarm 使用并提供标准的 Docker API,因此任何已经使用 Docker API 的工具都可以使用 Docker Swarm 来透明地扩展到多个主机。

  • 高可伸缩性和性能:与所有 Docker 软件一样,Swarm 已经准备好投入生产,并且经过测试,可以扩展到一千(1,000)个节点和五万(50,000)个容器。这些测试结果表明,您可以在节点集群中实现这些高部署数字,而不会降低性能。

  • 故障转移和高可用性:Docker Swarm 已准备好管理故障转移并为您提供高可用性。您可以创建多个 Swarm 主机并指定主机故障时的领导者选举策略。在撰写本书时,有一个实验性支持从失败节点重新调度容器的支持。

  • 灵活的容器调度:Swarm 配备了内置调度程序,负责最大化您基础设施的性能和资源利用率。

  • 可插拔的调度器和节点发现:如果 Swarm 附带的内置调度器不符合您的要求,您可以插入外部调度器,例如Apache MesosKubernetes。为了满足应用程序的所有自动发现要求,您可以在 Swarm 中选择不同的可用方法:托管的发现服务、静态文件、Consul 或 Zookeeper。

安装 Docker Swarm

从 Docker 1.12 及更高版本开始,Swarm 模式已经内置,因此安装非常容易。您只需要按照我们在第二章中展示的步骤进行操作,开发环境,但是不是在您的开发机器上执行,而是在您的生产服务器上执行。我们建议在生产节点上使用 Linux/Unix,因此我们在这里描述的所有步骤都是针对 Linux/Unix 系统的。

我们将构建一个 Swarm 集群,因此在继续阅读之前,请确保您已准备好以下要求:

  • 至少三台安装了 Docker Engine 1.12(或更高版本)的主机

  • 其中一台机器将是管理机器,因此确保您拥有所有主机的 IP 地址

  • 打开主机之间的端口

  • TCP 端口 2377:此端口用于我们的集群管理消息

  • TCP 和 UDP 端口 7946:这些端口用于节点之间的通信

  • TCP 和 UDP 端口 4789:这些端口用于覆盖网络流量

总之,我们的生产环境将由以下主机组成:

  • 管理节点:这个节点负责所有编排和调度的繁重工作。我们将称这台机器为manager_01

  • 两个工作节点:这些是我们将用来托管容器的虚拟节点。我们将这些主机称为worker_01worker_02

正如我们之前提到的,您需要知道不同 Docker 主机的 IP 地址,其中最重要的是管理机器的 IP 地址。工作节点将连接到此 IP 地址以了解他们需要做什么。例如,假设我们的管理主机的 IP 是192.168.99.100

在这一点上,您已经准备好设置 Swarm 集群。首先确保所有节点上都运行着 Docker 引擎。一旦您检查了主机上的引擎是否正在运行,您需要通过 SSH 或控制台进入您的manager_01节点。在您的manager_01节点中,运行以下命令启动 Swarm:

**docker swarm init --advertise-addr 192.168.99.100**

上述命令将初始化 Swarm 并将当前节点设为管理节点。它还会给出您需要运行的命令,以添加更多的管理节点或将工作节点添加到集群中。您的init命令的输出应类似于以下输出:

**Swarm initialized: current node (b33ldnwlqda735xirme3rmq7t) is now a manager.**

一旦您初始化了 Swarm,您需要获取一个令牌,用于加入其他机器到集群中。要获取此令牌,您只需要在任何时候运行以下命令:

**docker swarm join-token worker**

假设您需要向 Swarm 添加一个新的worker;在这种情况下,您只需要从上述命令中获取令牌并运行以下命令:

**docker swarm join \

--token SWMTKN-1-12m5gw74y2eo8llzj9oi2b2ij3z3fwwjg830svx3go5pig1stl-ev5x8obsajn4yhzy774lvhhfu \

192.168.99.100:2377**

上述命令将向 Swarm 添加一个worker,如果您需要向此集群添加另一个管理节点,可以运行docker swarm join-token manager并按照说明进行操作。

理论上,init 命令启动了 Swarm;如果您想检查正确的集群初始化,只需执行以下命令:

**docker info**

上述info命令将给出类似于以下输出的一些输出;请注意,我们删除了一些信息以适应本书:

**Containers: 44
Running: 0
Paused: 0
Stopped: 44
Images: 171
Server Version: 1.12.5
Swarm: active
NodeID: b33ldnwlqda735xirme3rmq7t
Is Manager: true
ClusterID: 705ic3oomoadlhocvcluszfwz
Managers: 1
Nodes: 1
Orchestration:
Task History Retention Limit: 5
Node Address: 192.168.99.100**

如您所见,我们的 Swarm 已经激活并准备就绪;如果您想获取有关节点的更多信息,只需执行以下命令:

**docker node ls**

上述info命令将给出类似于以下输出的输出。

**ID               HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS

b33ldnwlqda... *  moby   Ready   Active     Leader**

在这一点上,您有一个主机,即您的管理节点,但您没有任何可以启动容器的工作节点。让我们向我们的集群添加一些工作节点。

使用 Swarm 向我们的集群添加工作节点非常容易——您只需要通过 SSH 或控制台访问主机并运行在管理节点上由 Swarm init 输出的命令:

**docker swarm join \

--token SWMTKN-1-12m5gw74y2eo8llzj9oi2b2ij3z3fwwjg830svx3go5pig1stl-ev5x8obsajn4yhzy774lvhhfu \

192.168.99.100:2377**

如果一切顺利,上述命令将给出以下输出,指示当前节点已添加到集群中:

**This node joined a swarm as a worker.**

假设您没有保存加入令牌;您可以再次从管理节点获取它。您只需要登录到管理节点并执行以下命令:

**docker swarm join-token worker**

上述命令将为您提供您需要在工作节点中再次运行的命令。

如您所见,向您的集群添加节点非常容易;添加所有剩余的工作节点。要检查集群节点的状态,您可以在管理节点中执行以下命令:

**docker node ls**

向我们的 Swarm 添加服务

此时,您的生产环境已准备好进行部署;让我们部署一些内容来测试新环境。我们将部署一个非常简单的镜像,它会对google.com进行 ping。一旦您感到舒适地将服务部署到 Swarm 中,您可以尝试部署我们的示例应用。

打开与管理节点的连接或登录,并运行以下命令:

**docker service create --replicas 1 --name pingtest alpine ping google.com**

上述命令在集群中创建了一个新服务,使用--name标志为我们的服务分配了一个漂亮的名称,在本例中是pingtest--replicas参数指示我们希望为我们的服务创建的实例数量;在我们的例子中,我们只指定了一个实例。使用alpine ping google.com,我们告诉我们的 Swarm 我们想要使用哪个镜像(alpine)以及我们想要在该镜像中执行的命令(ping google.com)。

如您所见,部署新的测试服务非常容易。如果您想查看在您的集群中运行哪些服务,请登录到您的管理节点并执行docker service ls命令,输出将类似于以下内容:

**ID            NAME   REPLICAS  IMAGE   COMMAND
3ojsox6wioz4  pingtest  1/1    alpine  ping google.com**

一旦您的服务在生产环境中运行,您将需要更多关于服务的信息。使用 Docker 非常容易,您只需要在管理节点中执行以下命令:

**docker service inspect --pretty pingtest**

您的输出可能类似于以下内容:

**ID:    3ojsox6wioz45d37xkcgn1xwv
Name:    pingtest
Mode:    Replicated
Replicas:    1
Placement:
UpdateConfig:
Parallelism:    1
On failure:    pause
ContainerSpec:
Image:    alpine
Args:    ping google.com
Resources:**

如果您希望输出以 JSON 格式返回,您只需要从命令中删除--pretty参数:

**docker service inspect pingtest**

上述命令的输出将类似于以下内容:

**[
{
    "ID": "3ojsox6wioz45d37xkcgn1xwv",
    "Version": {
        "Index": 23
    },
    "CreatedAt": "2017-01-07T12:53:18.132921602Z",
    "UpdatedAt": "2017-01-07T12:53:18.132921602Z",
    "Spec": {
        "Name": "pingtest",
        "TaskTemplate": {
            "ContainerSpec": {
                "Image": "alpine",
                "Args": [
                    "ping",
                    "google.com"
                ]
            },
            "Resources": {
                "Limits": {},
                "Reservations": {}
            },
            "RestartPolicy": {
                "Condition": "any",
                "MaxAttempts": 0
            },
            "Placement": {}
        },
        "Mode": {
            "Replicated": {
                "Replicas": 1
            }
        },
        "UpdateConfig": {
            "Parallelism": 1,
            "FailureAction": "pause"
        },
        "EndpointSpec": {
            "Mode": "vip"
        }
    },
    "Endpoint": {
        "Spec": {}
    },
    "UpdateStatus": {
        "StartedAt": "0001-01-01T00:00:00Z",
        "CompletedAt": "0001-01-01T00:00:00Z"
    }
}
]**

如您所见,JSON 格式包含更多信息;请随意使用适合您的选项。如果您需要知道您的服务在哪里运行,您可以在管理节点中执行docker service ps pingtest命令,就像以往一样。

在 Swarm 中扩展您的服务

我们向您展示了在 Swarm 集群中创建新服务有多么容易,现在是时候让您知道如何扩展您的服务了。转到您的管理节点并运行以下命令:

**docker service scale pingtest=10**

上述命令将创建(或销毁)所需数量的容器,以调整到您的需求;在我们的例子中,我们希望我们的pingtest服务有 10 个容器。您可以使用docker service ps pingtest命令来检查命令的正确执行,将给出以下输出:

在 Swarm 中扩展您的服务

从上述输出中,您可以检查服务在 10 个容器中运行,还可以检查它在哪个节点上运行。在我们的例子中,它们都在同一台主机上运行,因为我们只向我们的集群添加了一个节点。

您现在知道如何创建您的 Swarm 集群以及如何轻松启动新服务,现在是时候向您展示如何停止任何正在运行的服务了。

连接到您的管理节点并执行以下命令:

**docker service rm pingtest**

上述命令将从 Swarm 集群中删除pingtest服务。与往常一样,您可以使用docker service inspect pingtest命令或通过检查运行的容器使用docker ps命令来检查服务是否已停止。

在本章的这一点上,你将能够创建一个 Swarm 集群并启动任何服务;试一试,将我们的示例应用程序迁移到 Swarm。

正如你所想象的,我们喜欢 Docker 如何简化开发周期以及部署的简单性,但是还有其他项目可以在生产环境中使用。让我们看看这些天最常用的项目,这样你就可以选择哪个选项更适合你的项目。

Apache Mesos 和 DC/OS

Apache Mesos 将所有计算资源从机器中抽象出来,实现了容错和弹性的分布式系统。创建 Apache Mesos 分布式系统可能会很复杂,因此 Mesosphere 创建了 DC/OS,这是一个建立在 Apache Mesos 之上的操作系统。由于 DC/OS,你可以拥有 Mesos 的所有功能,但安装或管理起来更容易。

一些 Apache Mesos 和当然 DC/OS 中可用的功能如下:

  • 线性可扩展性: 你可以扩展到 10,000 个主机而不会出现任何问题

  • 高可用性: Mesos 使用 Zookeeper 提供容错的复制主节点和代理

  • 容器支持: 原生支持使用 Docker 和 AppC 镜像启动容器

  • 可插拔隔离: 支持 CPU、内存、磁盘、端口、GPU 的隔离和自定义隔离模块

  • API 和 Web UI: 内置的 API 和 Web UI 允许你轻松管理 Mesos 的任何方面

  • 跨平台: 你可以在 Linux、OSX 甚至 Windows 上运行 Mesos

正如你所看到的,Apache Mesos 和 DC/OS 是 Docker 或 Kubernetes 的一个有趣的替代方案。这些项目统一了所有节点之间分隔的所有资源,并将它们转换为一个分布式系统。这让你感觉你只是在管理一台单一的机器。

Kubernetes

Kubernetes 是用于自动化部署、扩展和管理容器的主流开源系统之一。它由谷歌创建,拥有活跃的社区。

它是一个完整的编排服务,拥有各种功能,我们可以突出以下功能:

  • 自愈: 这是一个有趣的功能,可以在节点死机时重新启动失败的容器,并替换和重新安排容器。它负责终止不健康的容器,并避免广告未准备好的容器。

  • 服务发现和负载均衡: 这个功能允许你忘记创建和管理自己的发现服务;你可以使用开箱即用的功能。Kubernetes 还为每个容器分配了自己的 IP 地址和一组容器的 DSN 名称。由于所有这些,你可以轻松进行负载均衡。

  • 自动部署和回滚: 没有比部署和回滚更重要的事情了。Kubernetes 可以为你管理这些操作;它将监视你的应用程序,以确保在进行部署/回滚时它仍然平稳运行。

  • 水平扩展: 你可以使用单个命令扩展或缩小你的应用程序,使用用户界面甚至定义一些规则来自动执行。

  • 自动装箱: Kubernetes 负责根据容器的资源需求和其他约束条件来放置容器。决策是通过尝试最大化可用性来做出的。

正如你所看到的,Kubernetes 在大型项目中具备大部分所需的功能。因此,它是最常用的容器编排系统之一。我们建议你对这个项目进行更多的调查。你可以在官方页面上找到你需要的所有信息。如果你有一个在官方文档中找不到答案的具体问题,这个项目背后的大社区可以帮助你。

部署到 Joyent Triton

早些时候,我们向您展示了如何构建 Swarm 集群。这是一种管理基础设施的有趣方式,但是如果您需要云的全部功能,但又不想处理编排的麻烦,会发生什么?在以下示例中,我们假设您没有预算或时间来使用您选择的编排软件设置云服务器。

在本章的开头,我们谈到了主要的云提供商,其中包括 Joyent。这家公司有一个名为 Triton 的托管解决方案;您可以使用此解决方案通过单击或 API 调用创建 VM 或容器。

如果您想使用他们的托管服务,第一件事就是在他们的www.joyent.com页面上创建一个帐户。一旦您的帐户准备好,您将完全访问他们的环境。

一旦您的帐户准备好,就向您的帐户添加一个 SSH 密钥。此密钥将用于对您的容器和 Joyent 的 API 进行身份验证。如果您没有要使用的 SSH 密钥,可以手动创建一个。创建 SSH 密钥非常容易,例如,在 Mac OS 中,您只需要执行以下命令:

**ssh-keygen -t rsa**

此命令将询问您有关密钥存储位置或要用于保护密钥的密码短语的一些问题。一旦您回答了所有问题,通常密钥将存储在~/.ssh/id_rsa.pub文件中。您只需要将此文件的内容复制到您的 Joyent 帐户中。如果您使用 Linux,创建 SSH 密钥的过程非常类似。

一旦您的帐户准备好,您就可以开始创建容器;您可以使用他们的 Web UI 来完成,但在我们的情况下,我们将向您展示如何从终端完成。

我们使用 Docker 和 Docker API 在 Triton 中实现的 Joyent,所以您将看到部署有多么容易。您需要做的第一件事是安装 Triton CLI 工具;这个应用程序是基于 Node.js 构建的,所以您需要在开发机器上安装 Node.js (nodejs.org)。一旦您安装了 node,您只需要执行以下命令来安装 Triton CLI:

**sudo npm install -g triton**

上述命令将在您的机器上将 Triton 安装为全局应用程序。一旦 Triton 在您的计算机上可用,您需要配置该工具;输入以下命令并回答所有问题:

**triton profile create**

此时,您的 Triton CLI 工具将准备就绪。现在,是时候配置 Docker 以使用 Triton 了。打开您的终端并执行以下命令:

**eval $(triton env)**

上述命令将配置您的本地 Docker 以使用 Triton。从现在开始,您所有的 Docker 命令都将发送到 Triton。让我们尝试部署我们的示例应用程序--转到您的docker-compose.yml文件的位置并执行下一个命令:

**docker-compose up -d**

上述命令将像往常一样工作,但是,不再使用我们的开发机引擎,而是在云中启动我们的容器。Triton 的一个优势是他们为每个容器分配至少一个 IP 地址,因此如果您需要获取特定容器的 IP 地址,只需执行docker ps以获取所有正在运行的容器(在 Triton 中)及其名称。一旦您获得容器的名称,只需执行以下命令即可从 Triton CLI 获取 IP 地址:

**docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name**

上述命令将给出您选择的容器的 IP 地址。另一种获取 IP 的方法是从 Web UI 获取。

提示

docker-compose stop 将终止部署到云中的所有容器。

现在,您可以使用本书中学到的一切,并且不会遇到太多问题就可以部署到 Joyent Triton 云中。这可能是目前市场上部署 Docker 容器最简单的方法。使用 Joyent Triton 就像在本地工作一样。

请注意,这不是你在生产环境中部署 Docker 的唯一选择;我们只展示了一种简单易行的方法。你可以尝试其他选项,比如 CoreOS 和 Mesosphere(DC/OS)等。

什么是 DevOps?

DevOps 是一套强调开发和运维(IT)之间协作和沟通的实践方法。其主要目标是建立一个快速、频繁和更可靠的软件发布文化。为了实现这一目标,DevOps 通常会尽可能地自动化。如果你的项目(或公司)发展壮大,你将会在某个时候采用一些 DevOps 原则来确保你的应用程序的未来。

在你的组织中采用这种文化的一些技术好处可能如下:

  • 旨在最大化持续集成持续交付的使用

  • 减少需要修复的问题的复杂性

  • 减少故障数量

  • 提供更快的问题解决

DevOps 的主要支柱是建立在你的应用程序开发中涉及的所有部分之间的沟通文化,特别是在开发和运维人员之间的沟通。你的组织内部的沟通不足可能会导致整个项目的关闭,无论你的应用程序有多么好或令人惊叹。

一旦你的组织在软件开发中涉及的所有部分之间建立了良好的沟通渠道,你就可以分析并实施 DevOps 文化的下一个支柱——自动化。为了创建一个可靠的系统,你需要投资于重复手动任务和流程的自动化;这就是持续集成和持续交付发挥作用的地方。创建你的 CI/CD 管道将帮助你自动化重复的任务,如单元测试或部署,提高应用程序的整体质量。它甚至会帮助你节省一些日常任务的时间。想象一下,手动将你的应用程序部署到生产环境平均每次需要 8 分钟;如果你至少每天部署一次,你将在一整年中浪费超过 30 小时的时间。

DevOps 关乎你的应用程序以及围绕开发和部署的流程,其核心原则如下:

  • 敏捷软件开发

  • 持续集成

  • 持续交付管道

  • 自动化和持续测试

  • 积极监控

  • 改善沟通和协作

正如你所看到的,DevOps 文化不是你可以在你的组织中在几个小时内实施的东西,这是一个长期的过程,你需要分析你的组织中的开发流程以及你需要进行的必要变化,以找到更灵活和敏捷的方式。我们在本书中涵盖了大部分核心原则;现在轮到你来填补空白,并在你的组织中实施 DevOps 文化了。

总结

在本章中,我们讨论了云是什么,以及选择托管提供商所需了解的内容。我们还告诉了你在云中编排应用程序的不同选项。现在,轮到你分析并选择最适合你项目的最佳选项了。