<audio id="audio" title="08 | 云上运维：云端究竟需不需要运维？需要怎样的运维？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/78/f3/784d1a993daa7db2ffbf35a05e813bf3.mp3"></audio>

你好，我是何恺铎。

谢谢你的努力和坚持，我们已经学习了IaaS篇中的大多数内容。今天是IaaS部分的最后一讲，我们来谈谈云上的运维工作。

## 云端需要运维吗？

既然要谈运维，我们得先回答这个必要性的问题。许多人都觉得，因为云服务大多都具有了非常高的可靠性和自动化程度，所以在云时代，运维就不那么重要了，甚至是可以省略的事情了。

这种观点有意无意地散播，其实会造成一些负面的影响。**开发者会容易轻视运维工作的重要性，忽略架构设计中运维友好性问题；而从事运维方向的工程师们，可能更会有点儿焦虑，甚至于担心未来的职业生涯。**

但很显然，这是一种误解。云端当然需要运维，而且云上运维很重要。因为不管在什么样的运行环境下，运维的本质和需求都没有消失，一样要为业务保驾护航，要保证系统的正常运作、应对突发情况等等。

云时代的运维，正确的理解应该是这样的：**云不但没有消灭运维，反而是助推了运维的发展**。

这是因为，云的引入能够让我们在更高的层面去思考和解决问题。比如说，云端基础设施的存在，可以让运维从偏硬件服务器、偏物理机房的日常繁琐工作中解脱出来，更多地基于云在**软件的层面**，进行部署、监控、调整。而云上的高质量、高可用的服务，也能避免我们重复建设，不用自己造轮子，也大大减轻了运维负担。

注意：底层的机房运维、基础架构运维仍然会继续存在，但会向头部的云供应商大规模集中。这属于云厂商的运维视角，是另一个宏大的话题，我们这里不多做讨论。

**所以，云其实是提高了运维的效率，改变了运维的形态。**

与此同时，由于云上运维的**软件属性**显著增强了，它就自然地和研发会有更强的融合。近期DevOps理念和云原生热潮的兴起，就说明了这一点。许多工作，你慢慢地会分不清它究竟是属于运维还是研发，因为两者的界限正在模糊。

另外，由于云独有的一些特点，它也会带来一些新的运维工作。比如我们课程中一直在涉及的**成本控制**，这也是云时代新运维所应当关注和包含的重要事项。因为云的成本消耗是动态、时刻发生着的，这和传统运维中的各类实时监控的对象，在形态上非常接近。

所以，云端需要运维吗？答案已经不言而喻了。

## 云时代的运维利器

工欲善其事，必先利其器。为了做好扎实的云上运维，首先我给你的一个建议是，你需要掌握云的**命令行工具**。现在几乎每个云都推出了自己的命令行工具，比如AWS CLI、Azure CLI、阿里云CLI等等。

在前面各讲的例子中，为了便于你学习和理解，我都使用了公有云的网站门户来进行操作。但如果是在生产环境，你需要对很大规模的资源池逐个进行调整，或者同一件事情，你需要在不同时间反复地操作很多遍，那你就很可能需要将这些操作脚本化、程序化，这就需要用到云的命令行工具了。

虽然命令行工具有一定的学习曲线，但如果你熟悉了以后，其实是可以干脆利落地表达一个操作的。比如说，如果你要创建在[第6讲](https://time.geekbang.org/column/article/211071)的实验中，使用的虚拟机“vm1-in-vpc1”，你就可以使用下面的**aliyun ecs命令**来轻松表达：

```
[client@clientVM ~]$ aliyun ecs CreateInstance --ImageId ubuntu_18_04_x64_20G_alibase_20191225.vhd --InstanceType ecs.g6.large --ZoneId cn-shanghai-e --VSwitchId vsw-uf6ls7t8l8lpt35xxxxxx
{
        &quot;InstanceId&quot;: &quot;i-uf6hn8z47kqve3xxxxxx&quot;,
        &quot;RequestId&quot;: &quot;222DA83B-0269-44BF-A303-00CB98E4AB07&quot;
}
[client@clientVM ~]$ aliyun ecs StartInstance --InstanceId i-uf6hn8z47kqve3xxxxxx
{
        &quot;RequestId&quot;: &quot;8E4C43CA-8F36-422C-AEF1-14ED5023856D&quot;
}

```

现在各个云的CLI基本上都进化到了第二代，相比第一代，CLI在易用性和表达能力上都有了很大的提升，你不妨学习尝试一下。而且这些CLI都能和Shell编程进行比较好的融合，你可以通过脚本组合多个关联的操作。

小提示：除了命令行工具，各云还都提供了开发者工具包（SDK）。如果你的资源调度逻辑相当复杂，或者需要与你自己的程序集成，那么你可以考虑使用相应语言的SDK，来进行云上的一些资源管理操作。

如果你要频繁地在云上部署一套包含众多资源项的复杂系统，你还有另外一个得力的帮手：**资源编排类云服务**。属于这个领域的服务包括有AWS CloudFormation、 Azure的ARM Template、阿里云资源编排服务（ROS）等等，它们都可以通过使用一个JSON格式的文本文件，来描述和定义一个系统中所有的组件，以及它们互相之间的关系。

这个JSON文件，就是一个可以自动部署、可复用的单元了。这其实就是“基础设施即代码”（Infrastructure as Code）理念在云端的实现。

下面我给出了一个Azure的ARM Template的配置文件局部示例，可以让你有一个直观的感受：

```
{
    &quot;$schema&quot;: &quot;https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#&quot;,
    &quot;contentVersion&quot;: &quot;1.0.0.0&quot;,
    &quot;parameters&quot;: {
      &quot;adminUsername&quot;: {
        &quot;type&quot;: &quot;string&quot;,
        &quot;metadata&quot;: { &quot;description&quot;: &quot;This is the username you wish to assign to your VMs admin account&quot; }
      },      
      ...
    },
    &quot;variables&quot;: {
      &quot;nicName&quot;: &quot;VMNic&quot;,
      &quot;addressPrefix&quot;: &quot;10.0.0.0/16&quot;,
      &quot;imagePublisher&quot;: &quot;Canonical&quot;,
      ...      
    },
    &quot;resources&quot;: [
      {
        &quot;apiVersion&quot;: &quot;2015-05-01-preview&quot;,
        &quot;type&quot;: &quot;Microsoft.Network/publicIPAddresses&quot;,
        &quot;name&quot;: &quot;[variables('publicIPAddressName')]&quot;,
        &quot;location&quot;: &quot;[parameters('location')]&quot;,
        &quot;properties&quot;: { &quot;publicIPAllocationMethod&quot;: &quot;[variables('publicIPAddressType')]&quot; }
      },      
      {
        &quot;apiVersion&quot;: &quot;2015-05-01-preview&quot;,
        &quot;type&quot;: &quot;Microsoft.Network/virtualNetworks&quot;,
        &quot;name&quot;: &quot;[variables('virtualNetworkName')]&quot;,
        &quot;location&quot;: &quot;[parameters('location')]&quot;,
        &quot;dependsOn&quot;: [
          &quot;[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]&quot;
        ],
        &quot;properties&quot;: { ... }
      },
      {
        &quot;apiVersion&quot;: &quot;2017-03-30&quot;,
        &quot;type&quot;: &quot;Microsoft.Compute/virtualMachines&quot;,
        &quot;name&quot;: &quot;[variables('vmName')]&quot;,
        &quot;location&quot;: &quot;[parameters('location')]&quot;,
        &quot;dependsOn&quot;: [ &quot;[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]&quot; ],
        &quot;properties&quot;: {
          &quot;hardwareProfile&quot;: { &quot;vmSize&quot;: &quot;[parameters('vmSize')]&quot; },
          &quot;networkProfile&quot;: {
            &quot;networkInterfaces&quot;: [
              { &quot;id&quot;: &quot;[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]&quot; }
            ]
          },
          ...
        }
      },
      ...
    ]
  }

```

注：这个文件是用于配置单机WordPress网站的模板，这里略去了许多内容，其全貌可以参见[这个链接](https://github.com/Azure/azure-quickstart-templates/blob/master/wordpress-single-vm-ubuntu/azuredeploy.json)。

这类资源编排服务，理论上能够**支持云上所有服务的组合，而且配置节点互相能够引用**，功能十分强大。它还具有一定的灵活性，一般都有**输入参数字段**，允许你在部署时动态决定一些选项和参数值，还可以**自定义结果输出字段**，方便部署完成后告诉你一些结果信息。

在这类资源编排部署系统的帮助下，我们云端部署类的工作可以得到极大的自动化。

## 云运维由哪些工作组成？

有了趁手的工具之后，我们下一个需要讨论的问题就是，**云时代的运维具体有哪些重要的工作呢？哪些是和传统运维一脉相承的事情，哪些又是在云环境下所特有的内容呢？**

现在，我就和你一起来简单梳理一下。

**首先，在云端，传统的运维工作仍然存在，其中包括你所熟知的监控、部署、升级、备份等等。**只是操作手段会有所不同，比如在云上，我们可以利用前面说到的命令行工具和资源模板来进行部署。

**监控**一直是运维最核心的工作之一。几乎所有的云端服务都自带有一定的监控功能，默认提供了不少内置的维度指标和可视化图表，这些开箱即用的图表你要充分利用好，它们能够很好地帮助你了解相关服务的状态。

那么，如果自带的监控不够用怎么办？其实这些默认的统计监控的背后，往往都是由云的一个**大型统一监控服务**来支撑的，如AWS的CloudWatch和Azure的Monitor等等。你可以好好研究一下这类统一监控服务，通过它可以满足你更深度的自定义监控需求。

另外，这些你精心选择和设置的监控项，还能够和云上的仪表盘服务，以及报警服务联动，轻松实现运营监控的“大屏”和问题的实时报警。

<img src="https://static001.geekbang.org/resource/image/cb/a6/cb3d812198998cd4cce5bfe6b72024a6.jpg" alt="">

这里我还想再多谈一谈**备份**。

备份是一个简单但又很容易被我们忽视的事项。即便是在云端，尽管云厂商已经做了许多如三副本之类的防护措施，但还是会存在出故障的可能，所以我们仍然需要做好备份，尤其是重要数据的备份。**总之，我们在云上需要创造多层次的冗余，而备份在创造冗余方面也承担着重要的角色，有的时候，它会是我们的最后保障。**

在IaaS的虚拟机层面做备份，你的得力助手会是**镜像**和**快照**。

镜像我们在[上一讲](https://time.geekbang.org/column/article/212714)中已经接触过了，它可以用来恢复虚拟机；快照则是云磁盘级别对应的备份概念，它可以帮助你将某块磁盘某一时刻的状态进行封存和恢复，你还可以定期定时为一些重要磁盘自动生成快照。

<img src="https://static001.geekbang.org/resource/image/c5/db/c57c8f11c1c1b3cda41c8b442f7621db.jpg" alt="">

注意：不要小看镜像和快照这样简单基础的操作，像在[第5讲](https://time.geekbang.org/column/article/210423)中提到过的创业公司严重事故，就完全可以通过简单的磁盘快照进行避免。因为快照的存储本身不依赖于云盘，这就是额外的冗余。

除了虚拟机和磁盘层面，文件层面的备份同样重要而有效。而且文件的备份最好还能以异地的方式来存储。云上的对象存储可以在这方面肩负重任，我在PaaS篇中会做专门讲解。

**其次，你的运维工作中很可能包含迁移。**

这是带有云端特色的运维任务，因为**只要不是在云上创建的全新业务，传统业务在逐步上云的过程中一定会面临迁移工作**。

迁移显然是非常大的一个话题，有些复杂的迁移项目，持续的时间可能长达几个月。这里我想告诉你两点**最核心**的建议：

- 第一，在生产业务切换过来之前，一定要对云上的新架构、新方案进行充分而深入的POC测试，不可操之过急。对于复杂场景，可能要通过不断地实践，才能够逐步进化出完善的云上解决方案。
- 第二，对于一些虚拟机、数据库等独立的软硬件单元，许多云厂商都提供了官方的迁移服务或工具，支持离线甚至在线迁移，妥善使用可以事半功倍。比如AWS的主机迁移服务SMS（Server Migration Service）、数据库迁移服务DMS（Database Migration Service）和阿里云的数据传输服务DTS（Data Transmission Service）等。

所以，当你遇到一些迁移场景时，不妨先查一查云厂商是否有官方的支持。由于迁移类服务能够直接为厂商导流获客，所以云厂商一般都会比较重视，往往能给你提供相当好的用户体验。

**再次，云上的运维会包含和云厂商进行对接的工作。**

毕竟我们的大厦是建立在云厂商所提供的基础设施之上的。云虽然已经高度成熟，但作为一个高度复杂的系统，也总难免会有不按你所期望进行工作的时候，或者极为偶尔也会出些小Bug，这时和云厂商的对接渠道就显得尤为重要了。

所以，我们的运维团队中需要有相应的角色对云的工单机制，以及技术支持侧的对接方式了然于胸，以备不时之需。你也要熟读文档，要吃透云计算的许多特性，这样才能更准确地与客服沟通，更快地寻求到对口的帮助，最后解决好问题。

**最后，云上运维会具有很强的管理属性。**

这里的管理，指的不仅仅是对云上资源的管理，更要深入到流程和制度的管理层面。比如对于云资源的命名、开通、清理等日常操作的规范，各类云上安全的控制和最佳实践，所有云资源的负责人、所属资源组和权限体系等等。这些都需要有效的管理手段，才能避免资源在云上的野蛮生长。

**所以，高明的云上运维，既要为应用开发赋能，要足够高效，也要有适当的管理和约束。我们团队的组织架构和分工，最好也能够配合和适应这个需要。**

好在云厂商也在不断推出和完善与云上管理相关的配套服务，比如说，Azure Policy能够限定只有某类型号的资源可以被创建，还可以扫描和检查各种最佳实践是否得到了应用；再比如，AWS CloudTrail能够对账户内的操作进行监控和审计。如果你的组织内用户（团队成员）较多，就值得好好探索研究一下这一类的云服务。

当然，管理层面还有一项重要事务，就是我们多次提到的**成本管理**。公司或团队中，应当有专人对成本进行监控和分析，以此提升每一位用户的成本意识。我自己曾使用的实践，是按月来组织资源的使用方进行成本消耗的回顾，分析资源使用的上升、下降趋势及其主要原因，同时还会检查月度账单明细，以杜绝成本浪费。

## 课堂总结与思考

今天这一讲，与其说是教程，不如说是和你一起探讨云上运维的相关要点。因为篇幅所限，今天我主要总结介绍了那些最重要的，和你最需要了解的内容，没有办法深入探究每一个与运维相关的细节。但你必须知道这些事务的存在，明白云上运维需要做哪些事情，这样在你需要的时候，才能有针对性地去查找资料，找到怎么做这些事情的方法。

当前业界的一个重要趋势是，运维和开发的边界正在模糊。所以我在前面提到的诸多运维工作，可能是由开发者来负责，也可能是运维人员来承担。这要根据你们公司和部门的具体情况来决定。但至少，这些工作很重要，无论由什么角色来完成，总是需要有人来扎实落地的。

所以从个人视角来看，作为开发者，你应该学习和掌握一些运维的知识和技巧，让自己变得更加全面和综合；如果作为运维人员，你也应该学习了解现代软件构建和系统架构方面的知识，尤其是学习云、掌握云，为云端架构的全面到来做好准备。

**今天留给你的思考题是：**

- 如果要执行一些云上的CLI命令，你当然可以在自己的机器上安装命令行工具包，但其实你还可以使用不少云都提供的非常方便的“Cloud Shell”。那你知道什么是Cloud Shell，以及要如何使用它吗？
- 前面讲到云上资源管理时，我提到了“资源组”的概念。你知道资源组是什么吗？它起到什么作用呢？

好，至此我们课程IaaS部分的8篇内容就全部结束了，希望你有所收获。下一讲，我们将进入精彩的PaaS世界。欢迎你留言与我交流，咱们下期再见。
