
滕圣波,阿里云高级技术专家 ,花名云普
前言无影是终端用户计算产品线,由云桌面、云应用、云数据、终端等共同组成。作者是无影云桌面的总架构师和研发团队负责人。本文所指的桌面,是指办公或者娱乐用的桌面电脑。云桌面,是相对本地桌面而言的,以云计算的方式交付的远程虚拟桌面。一个最常见的云桌面的场景就是企业的员工办公,本地办公桌上只有着显示器、键盘、鼠标、摄像头等各种外设,没有电脑主机,打开显示器后显示一个登录界面,直接登录到远程的虚拟桌面办公。 在业界,大家提及较多的是Virtual Desktop Infrastructure(VDI)和DAAS (Desktop As A Service)两种虚拟桌面。一般,简单的认为,VDI是私有云的方案,DAAS是公共云的方案。但两者的区别不止这些,真正的DAAS,还应该满足一个重要特征,使用者无须关心基础设施,看不到虚拟机更看不到物理机,也就是常说的Serverless。举个例子,VMware的Horizon产品,部署的前提是先准备好一个vCenter和若干台服务器,因此我们讲,VMware Horizon是VDI产品,无论其安装在公共云还是私有云。而相比之下,阿里云无影可以直接购买云桌面,无须提前准备任何服务器,是真正的DAAS产品。VDI版本的云桌面阿里云的云桌面,在架构上,也经历了几次大的架构调整和升级。较早版本的阿里云云桌面(那时候还不叫无影),与VDI领域的某领导者公司共同合作设计,有浓重的VDI的烙印。当时的产品架构图如下图所示: 这个较早版本的架构设计,优点是利用了业界较为成熟的VDI方案,结合阿里云自己的身份认证系统和弹性计算(ECS)、VPC的基础设施,以较小的开发成本提供了一套较为稳定的虚拟桌面方案。但缺点也非常明显:1.对小企业用户来说,即使只有一台虚拟桌面,也需要额外的三台大规格ECS损耗,分别安装VDI必须的微软的AD、管理组件、终端用户认证访问组件,成本过高。2.受限于1中所述的三台ECS的限制,此方案对单个用户最多只能支撑1000台虚拟桌面,无法满足大企业弹性要求。3.虚拟桌面直接挂公网IP,客户端通过这个公网IP直接连接虚拟桌面,且虚拟桌面内的应用对外访问互联网也是通过这个公网IP,网络未隔离,存在安全风险。4.虚拟桌面底层对应的ECS,位于用户自己的VPC,归属用户自己,在用户的ECS控制台可见,用户要付出额外的管理成本来维护ECS,因此,本质上,是一个公共云上的VDI方案。5.无法与企业自身的微软AD进行集成。目前,较大比例的大企业正在使用微软AD进行windows桌面管理。 无影云桌面之初 为了客服这些缺点,在2020年,阿里云的云桌面进行了推到重来的设计,并正式命名为“无影云桌面”。此版本的架构图如下图所示(实际的无影服务VPC内的管控架构比下图要复杂很多,下图从简): 这个版本的无影云桌面,在架构上,有以下四点重大升级:1.无影实现了自研的大规模的多租户的桌面集群,在去除集群成本overhead的同时,实现了大规模的弹性扩容。举个例子,对小用户来说,假设一台桌面一个月100元,那么买一台就是100元,买两台就是200元,没有任何额外的费用。而对于大企业来说,也几乎没有规模上限。再举个例子,假设每个集群的桌面数量上限是5000台,那么,一个大企业的2万台桌面,会被自动的分配到四个不同的桌面集群中。2.桌面底层的ECS位于无影服务VPC内,由无影的服务来管理和运维,用户在ECS控制台看不到这些ECS,也就无须再运维ECS,利用Serverless技术成为了真正的DAAS。而无影提供的99.9%的可连接性SLA,也远胜过客户自己维护ECS的稳定性。3.桌面本身不挂公网IP,客户端通过一个无影自研的安全的接入网关,来接入桌面,从而实现了桌面与互联网的隔离,保证了桌面的安全接入。4.桌面有两块网卡。主网卡,也就是管控网卡,负责客户端的接入流量,以及管控侧的控制流量,用户不能对主网卡进行任何修改,主网卡的网络安全规则也是严格受控的。另一个是应用网卡,也就是辅助网卡,位于用户自己的VPC内,负责桌面内的应用对外的流量,桌面内的应用可以直接通过应用网卡访问此VPC内的资源。5.无影自研了一个AD Connector,可以允许客户集成自己的AD来管理这些桌面。AD Connector同样有两块网卡,一块位于无影服务VPC,一块位于用户VPC,从而桥接了无影管控服务与企业自己的AD。这样一来,客户端登录的时候,就可以使用企业自己的AD来完成认证了。值得注意的是,桌面和企业AD之间的流量,是通过应用网卡来直接通信的,不走AD Connector。 无影云桌面之云原生升级但是,这种设计仍然有一个缺点,就是如果用户需要访问internet,需要自己在VPC内购买NAT网关,同一个企业的多个桌面可以共享一个NAT网关上网。这种设计,虽然给了企业足够的灵活性来控制自己的网络,但是也对中小企业造成了很大的困扰:我想要桌面,为什么必须要先创建并配置VPC和vSwitch?还要我自己去够买并配置NAT网关?我还要自己配置应用网卡的安全组规则来保证安全?这些问题,违背了Serverless和DAAS的设计思想。为了提供最简化的管理体验,我们提出了“安全办公网络”和“工作区”的概念,把网络资源也全部放在了无影服务的管理VPC内,从而使得用户即使没有任何云计算背景和网络知识,也可以轻松地创建和管理自己的无影云桌面。随着团队的扩大,业务逻辑越来越复杂,单体应用在稳定性和弹性上的不足也越来越明显,我们决定对管控进行微服务化改造。同时,为了提供业界最好的终端用户体验,克服使用第三方协议的限制,我们把自研的ASP协议,也在管控层面做了实现。 2021版的无影云桌面架构图调整如下(实际远比下图复杂,下图从简): 在2020版的基础上,无影做了如下变革:1.桌面的应用网卡(辅助网卡)也由无影服务来管理。优点是,用户在创建无影桌面前,只需在无影控制台选择一个IP地址段(192,10,172等)创建一个无影工作区,无须再提前准备VPC、vSwitch等网络资源。桌面如果想要访问internet,只需要在无影控制台创建互利网访问包,无影会自动创建和管理NAT等资源,最大化的简化了用户的管理操作。2.为了保留无影跟用户自己的AD集成的能力,以及桌面访问VPC私网的能力,我们引入云企业网(CEN)。用户可以先创建一个CEN,然后在无影云桌面控制台将无影的工作区加入到自己的CEN,从而使得无影云桌面的网络与自己的VPC打通。3.为了满足部分企业客户的高安全的要求,我们支持了“私网客户端”的功能,通过privateLink终端节点服务,支持客户端只能在VPC以内,通过一个私网地址,连接云桌面,从而实现了企业的云桌面和公网彻底隔离的需求。4.引入了微服务引擎,进行了微服务化拆分和改造,使得多个团队可以并行开发,并在稳定性、性能等多方面有所提高。我们的注册中心使用Nacos,服务间调用使用Dubbo,消息异步通知使用RocketMQ,缓存使用Redis,分布式锁、工作流框架为自研。5.三方协议集群和自研的ASP集群并存,为ASP协议设计了单独的集群管理组件,实现心跳和健康监测、连接和会话管理、用户管理等功能。面向未来的无影在2022年,无影的架构,也会持续的迭代和更新。我们计划把数据、应用、桌面三者解耦,云数据、云应用和云桌面通过client和控制台在体验上合为一体,计划引入更多自研终端,计划发布自己的云端一体的操作系统,计划发布独立的个人版无影,计划搭建比肩淘宝的的无影商店。敬请期待!
成本控制是每个云上客户都很关心的话题,而云服务器ECS又是大多数阿里云客户的主要云上资源,因此,笔者给出了如下的九条省钱攻略,希望帮助我们的客户利用好在阿里云上投资的每一分钱。 攻略1:关注官方打折活动 适用对象:中小企业客户和个人开发者客户 使用门槛:低 最多可节省费用:90% 可能有的小伙伴还不知道,阿里云ECS也是有官方的折扣的。例如在2019年双十一期间,阿里云ECS推出了拼团活动,既有新购的优惠也有续费的优惠。在笔者发稿的时间(2020年5月),针对新用户的尝鲜优惠一折起。建议中小企业客户和个人开发者客户,对官方的打折优惠活动保持关注。点此查看官方打折活动 攻略2:使用共享型-突发性能实例 适用对象:中小企业和个人开发者客户,小型Web应用、开发测试用,有突发峰值但是平均资源利用率很低的应用, 使用门槛:低-中 最多可节省费用:60%以上 同样CPU/内存/云盘的前提下,共享型-突发性能实例无疑是当前所有实例类型里面最便宜的。以华北3(张家口)的2vCPU/4G内存/20G高效云盘为例,突发性能实例ecs.t6-c1m2.large包月价格为¥ 52.80,而同样配置的计算型ecs.c6.large包月价格为¥ 136.60,使用突发性能实例可以节省60%以上的费用。先不要高兴太早。超低的价格,伴随着CPU总使用量的限制。我们把CPU使用率为纵轴,时间为横轴画一个曲线,曲线下面的总面积,就是CPU总使用量。ecs.t6-c1m2.large的平均基准CPU计算性能限制在20%,也就是意味着,当你的CPU总使用量达到20%的时候,要么,系统会限制你的CPU性能(默认的性能约束模式),要么,会向你额外收费(开启无性能约束模式)。我们举一个简单的适用的例子。假设CPU在一天内有20个小时使用率为5%,4个小时为80%,那么总使用率为(200.05 + 4 0.8)/24, 结果为17.5%,小于20%,那么,你的应用不受影响,而且,还节省了60%以上的费用。点此了解突发性能实例的详情 攻略3:使用抢占式实例 适用对象:企业客户,容器化的应用,或者非关键业务 使用门槛:中 最多可节省费用:90% 请注意,抢占式实例是付费类型的一种,其他的付费类型包括包年包月,按量付费。抢占式实例可以有各种实例规格(通用型、计算型、内存型、异构计算、裸金属等等)。以笔者写稿的当前时间,华北五(呼和浩特)的通用型g5(2vCPU,8G内存,20G高效云盘)为例,抢占型的价格为¥0.081 /时,是按量付费的十分之一,包年包月的四分之一(包月价格折算到小时)。先不要高兴太早。超低的价格,伴随着被动释放的风险。抢占式实例的购买时的定价,是随着市场供需的变化而变化的。当市场供需紧张导致实例价格上涨之后,原有的抢占型实例可能会被释放。值得一提的是,华北五作为新开放的地域,抢占型的g5,过去30天内的平均释放率低到不足3%,也就是说,被释放的概率很低(但仍有释放的概率)。对于企业客户来说,抢占型实例,特别适合对释放不敏感的场景,比如容器化的应用,以及本地无持久化数据的应用,比如数据都持久在单独的数据库里或者远程存储里。此外,抢占型实例也适合临时使用,比如开发测试用途,毕竟抢占型实例在创建一个小时内,是保证不会释放的。抢占型实例在释放前,云监控会至少提前5分钟发出告警事件,开发者可以利用云监控的sdk自动化的消费和处理这一事件,做好释放前的准备工作(手动处理恐怕是来不及的)。点此了解抢占型实例详情 攻略4:使用预留实例券购买按量付费实例 适用对象:企业客户,大量弹性需求,且未来总计算力有明确规划的客户 使用门槛:中-高 最多可节省费用:44%以上 通常,包年包月比按量付费要便宜。但这不是绝对的,我们接下来就介绍几个专门针对按量付费的攻略,使用合理的情况下,可以比包年包月还要便宜。首先就是预留实例券。还是举一个例子,在笔者当前时间在华北三(张家口)使用预留实例券购买3台ecs.g6.large一年,总价格约为 ¥ 5140.80,对比按量付费节约44%的费用,跟包年包月的价格基本一致。那么,使用预留实例券购买按量实例,和购买包年包月实例比,优势在哪里呢?优势就在于按量付费本身。客户可以享受最大的弹性和灵活性,随时释放、重建实例,随时增加和减少实例。只不过,通过购买预留实例券的形式,客户向阿里云承诺了一个年度最低消费额。使用预留实例券是有一定门槛的,客户需要花一些时间理解预留实例券的计费规则,同时做好对未来的弹性计算的需求规划,以决定预留实例券的采购细节。点此了解预留实例券的详情 攻略5:为按量付费实例开启停机不收费 适用对象:有较长时间关机需求的用户 使用门槛:低-中 最多可节省费用:60% (取决于关机时间) 我们举两个例子。一个是办公场景,早晨9点上班,下午5点下班,每天使用ECS时间8个小时,如果为此付24个小时费用,岂不是很冤?在这个场景下,利用自动化的定时开关机结合开启停机不收费,可以节约接近2/3的费用。另一个适用的例子是企业集群场景,在业务低峰时,企业不需要那么多服务器,但是又不敢释放。点此了解停机不收费点此了解定时开关机 攻略6:使用存储容量单位包购买按量付费云盘 适用对象:企业客户,大量弹性需求,且未来总存储容量有明确规划的客户 使用门槛:中 最多可节省费用: 30% 跟预留实例券类似,利用存储容量单位包SCU,可以用很优惠的价格,购买按量付费的云盘。以笔者当前时间,华北2北京为例,1T总容量的ESSD云盘一个月,使用SCU的费用为¥ 1024.00,比按量付费节省三分之一的费用。点此了解存储容量单位包 攻略7:使用弹性伸缩组 适用对象:企业客户,无状态集群应用,业务负载变化大 使用门槛:中-高 最多可节省费用:60%(取决于负载变化) 弹性伸缩(Auto Scaling)是阿里云官方提供的免费产品。弹性伸缩组对应一个业务集群,客户可以定义自己的伸缩规则,比如cpu利用高于70%的时候,自动增加实例(扩容),在cpu利用低于30%的时候,自动减少实例(收缩)。弹性伸缩组可以配合负载均衡服务SLB一起使用。弹性伸缩还支持基于AI人工智能的预测伸缩算法。我们还是假设一个企业的线上业务集群,每天固定有4个小时的峰值需要10台ECS,其他时段需要2台ECS,那么利用弹性伸缩,总共可节省2/3的成本。弹性伸缩组还可以混合使用按量付费和抢占式的方式,达到最大的成本优化的效果。点此了解弹性伸缩组 攻略8:使用弹性供应组 适用对象:企业客户,无状态集群应用,业务负载变化小 使用门槛:中-高 最多可节省费用:参照抢占型实例 弹性供应组是阿里云ECS的一个产品特性,通过自动创建多种规格的抢占式实例,达到以最低的成本交付稳定的总计算力的目的。举个例子,客户可以创建一个50个vcpu的弹性供应组,由多种规格的抢占式实例组成,当实例(即将)被释放的时候,弹性供应组会自动创建新的实例,来保证可用的vcpu数量仍然是50个。弹性供应组的主要目的,是解决抢占式实例被动释放的问题,本质上,还是靠抢占式实例,带来了成本的节约。弹性供应组也可以混合使用按量付费和抢占式实例。点此了解弹性供应组 攻略9:专有宿主机DDH 适用对象:大中企业客户,有专有云和虚拟化的运维经验 使用门槛:高 最多可节省费用:50% 宿主机这个概念来自虚拟化,负责运行虚拟机的物理服务器被称为宿主机。用户可以购买若干台阿里云的专有宿主机(DDH),并将独享这些DDH上的全部计算资源,其他用户的虚拟机(ECS)不会占用这些DDH的计算资源。用户可以指定虚拟机(ECS)运行在哪一台DDH上。为什么DDH能省钱呢?因为有一种DDH叫做CPU超分型,通俗讲,一个物理CPU的核可以虚拟化成为2个vCPU。以华东2地域为例,一台CPU超分型宿主机为15778元/月,可创建84个4核8G的ECS实例,单价187.8元/月,节省48%的费用。什么样的业务适合使用CPU超分型DDH呢?笔者先给一个定义,峰值平均CPU利用率,也就是所有的虚拟机的cpu利用率曲线叠加之后的峰值。只要峰值平均CPU利用率在50%以下,就适合使用CPU超分型DDH。举例来说,虚拟桌面的办公场景,CPU的高峰通常都是离散的随机的。只要不是多数虚拟机在同一个瞬间CPU达到高峰,那么对于单个虚拟机的用户来说,根本感觉不到CPU被超分了。当然,DDH的使用也是有门槛的。客户需要自己负责ECS的调度,也就是,通过合理的动态分配ECS和DDH的对应关系,避免CPU超分带来的性能影响。点此了解专有宿主机
成本控制是每个云上客户都很关心的话题,而云服务器ECS又是大多数阿里云客户的主要云上资源,因此,笔者给出了如下的九条省钱攻略,希望帮助我们的客户利用好在阿里云上投资的每一分钱。 攻略1:关注官方打折活动 适用对象:中小企业客户和个人开发者客户 使用门槛:低 最多可节省费用:90% 可能有的小伙伴还不知道,阿里云ECS也是有官方的折扣的。例如在2019年双十一期间,阿里云ECS推出了拼团活动,既有新购的优惠也有续费的优惠。在笔者发稿的时间(2020年5月),针对新用户的尝鲜优惠一折起。建议中小企业客户和个人开发者客户,对官方的打折优惠活动保持关注。点此查看官方打折活动 攻略2:使用共享型-突发性能实例 适用对象:中小企业和个人开发者客户,小型Web应用、开发测试用,有突发峰值但是平均资源利用率很低的应用, 使用门槛:低-中 最多可节省费用:60%以上 同样CPU/内存/云盘的前提下,共享型-突发性能实例无疑是当前所有实例类型里面最便宜的。以华北3(张家口)的2vCPU/4G内存/20G高效云盘为例,突发性能实例ecs.t6-c1m2.large包月价格为¥ 52.80,而同样配置的计算型ecs.c6.large包月价格为¥ 136.60,使用突发性能实例可以节省60%以上的费用。先不要高兴太早。超低的价格,伴随着CPU总使用量的限制。我们把CPU使用率为纵轴,时间为横轴画一个曲线,曲线下面的总面积,就是CPU总使用量。ecs.t6-c1m2.large的平均基准CPU计算性能限制在20%,也就是意味着,当你的CPU总使用量达到20%的时候,要么,系统会限制你的CPU性能(默认的性能约束模式),要么,会向你额外收费(开启无性能约束模式)。我们举一个简单的适用的例子。假设CPU在一天内有20个小时使用率为5%,4个小时为80%,那么总使用率为(200.05 + 4 0.8)/24, 结果为17.5%,小于20%,那么,你的应用不受影响,而且,还节省了60%以上的费用。点此了解突发性能实例的详情 攻略3:使用抢占式实例 适用对象:企业客户,容器化的应用,或者非关键业务 使用门槛:中 最多可节省费用:90% 请注意,抢占式实例是付费类型的一种,其他的付费类型包括包年包月,按量付费。抢占式实例可以有各种实例规格(通用型、计算型、内存型、异构计算、裸金属等等)。以笔者写稿的当前时间,华北五(呼和浩特)的通用型g5(2vCPU,8G内存,20G高效云盘)为例,抢占型的价格为¥0.081 /时,是按量付费的十分之一,包年包月的四分之一(包月价格折算到小时)。先不要高兴太早。超低的价格,伴随着被动释放的风险。抢占式实例的购买时的定价,是随着市场供需的变化而变化的。当市场供需紧张导致实例价格上涨之后,原有的抢占型实例可能会被释放。值得一提的是,华北五作为新开放的地域,抢占型的g5,过去30天内的平均释放率低到不足3%,也就是说,被释放的概率很低(但仍有释放的概率)。对于企业客户来说,抢占型实例,特别适合对释放不敏感的场景,比如容器化的应用,以及本地无持久化数据的应用,比如数据都持久在单独的数据库里或者远程存储里。此外,抢占型实例也适合临时使用,比如开发测试用途,毕竟抢占型实例在创建一个小时内,是保证不会释放的。抢占型实例在释放前,云监控会至少提前5分钟发出告警事件,开发者可以利用云监控的sdk自动化的消费和处理这一事件,做好释放前的准备工作(手动处理恐怕是来不及的)。点此了解抢占型实例详情 攻略4:使用预留实例券购买按量付费实例 适用对象:企业客户,大量弹性需求,且未来总计算力有明确规划的客户 使用门槛:中-高 最多可节省费用:44%以上 通常,包年包月比按量付费要便宜。但这不是绝对的,我们接下来就介绍几个专门针对按量付费的攻略,使用合理的情况下,可以比包年包月还要便宜。首先就是预留实例券。还是举一个例子,在笔者当前时间在华北三(张家口)使用预留实例券购买3台ecs.g6.large一年,总价格约为 ¥ 5140.80,对比按量付费节约44%的费用,跟包年包月的价格基本一致。那么,使用预留实例券购买按量实例,和购买包年包月实例比,优势在哪里呢?优势就在于按量付费本身。客户可以享受最大的弹性和灵活性,随时释放、重建实例,随时增加和减少实例。只不过,通过购买预留实例券的形式,客户向阿里云承诺了一个年度最低消费额。使用预留实例券是有一定门槛的,客户需要花一些时间理解预留实例券的计费规则,同时做好对未来的弹性计算的需求规划,以决定预留实例券的采购细节。点此了解预留实例券的详情 攻略5:为按量付费实例开启停机不收费 适用对象:有较长时间关机需求的用户 使用门槛:低-中 最多可节省费用:60% (取决于关机时间) 我们举两个例子。一个是办公场景,早晨9点上班,下午5点下班,每天使用ECS时间8个小时,如果为此付24个小时费用,岂不是很冤?在这个场景下,利用自动化的定时开关机结合开启停机不收费,可以节约接近2/3的费用。另一个适用的例子是企业集群场景,在业务低峰时,企业不需要那么多服务器,但是又不敢释放。点此了解停机不收费点此了解定时开关机 攻略6:使用存储容量单位包购买按量付费云盘 适用对象:企业客户,大量弹性需求,且未来总存储容量有明确规划的客户 使用门槛:中 最多可节省费用: 30% 跟预留实例券类似,利用存储容量单位包SCU,可以用很优惠的价格,购买按量付费的云盘。以笔者当前时间,华北2北京为例,1T总容量的ESSD云盘一个月,使用SCU的费用为¥ 1024.00,比按量付费节省三分之一的费用。点此了解存储容量单位包 攻略7:使用弹性伸缩组 适用对象:企业客户,无状态集群应用,业务负载变化大 使用门槛:中-高 最多可节省费用:60%(取决于负载变化) 弹性伸缩(Auto Scaling)是阿里云官方提供的免费产品。弹性伸缩组对应一个业务集群,客户可以定义自己的伸缩规则,比如cpu利用高于70%的时候,自动增加实例(扩容),在cpu利用低于30%的时候,自动减少实例(收缩)。弹性伸缩组可以配合负载均衡服务SLB一起使用。弹性伸缩还支持基于AI人工智能的预测伸缩算法。我们还是假设一个企业的线上业务集群,每天固定有4个小时的峰值需要10台ECS,其他时段需要2台ECS,那么利用弹性伸缩,总共可节省2/3的成本。弹性伸缩组还可以混合使用按量付费和抢占式的方式,达到最大的成本优化的效果。点此了解弹性伸缩组 攻略8:使用弹性供应组 适用对象:企业客户,无状态集群应用,业务负载变化小 使用门槛:中-高 最多可节省费用:参照抢占型实例 弹性供应组是阿里云ECS的一个产品特性,通过自动创建多种规格的抢占式实例,达到以最低的成本交付稳定的总计算力的目的。举个例子,客户可以创建一个50个vcpu的弹性供应组,由多种规格的抢占式实例组成,当实例(即将)被释放的时候,弹性供应组会自动创建新的实例,来保证可用的vcpu数量仍然是50个。弹性供应组的主要目的,是解决抢占式实例被动释放的问题,本质上,还是靠抢占式实例,带来了成本的节约。弹性供应组也可以混合使用按量付费和抢占式实例。点此了解弹性供应组 攻略9:专有宿主机DDH 适用对象:大中企业客户,有专有云和虚拟化的运维经验 使用门槛:高 最多可节省费用:50% 宿主机这个概念来自虚拟化,负责运行虚拟机的物理服务器被称为宿主机。用户可以购买若干台阿里云的专有宿主机(DDH),并将独享这些DDH上的全部计算资源,其他用户的虚拟机(ECS)不会占用这些DDH的计算资源。用户可以指定虚拟机(ECS)运行在哪一台DDH上。为什么DDH能省钱呢?因为有一种DDH叫做CPU超分型,通俗讲,一个物理CPU的核可以虚拟化成为2个vCPU。以华东2地域为例,一台CPU超分型宿主机为15778元/月,可创建84个4核8G的ECS实例,单价187.8元/月,节省48%的费用。什么样的业务适合使用CPU超分型DDH呢?笔者先给一个定义,峰值平均CPU利用率,也就是所有的虚拟机的cpu利用率曲线叠加之后的峰值。只要峰值平均CPU利用率在50%以下,就适合使用CPU超分型DDH。举例来说,虚拟桌面的办公场景,CPU的高峰通常都是离散的随机的。只要不是多数虚拟机在同一个瞬间CPU达到高峰,那么对于单个虚拟机的用户来说,根本感觉不到CPU被超分了。当然,DDH的使用也是有门槛的。客户需要自己负责ECS的调度,也就是,通过合理的动态分配ECS和DDH的对应关系,避免CPU超分带来的性能影响。点此了解专有宿主机
适用的症状和原因 在某些情况下,Linux操作系统会出现启动异常,此时,在阿里云ECS控制台显示的实例状态可能是运行中,但实例内的应用不可访问,实例内的网络不可达,既无法ping通,也无法通过workbench或者ssh建立连接。如果您在阿里云ECS控制台通过vnc连接上去,可能会看到如下的错误提示: unexpected inconsistency;RUN fsck MANUALLY 或者 Give root password for maintenance (or type CTRL-D to continue) 或者 Enter 'help' for a list of built-in commands. (initramfs) 造成以上问题的原因包括但不限于: 实例被强制关机/强制重启,或者突然宕机并造成文件系统数据不一致。 卸载了数据盘,但未从/etc/fstab中删除对应的挂载信息。 /etc/fstab文件丢失或损坏。 initrd文件被损坏。 其他原因造成的文件系统损害。在上述情况下,您可以尝试使用本文的的自救方案,自行修复损伤的Linux实例。 自救方案概览 阿里云的运维编排服务OOS(https://www.aliyun.com/product/oos) ,是阿里云官方提供的免费的自动化运维平台,通过简单的YAML格式的模板,提供自动化任务的管理与执行。本文的自救方案,包含了一个经过阿里云官方测试的OOS模板,从而提供了一键修复的自动化方案。具体使用办法参见后面的“使用步骤”。此自救方案会先对问题实例打镜像备份,然后卸载问题实例的系统盘,挂载到一个新创建的临时实例上,执行检查和修复动作,在修复完成后,重新把系统盘挂载回原实例,并且尝试启动修复后的实例,最后,释放临时实例。支持的操作系统 CentOS 7.2 64位,7.3 64位, 7.4 64位,7.5 64位,7.6 64位,7.7 64位,8.0 64位 Debian 9.6 64位,9.8 64位,9.9 64位,9.11 64位,8.9 64位,8.11 64位, OpenSUSE 42.3 64位,15.1 64位 SUSE Linux Enterprise Server 12 SP4 64位, 12 SP2 64位。 Aliyun Linux 2.1903 64位 Ubuntu 16.04 64位,18.04 64位, 特别提示 • Linux系统启动失败的原因众多,此自救方案不能保证修复所有的系统启动失败的实例。• 修复过程中,会创建临时实例并因此产生一定费用(一般小于1元RMB)。• 此自救方案会修改系统的fstab和initrd文件,在修改之前,会自动对待修复实例打镜像备份,以方便您利用备份镜像恢复数据。保有镜像是收费的(参见快照的收费标准),在您确认实例修复成功之后,您可考虑删除镜像。 准备账号和权限 如果您使用主账号,可以跳过此节,直接查看使用步骤。如果您使用RAM子账号或者角色,请确认该子账号或者角色拥有OOS、ROS、ECS、VPC的适当权限。有如下两种方式:1,您可以给子账号或者角色授予系统权限: AliyunOOSFullAccess ,AliyunROSFullAccess , AliyunECSFullAccess , AliyunVPCFullAccess 的权限。详情参见RAM帮助文档https://help.aliyun.com/document_detail/93732.html。2,您也可以新建自定义策略,然后授权给子账户。参考的策略内容为https://oos-debug.oss-cn-hangzhou.aliyuncs.com/rt_policy.json操作步骤参见阿里云RAM的帮助文档https://help.aliyun.com/document_detail/93733.html。 使用步骤 首先登录到运维编排控制台 。选择问题实例所在的region地域。单击我的模版>创建模版,并选取空白模版。 单击YAML,将ACS-ECS-RescueUnreachableInstance-Linux中模版内容粘贴到空白编辑栏,输入模版名称,单击创建模版。 在我的模版中,找到刚创建成功的模版,单击创建执行。单击 下一步,设置参数 。输入以下的参数。• unreachableInstanceId: 必填,待修复系统盘的实例ID。• credentialType: 必填,修复完系统盘后,将系统盘挂回原实例时将设置的认证凭证,可选择KeyPairName(密钥对)或Password(自定义密码)方式。• credentialValue: 必填,认证凭证值,如选择了密钥对方式则输入密钥对名称;如选择了自定义密码方式,则输入密码。• imagePrefix: 选填,在修复前对待修复实例打镜像,打镜像时设置的镜像名称前缀,默认为OOSRescueBackup-。• helperInstanceType: 选填,将创建临时实例的规格,默认为ecs.t5-lc1m2.large。• 执行使用到的权限的来源:选择当前账号的已有权限。 单击 下一步,确认 ,单击 创建执行 。您可在执行详情中查看OOS模版执行,可通过执行输出的参数rtCommandOutput查看修复脚本执行情况。此执行过程大约需要5-10分钟,请耐心等待。如果执行成功,您的实例应该已经被修复并且处于正常运行中了。 提醒 如果模版执行过程中被取消,或者模板执行中断,可能会造成实例的系统盘被卸载后没有挂载回去,此时,该实例状态会显示无系统盘,您可按如下步骤还原挂载,首先登录到ECS控制台,找到您修复的实例, 单击该实例的ID访问实例详情,单击本实例磁盘,单击挂载云盘,此时在页面上可以查看到源系统盘对应的ID,将此以d-bp为前缀的系统盘id复制并填写到目标光盘搜索栏中,尝试搜索该磁盘ID,根据搜索结果执行如下步骤。• 若可以搜索到该ID,确认选择该磁盘ID, 登录凭证可选择 密钥对 或 自定义密码,该凭证将在您启动实例后通过root用户登录时使用。比如此处 登录凭证 选择的是自定义密码,则请在登录密码和确认密码中填写您要设置的密码,单击确定,单击执行挂载,若挂载成功则可以看到实例状态转变为已停止。• 若无法搜索到该ID,返回查看刚刚创建的OOS执行,在untilStackReady任务中可找到输出参数helperInstanceId,复制对应参数值以i-为前缀的实例iD,然后在ECS控制台中搜索该实例id,找到后释放该临时实例,释放成功后,回到上述步骤:将以d-bp为前缀的系统盘id复制并填写到目标光盘搜索栏中,并按步骤继续挂载系统盘。 自救方案内部的实现逻辑 修复/etc/fstab 检查 /etc/fstab。如果/etc/fstab已经存在,则备份原文件。 修复/etc/fstab • 当/etc/fstab 不存在或者解析失败时,创建默认/etc/fstab。 • 当发现nofail没有设置时,设置nofail,防止启动失败。 • 当发现fsck选项打开时,将fsck选项关闭。 更新ramdisk 检查/boot里面的ramdisk,如果存在,则备份原文件。 重新构建 ramdisk 文件。
适用的症状和原因 在某些情况下,Linux操作系统会出现启动异常,此时,在阿里云ECS控制台显示的实例状态可能是运行中,但实例内的应用不可访问,实例内的网络不可达,既无法ping通,也无法通过workbench或者ssh建立连接。如果您在阿里云ECS控制台通过vnc连接上去,可能会看到如下的错误提示: unexpected inconsistency;RUN fsck MANUALLY 或者 Give root password for maintenance (or type CTRL-D to continue) 或者 Enter 'help' for a list of built-in commands. (initramfs) 造成以上问题的原因包括但不限于: 实例被强制关机/强制重启,或者突然宕机并造成文件系统数据不一致。 卸载了数据盘,但未从/etc/fstab中删除对应的挂载信息。 /etc/fstab文件丢失或损坏。 initrd文件被损坏。 其他原因造成的文件系统损害。在上述情况下,您可以尝试使用本文的的自救方案,自行修复损伤的Linux实例。 自救方案概览 阿里云的运维编排服务OOS(https://www.aliyun.com/product/oos) ,是阿里云官方提供的免费的自动化运维平台,通过简单的YAML格式的模板,提供自动化任务的管理与执行。本文的自救方案,包含了一个经过阿里云官方测试的OOS模板,从而提供了一键修复的自动化方案。具体使用办法参见后面的“使用步骤”。此自救方案会先对问题实例打镜像备份,然后卸载问题实例的系统盘,挂载到一个新创建的临时实例上,执行检查和修复动作,在修复完成后,重新把系统盘挂载回原实例,并且尝试启动修复后的实例,最后,释放临时实例。支持的操作系统 CentOS 7.2 64位,7.3 64位, 7.4 64位,7.5 64位,7.6 64位,7.7 64位,8.0 64位 Debian 9.6 64位,9.8 64位,9.9 64位,9.11 64位,8.9 64位,8.11 64位, OpenSUSE 42.3 64位,15.1 64位 SUSE Linux Enterprise Server 12 SP4 64位, 12 SP2 64位。 Aliyun Linux 2.1903 64位 Ubuntu 16.04 64位,18.04 64位, 特别提示 • Linux系统启动失败的原因众多,此自救方案不能保证修复所有的系统启动失败的实例。• 修复过程中,会创建临时实例并因此产生一定费用(一般小于1元RMB)。• 此自救方案会修改系统的fstab和initrd文件,在修改之前,会自动对待修复实例打镜像备份,以方便您利用备份镜像恢复数据。保有镜像是收费的(参见快照的收费标准),在您确认实例修复成功之后,您可考虑删除镜像。 准备账号和权限 如果您使用主账号,可以跳过此节,直接查看使用步骤。如果您使用RAM子账号或者角色,请确认该子账号或者角色拥有OOS、ROS、ECS、VPC的适当权限。有如下两种方式:1,您可以给子账号或者角色授予系统权限: AliyunOOSFullAccess ,AliyunROSFullAccess , AliyunECSFullAccess , AliyunVPCFullAccess 的权限。详情参见RAM帮助文档https://help.aliyun.com/document_detail/93732.html。2,您也可以新建自定义策略,然后授权给子账户。参考的策略内容为https://oos-debug.oss-cn-hangzhou.aliyuncs.com/rt_policy.json操作步骤参见阿里云RAM的帮助文档https://help.aliyun.com/document_detail/93733.html。 使用步骤 首先登录到运维编排控制台 。选择问题实例所在的region地域。 单击我的模版>创建模版,并选取空白模版。 单击YAML,将ACS-ECS-RescueUnreachableInstance-Linux中模版内容粘贴到空白编辑栏,输入模版名称,单击创建模版。 在我的模版中,找到刚创建成功的模版,单击创建执行。 单击 下一步,设置参数 。 输入以下的参数。• unreachableInstanceId: 必填,待修复系统盘的实例ID。 • credentialType: 必填,修复完系统盘后,将系统盘挂回原实例时将设置的认证凭证,可选择KeyPairName(密钥对)或Password(自定义密码)方式。• credentialValue: 必填,认证凭证值,如选择了密钥对方式则输入密钥对名称;如选择了自定义密码方式,则输入密码。• imagePrefix: 选填,在修复前对待修复实例打镜像,打镜像时设置的镜像名称前缀,默认为OOSRescueBackup-。• helperInstanceType: 选填,将创建临时实例的规格,默认为ecs.t5-lc1m2.large。• 执行使用到的权限的来源:选择当前账号的已有权限。 单击 下一步,确认 ,单击 创建执行 。 您可在执行详情中查看OOS模版执行,可通过执行输出的参数rtCommandOutput查看修复脚本执行情况。此执行过程大约需要5-10分钟,请耐心等待。如果执行成功,您的实例应该已经被修复并且处于正常运行中了。 提醒 如果模版执行过程中被取消,或者模板执行中断,可能会造成实例的系统盘被卸载后没有挂载回去,此时,该实例状态会显示无系统盘,您可按如下步骤还原挂载,首先登录到ECS控制台,找到您修复的实例, 单击该实例的ID访问实例详情,单击本实例磁盘,单击挂载云盘,此时在页面上可以查看到源系统盘对应的ID,将此以d-bp为前缀的系统盘id复制并填写到目标光盘搜索栏中,尝试搜索该磁盘ID,根据搜索结果执行如下步骤。• 若可以搜索到该ID,确认选择该磁盘ID, 登录凭证可选择 密钥对 或 自定义密码,该凭证将在您启动实例后通过root用户登录时使用。比如此处 登录凭证 选择的是自定义密码,则请在登录密码和确认密码中填写您要设置的密码,单击确定,单击执行挂载,若挂载成功则可以看到实例状态转变为已停止。• 若无法搜索到该ID,返回查看刚刚创建的OOS执行,在untilStackReady任务中可找到输出参数helperInstanceId,复制对应参数值以i-为前缀的实例iD,然后在ECS控制台中搜索该实例id,找到后释放该临时实例,释放成功后,回到上述步骤:将以d-bp为前缀的系统盘id复制并填写到目标光盘搜索栏中,并按步骤继续挂载系统盘。 自救方案内部的实现逻辑 修复/etc/fstab 检查 /etc/fstab。如果/etc/fstab已经存在,则备份原文件。 修复/etc/fstab• 当/etc/fstab 不存在或者解析失败时,创建默认/etc/fstab。 • 当发现nofail没有设置时,设置nofail,防止启动失败。• 当发现fsck选项打开时,将fsck选项关闭。 更新ramdisk 检查/boot里面的ramdisk,如果存在,则备份原文件。 重新构建 ramdisk 文件。
本文面向的读者 如果您是一个Kubernetes的初学者,本文可以帮助你快速在云上搭建一个可实际使用的集群环境,并发布自己的第一个应用。你无须提前准备任何的硬件资源或者下载任何的软件包。如果您已经有一个自建的Kubernetes集群,想要尝试阿里云上的托管集群,本文可以帮助你快速完成上手操作,而无需详细阅读阿里云的帮助文档,从而节省您的时间。您可以在有了端到端的初体验之后,再有选择的阅读容器服务和容器镜像服务的帮助文档。如果你已经有一个传统的部署在云上的Web应用(比如部署在云上的ECS里),想要进行容器化的改造,本文同样可以帮助到您,您甚至无需深入学习Kubernetes,只需了解基本概念即可。 准备代码 本文的操作全部基于阿里云控制台,因此您只需要一个阿里云控制台的登录账号即可。我们先把应用的代码准备好。请登录https://code.aliyun.com/ ,登录完成后,访问https://code.aliyun.com/shengbo.tsb/yunputest ,点击派生项目(fork)的图标。 在随后弹出的确认框里,点击头像确认,完成派生。 备选方案:如果您派生遇到了困难,可以直接从https://github.com/docker-training/webapp clone这个项目,然后自己通过git push到code.aliyun.com上。 准备镜像仓库 登录https://cr.console.aliyun.com/cn-beijing/instances/repositories在左侧导航栏选择“命名空间” 点击“创建命令空间”,输入名字“tengshengbo”。确认命名空间创建完成之后,点击左侧导航栏“镜像仓库”,点击“创建镜像仓库”,输入仓库名称“yunputest” 在下一步,选择刚刚建立的代码仓库。选择“海外机器构建”以加快构建速度。提示:如果下拉框没有代码仓库,点击右侧的刷新按钮。 创建新镜像 回到https://code.aliyun.com/ 点击yunputest这个项目,注意,是自己名下的项目,而不是shengbo.tsb这个账号名下的项目。 点击“新标签”. 输入标签名release-v1.5。注意,您必须使用release-v[版本号]形式,比如release-v2.5或者其他。 返回镜像仓库列表,https://cr.console.aliyun.com/cn-beijing/instances/repositories选择自己的镜像仓库,左侧导航选择“构建”,可以看到一个构建自动生成了。 创建Kubernetes集群 访问容器服务控制台 https://cs.console.aliyun.com/#/k8s/cluster/list选择“创建Kubernetes集群”, 集群模板选择第一个“标准托管集群” 集群名称选择“yunpu-k8s”,选择专有网络和虚拟交换机,勾选公网访问(为了开发测试方便),选择实例类型(如果不考虑性能,单纯为了省钱,可以使用t5或者t6实例),其他默认就好。 注意:Pod CIDR,Service CIDR不能与VPC内已有网段冲突,如果提示有错误,请更换网络的CIDR。 在确认对话框里勾选协议,完成创建。之后,确认自己的集群运行中。 部署第一个应用 容器服务的左侧导航栏选择“应用-无状态”,点击“使用镜像创建”,在“应用基本信息”这一部分, 输入应用名称yunpuapp, 选择刚创建的集群yunpu-k8s, 其他默认。 下一步,容器配置,镜像名称一项,点击“选择镜像”,选择刚才自动从代码创建的镜像 镜像Tag一项,点击“选择镜像Tag”,选择你刚刚自己定义的版本号,比如1.4。其他保持默认。点击下一步。 在高级配置里面,点击“服务(Service)”旁边的“创建”, 端口映射一项,输入名称port,注意服务端口80,容器端口5000. 点击“路由(Ingress)”旁边的“创建”,输入域名yunpuapp选择刚刚创建的服务以及port。 创建成功之后,可以看到应用的访问方式,在“路由(Ingress)”里面,“规则”一项,有一个链接。 点击这个链接,可以访问应用,显示内容包含响应时间、应用运行时的host name以及IP地址。多次刷新链接,可以看到不同的ip地址,这个说明后面对应的容器组Pod是多个。 升级应用 建议您自行尝试更改应用的代码,比如简单更改webapp/app.py这个文件,完成git tag后,git push. $ git tag release-v1.5 $ git push origin release-v1.5 或者,您也可以直接在 https://code.aliyun.com/ 控制台上,为master分支新建标签release-v1.5 等待镜像更新完成后,在“无状态应用”页,点击应用旁边的“编辑”。 编辑页面,选择新的版本1.5,点击更新 下一步 阿里云的容器服务Kubernetes不是只有托管版,还有专有版和Serverless版。专有版适合有丰富的容器运维经验,希望长时间运行某个应用,并且独立自主运维全部基础设施的的大企业用户。Serverless版适合不希望关心基础设施的运维,或者只是短时间运行某个应用从而希望开箱即用的中小企业用户。本文介绍的托管版则介于专有版和Serverless版两者之间。 如果您想了解更多,建议参考以下资料:容器服务Kubernetes版帮助文档: https://help.aliyun.com/product/85222.html容器镜像服务帮助文档: https://help.aliyun.com/product/60716.html 如果您需要针对容器服务进行运维,参考以下资料:运维编排:https://help.aliyun.com/product/119529.html资源编排:https://help.aliyun.com/product/28850.html
运维,是从IT诞生起就一直存在的重要角色,为软硬件系统的整体稳定性、效率、安全等指标负责。最近几年,伴随着云计算和DevOps的广泛应用,运维更是成了舞台中央最亮眼的主角之一。 值得关注的是,云时代的运维,正在颠覆传统的运维。传统的运维,需要能够手动操作来自众多厂家的计算、网络、存储等软硬件,并为此学习传统“大厂”的众多认证,例如,数据库运维要学Oracle的认证,系统运维要学IBM的认证,虚拟化运维要学VMware的认证,等等。但企业上云之后,云厂商将计算、存储、网络的操作全部抽象成了软件定义的API接口,并用统一风格的SDK、命令行进行封装,从而大幅降低了运维操作的门槛。云上的运维人员不再需要感知底层基础设施的细节,更不需要考取高难度的认证。 当然,云时代也对运维人员提出了新的要求和挑战。首当其冲的,就是DevOps,强调高度的自动化,要求运维人员具备一定的开发技能。以国内最大的云厂商阿里云为例,运维人员需要学习并掌握阿里云主流云产品(云服务器,云数据库,对象存储,专有网络等等)的API,才能从容的根据自己企业的实际运维需要,开发实现自动化运维系统。这样一来,运维操作工程师,就升级成了运维开发工程师。 既然谈到了运维开发,就离不开编程语言和开发平台。运维开发与普通软件开发不同,对于快速开发的要求应该是第一位的,因为运维开发的需求变化更频繁,开发周期更短,人力也更为紧张。阿里云提供的JavaPythonGo等语言的SDK,虽然能力强大,但是能力过于“原子”。若没有平台的支持,要运维人员自己从头搭建一个自动化运维系统,并保证其高效稳定持续运行,难度和投入都很大。为了保证生产系统的稳定,创造了一个运维系统,那么,谁来保证这个运维系统的稳定呢?这是一个悖论。 为了进一步的提升运维开发人员的开发效率,降低开发的难度,阿里云推出了资源编排(Resource Orchestration Service,简称ROS),和运维编排Operation Orchestration Service,简称OOS)这两个编排平台。作为平台级的产品,阿里云会负责保证其稳定可靠,用户只需要按照平台的规则制定自己的运维逻辑。那么什么是编排呢?编排来源于交响乐,是指通过编曲,把各种不同乐器的演奏,和谐的融合在一起。运维开发人员,就像交响乐作曲家,通过编写YAML格式的编排模板,把各种不同的资源、配置、动作,串联在一起。 先来说资源编排ROS。假设一个场景,在阿里云上搭建一个经典的三层在线服务:前面是SLB负载均衡,中间是若干台ECS作为一个服务集群,后面再挂接一套RDS数据库。当然,你还需为这三层分别各自创建一个VPC,通过安全组设置安全规则。在业务初期你可能只需要两台ECS,但很快会扩大到3台、4台。按照传统的运维思维,需要给系统下达原子的命令:今天创建一台,明天再创建一台。但是按照ROS声明式的语法,运维开发人员只需要指定自己当前的资源需要。比如把MaxAmount值从3改成5(见如下例子),ROS会自动新建两台ECS。再比如把MaxAmount从3改成2,ROS会自动释放其中一台ECS。我们把这种全自动的管理资源的生命周期的方式,叫做“基础设施即代码”。 Resources: InstanceGroup: Type: 'ALIYUN::ECS::InstanceGroup' Properties: MaxAmount: 3 InstanceType: Ref: InstanceType ImageId: Ref: ImageId SecurityGroupId: Ref: SecurityGroupId VSwitchId: Ref: VSwitchId 运维是一个非常广泛的概念,资源的生命周期管理,只是其中一小部分。运维,还涉及到了监控、故障处理、持续发布、资源分组、审计等等各种需求。为了满足普适的运维需要,阿里云推出了运维编排(OOS)产品。同样是基于YAML的编排,但是与ROS不同的是,OOS编排的是一个个的原子动作(API)。几乎所有阿里云控制台上的操作,都可以通过OpenAPI来完成,而几乎所有的API动作,都可以通过OOS来完成,因此,我们可以说,所有的阿里云上的运维动作,都可以通过OOS来自动化完成。不仅如此,阿里云OOS还内置了三个强大的运维功能:定时任务、事件触发器和云助手命令。定时任务很容易理解,用户只需要编写cron表达式,OOS就会精确地定时触发,例如,每天早晨八点开启服务器。事件触发器可以跟云监控的事件(或者告警)相结合,实现“事件驱动”的自动化运维,尤其是自动化的故障恢复,运维人员无需关心事件的具体接收过程。云助手命令则可以让开发人员,在无需开启SSH接口的情况下,远程在linux里面执行系统命令。我们举一个事件驱动和云助手结合的例子,当60秒的平均CPU利用率超过90%的时候,重启tomcat服务,OOS模板的示例(节选)如下: Tasks: - Name: alarmTrigger Action: 'ACS::AlarmTrigger' Properties: Namespace: acs_ecs_dashboard MetricName: cpu_total Statistics: Average ComparisonOperator: GreaterThanThreshold Threshold: '90' Resources: '[{"instanceId":"{{ instanceId }}"}]' Period: 60 - Name: runcommnd Action: ACS::ECS::RunCommand Properties: commandContent: 'service tomcat restart' instanceId: '{{ instanceId }}' commandType: RunShellScript 通过上面的例子,我们可以看出,ROS和OOS,可以帮助运维开发人员,以最快的速度和最少的代码,实现常见运维任务的自动化。阿里云官方,为ROS和OOS提供了一系列的公共模板,开源在github上,感兴趣的运维同学们可以阅读学习,或者基于这些现有的模板随意进行二次开发。 ROS公共模板:https://github.com/aliyun/ros-templates OOS公共模板:https://github.com/aliyun/oos-templates 运维同学可能会想到,能否将ROS和OOS结合使用呢?答案是肯定的。可以在OOS模板里,对ROS进行API调用。具体的实现,还希望聪明的运维同学们参考ROS和OOS的官方帮助文档,自己尝试一下。 ROS主页:https://www.aliyun.com/product/ros OOS主页:https://www.aliyun.com/product/oos 阿里云正在筹办“弹性计算自动化运维模板挑战赛”。也欢迎运维开发同学们积极参与,奖励丰厚。如有问题,欢迎加入钉钉群咨询。 ROS支持群群号:11783495 OOS支持群群号 : 23330931
背景与痛点 阿里云的客户远程在ECS内部执行命令是最常见的运维操作之一了,比如在ECS内安装卸载软件,启动停止某个进程,等等。很多情况下,还需要对一个ECS列表中的多台ECS,统一的执行某个相同的命令并汇聚执行的结果。 一个可行的方案是利用SSH远程连接到ECS上执行命令,但是开放ECS的SSH端口给internet访问是危险的。客户可以通过自建跳板机来间接访问ECS以解决安全性的问题,但是这带来了复杂度和成本的上升。 Ansible是业界比较流行的开源的运维工具,但是其认证是独立于阿里云的账号体系之外的,无法通过阿里云的官方工具进行权限控制,其操作记录也无法在阿里云上进行审计。 如果用户使用的是Windows版本的ECS,虽然可以利用PowerShell远程执行命令,但是配置和维护过程更加困难。 在此,我们向大家推荐阿里云官方的批量在多台ECS内执行命令的最佳实践:运维编排服务OOS+云助手。云助手提供了在ECS内执行命令的原子能力,运维编排服务OOS则附加了更丰富的批量、定时、事件驱动、自定义模板等能力,两者结合,可以让ECS运维工作变得既安全又简单高效。 准备工作 准备工作只有两个简单步骤。 首先,请访问运维编排OOS的控制台点一下“立即开通”按钮完成服务的开通。这是一个免费服务,请放心开通。 https://oos.console.aliyun.com/ 开通之后,请确保您已安装和配置了阿里云命令行工具CLI,且版本号大于等于 3.0.19。该CLI在Github上的下载链接为:https://github.com/aliyun/aliyun-cli/releases 开始执行 我们直接先看一个例子,我要针对cn-beijing地域的["i-1234","i-5678"]这两台远程Linux ECS,执行“echo 123”这个shell命令,我只需要在我本地的shell终端里,输入命令: ali-xxxxxx:~ shengbo$ aliyun oos StartExecution --region cn-beijing --TemplateName ACS-ECS-BulkyRunCommand --Parameters '{"commandType":"RunShellScript", "commandContent":"echo 123", "targets":{"Type":"ResourceIds", "ResourceIds":["i-1234","i-5678"]}, "rateControl":{"maxErrors":0,"mode":"Concurrency"}, "OOSAssumeRole":"" }' 简单解释一下上面这个命令,它调用了oos的StartExecution的API,启动官方提供的公共模板ACS-ECS-BulkyRunCommand,传入包含了ECS实例列表(ResourceIds)和执行内容(commandContent)的参数。 该命令会返回一个json结构,如果你能找到"ExecutionId": "exec-xxxxx", 那么恭喜你,你指定的命令已经开始在远程执行了。 屏幕快照 2019-10-14 下午7.25.30.png 请记录下ExecutionId,然后作为参数输入到下面的ListExecutions命令查询执行的过程和结果: ali-6c96cfde303d:~ shengbo$ aliyun oos ListExecutions --region cn-beijing --ExecutionId exec-xxxx 如果命令正在运行中,你会看到类似如下的结果,Status是“running”。TotalTasks是总的命令数,SuccessTasks是已经执行成功的命令数。两个数字的差,就是还待执行的命令数。 你可以多次执行同样的ListExecutions命令进行查看,直到看到Outputs表示整个命令的结果,对于本例,为两台ECS上的标准输出: 进阶-自定义模板 在上面的例子里,命令的参数有点过于复杂,其实我可以自定义模板把参数固定下来,让执行的命令变得格外简单。 自定义模板的命令如下,你可以根据自己的需要进行改写: aliyun oos CreateTemplate --region cn-beijing --TemplateName sample123 --Content '{ "FormatVersion": "OOS-2019-06-01", "Tasks": [ { "Name": "runCommand", "Action": "ACS::ECS::RunCommand", "Properties": { "commandContent": "echo 1234", "instanceId": "{{ ACS::TaskLoopItem }}", "commandType": "RunShellScript" }, "Loop": { "Items": [ "i-1234", "i-5678" ], "Outputs": { "commandOutputs": { "AggregateType": "Fn::ListJoin", "AggregateField": "commandOutput" } } }, "Outputs": { "commandOutput": { "Type": "String", "ValueSelector": "invocationOutput" } } } ], "Outputs": { "commandOutputs": { "Type": "List", "Value": "{{ runCommand.commandOutputs }}" } } }' 今后,你只需要执行如下命令就可以完成和前面一样的效果了 ali-6c96cfde303d:~ shengbo$ aliyun oos StartExecution --region cn-beijing --TemplateName sample123 --Parameters '{}' 此命令调用oos的StartExecution这个API,执行sample123这个自定义模板,不需要额外传入参数。 当然,前面用CLI所做的一切操作,都可以在OOS控制台用白屏化的方式执行,链接为: https://oos.console.aliyun.com/ 了解更多 运维编排OOS是阿里云的运维自动化平台,适用于批量、定时、事件驱动、跨区域运维等场景,除了在ECS内执行命令外,还可以完成ECS创建释放,启停,变配,网络带宽升级,挂载云盘等等各种操作。 如果想了解更多,加入钉钉群“运维编排OOS支持群”,群号23330931。我们会有值班人员在线支持。 OOS管理控制台的链接:https://oos.console.aliyun.comOOS帮助文档的链接 https://help.aliyun.com/product/119529.html
下面是作者在CSDN主办的AI ProCon 2019暨AI开发者大会上所做的主题演讲的PPT。欢迎评论和转载。
什么是克隆? 如果您熟悉虚拟化,大概率听说过克隆这个功能。克隆,就是根据源虚拟机,复制生成另外一台(或多台)一模一样的虚拟机。 对于阿里云的ECS用户来说,克隆也是一个常见的场景。比如,当您在某个可用区遇到库存不足的场景的时候,可以选择把您的ECS批量克隆到另外一个可用区。再比如,您已经有了杭州区域的ECS,现在需要做异地的灾备,可以把杭州的ECS克隆到北京。 在阿里云OOS运维编排发布之前,克隆一台ECS是需要在控制台手工进行多个操作步骤,分别是:登录控制台并选中ECS,创建镜像,复制镜像(可选),从镜像创建实例,详见官方帮助文档同一账号下如何克隆ECS实例。由于没有原子的API能力,如果需要自动化的批量克隆,就是一个相当复杂的开发任务了。 一键批量轻松跨区域克隆 现在,借助OOS运维编排的能力,您可以在控制台进行一键克隆了。如果您想了解什么是运维编排,请参考之前的文章 阿里云重磅发布云上自动化利器——运维编排OOS我们以把两台ECS从上海克隆到美国(硅谷)举例。 首先,请登录OOS的控制台。如果您之前从未开通过OOS服务,请点击“立即开通”按钮,即可一键开通。OOS运维编排是安全免费的服务,请放心开通。 OOS是支持跨区域进行运维操作的,我们可以随意选择一个区域,考虑到效率,我们选择在上海区域进行操作,找到“ACS-ECS-CloneInstancesAcrossRegion”这个公共模板。 点击“创建执行”的按钮,选择“客户了解风险,无需确认”的按钮,点击下一步设置参数。 设置参数页,需要输入如下参数: InstanceIds:批量输入ECS的实例ID,这里我们输入两台的ID。 RegionId:这里指的是已有的源ECS所在的区域的ID,这里是cn-shanghai targetRegionId: 这里是us-west-1 targetInstanceType: 您可以输入不同的实例类型进行升级,但是建议和克隆前保持一致 targetSecurityGroupId: 目标可用区的安全组ID targetVSwitchId: 目标可用区的交换机ID targetZoneId: 目的可用区的ID,这里我们使用us-west-1a,如果您不知道该用哪个可用区,可以查看DescribeZones官方帮助文档 ,里面有个调试功能,选择可用区,可以直接列出可用区列表。 接下来,进入OOS控制台的执行管理页,查看执行,可以看到图形化的执行过程。 由于是跨区域克隆,可能会耗费几分钟时间。执行成功之后,在任务的结果输出您可以看到新克隆的ECS的ID。您也可以在目标区域的ECS控制台看到新生成的ECS。 如果执行失败,您可以在执行日志里面看到失败的细节原因,常见的原因包括输入的VSwitchId并不在指定的可用区,或者指定可用区暂时不支持售卖输入的实例类型。 进阶:同区域克隆,一个OpenAPI调用完成批量克隆 另外还有一个公共模板,叫做“ACS-ECS-CloneInstancesAcrossAZ”,可以实现同一个区域内的实例,从一个可用区到另一个可用区的复制,您只需要输入InstanceIds,regionId,targetZoneId等信息,点击执行即可。由于省略了跨区域镜像复制的过程,在同一个区域内克隆ECS会更快一些。 如果您想在同一个可用区内克隆ECS,怎么办呢?很简单的,您仍然可以使用“ACS-ECS-CloneInstancesAcrossAZ”这个模板,只不过输入的targetZoneId和当前ECS所在的ZoneId一样就可以了。 如果您觉得公共模板不够好用,有自己的定制化需求怎么办呢?您可以把公共模板“克隆”一份,保存成自己的自定义模板,然后随意编辑,比如,您可以固化一部分参数到您的模板里,这样您下次执行的时候,就不需要输入这么多复杂的参数了。举例来说,您可以从Parameters里面删除“regionId”这一参数,然后把“RegionId: '{{ regionId }}'”这一行,替换为”RegionId: 'cn-shanghai'”。 更进一步,如果您不喜欢逐个instanceid的输入,可以自定义模板,改成通过指定ecs的tag,把包含有指定tag的ecs全部批量克隆。甚至,您可以把账号下在某个region的ecs,全部克隆到另一个region。您可以参考我们的开源模板库 https://github.com/aliyun/oos-templates 。 如果您想要和自己的运维系统做集成怎么办呢?也比较简单,您可以通过openapi或者sdk触发执行公共模板和自定义模板。API文档:https://help.aliyun.com/document_detail/120771.htmlSDK:https://help.aliyun.com/document_detail/120786.html 帮助和支持 如果您有进一步的需求或者寻求技术支持,可以加入钉钉群“运维编排OOS支持群”,群号23330931。我们会有值班人员在线支持。 OOS管理控制台的链接: https://home.console.aliyun.com/redirect.htm?productId=ecs&path=automation/region/OOS帮助文档的链接OOS客户支持钉钉群:23330931 阿里云重磅发布云上自动化利器——运维编排OOS玩转运维编排服务的权限:Assume Role+Pass Role运维编排场景系列-----给ECS实例自动打TAG运维编排场景系列----从实例中拷贝文件到OSS运维编排场景系列----给实例加到SLS机器组
附件是作者在DevOps2019北京峰会的专题讲座的演讲稿。欢迎阅读评论。
什么是运维编排服务? 阿里云运维编排服务(Operation Orchestration Service,简称OOS)是云上的自动化运维平台,提供运维任务的管理和执行。典型使用场景包括:事件驱动运维,批量操作运维,定时运维任务,跨地域运维等,OOS为重要运维场景提供审批,通知等功能。OOS帮用户实现标准化运维任务,从而实践运维即代码(Operations as Code)的先进理念。OOS支持跨产品使用,用户可以使用OOS管理ECS、RDS、SLB、VPC等云产品。 用大白话讲,就是阿里云的用户编写一个包含运维逻辑的模板,提交给OOS,然后OOS在云端,以用户的身份执行这个模板里面的运维逻辑。 阿里云OOS的公共模板已经开源在github 更多的信息请参考之前的文章 阿里云重磅发布云上自动化利器——运维编排OOS或参考运维编排官方帮助文档 权限相关的三个基本概念:用户,授权策略,角色 先说用户,用户就是账号,这个概念很好理解。用户分为两类:主账号和子账号。 阿里云上的用户在最开始使用阿里云服务的时候,都会注册一个云账号,这个注册生成的账号就叫做主账号,可以理解为root账号,拥有最高的权限。 接下来,拥有主账号的用户如果想要创建子账号,就需要开通一个叫做RAM (Resource Access Management)的云产品。开通RAM之后,就可以在RAM控制台上,创建子账户。 创建子账户的目的,是为了限制子账户的权限,避免root账户被滥用和泄露的风险。 那么,子账户的权限如何限制呢?这儿就要先引入授权策略的概念。授权策略表示一组权限的集合,比如针对ECS的创建销毁启停的权限集合。授权策略也分两类,一类是阿里云内置的系统授权策略,另一类是用户自定义的授权策略。OOS服务默认包含了两个系统授权策略,一个叫做OOSFullAccess,相当于拥有了OOS这个服务的全部权限,另一个叫做OOSReadOnlyAccess,相当于只能读取OOS的模板和历史执行的数据,不能做修改模板也不能启动执行。 账号和授权策略之间,是多对多的关系。主账户或者管理员,可以决定,每一个子账号拥有哪些权限策略。比如,给user1分配OOSFullAccess权限策略,而给user2分配OOSReadOnlyAccess权限策略。 那么,什么是角色(Role)呢?角色是一种虚拟的用户,它不对应任何可以控制台登录的账户,但主账号或管理员可以创建Role并给Role像普通用户一样赋予授权策略。那么谁来使用这些虚拟用户(Role)呢?典型的使用场景就是云产品。主账户或者管理员,可以为角色配置“信任关系”,也就是可以决定哪些云产品能够使用这些虚拟账户。 权限问题1:Assume Role OOS的核心功能,是要按照用户的身份去执行用户提前编写好的模板。这里面就涉及到了一个基本问题:OOS作为一个云产品,用什么样的身份去执行用户编写的模板呢? 如果单从简单实现的角度,而不考虑安全,那么阿里云直接给OOS赋予一个超级权限就可以了,反正是“自家”产品。这样做可以吗?我们认为不可以。用户需要有能力对OOS进行限制,需要可以决定OOS可以操作哪些资源,不可以操作哪些资源。也就是说,OOS在执行用户的模板的时候,一定是“扮演”了某个用户可控的身份。 相信聪明的读者已经想到了,这里用到了前面介绍的角色(Role),以及Assume Role这个功能。Assume Role,就是云产品,扮演用户的某个角色。用户,需要进行两个操作步骤:第一步,就是创建一个角色(Role),并且信任运维编排服务,如下图所示: 第二步,就是给这个角色赋予权限策略,用户如果希望OOS来管理ECS,就可以考虑把AliyunECSFullAccess这个权限策略赋予给这个角色。 那么,接下来,OOS是怎么Assume Role执行模板的呢? 在OOS模板里面,可以通过“RamRole”这个字段指定一个角色,OOS在后台执行这个模板的时候,就会尝试扮演这个Role。如果模板没有指定,那么OOS就会尝试扮演默认的角色,也就是OOSServiceRole这个角色。 FormatVersion: OOS-2019-06-01 RamRole: 'OOSServiceRole' Tasks: - Name: describeRunningInstancesByTag Action: ACS::ExecuteApi Description: Views running ECS instances by specifying tag. Properties: Service: ECS API: DescribeInstances Parameters: Status: Running Tags: - Key: 'tagkey' Value: 'tagvalue' 如果用户没有预先创建相应的角色,那么在执行的时候,就会报错,错误消息类似于“:Assumes role failed. Code: EntityNotExist.Role, msg: The role not exists: acs::111111:role/OOSServiceRole.” 如果用户创建了这个角色,但是并没有信任运维编排服务,那么,就会报错,错误消息类似于“Assumes role failed. Code: NoPermission, msg: You are not authorized to do this action. You should be authorized by RAM.” 用户可以手动编辑该Role对应的信任策略 { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "oos.aliyuncs.com" ] } } ], "Version": "1" } 权限问题2:Pass Role 如果操作OOS的都是主账号或者管理员,那么问题似乎已经解决了。但事实上,企业IT部门,都会有子账户的需求。子账户的权限,往往各种各样。虽然管理员信任OOS服务来扮演模板中指定的角色,但是管理员未必信任所有的子账户,通过执行OOS服务来使用上述的角色。这里面,OOS服务成了一个中间人,子账户使用OOS,OOS使用角色。那么,如何决定子账户对于角色的间接使用权限呢?这就利用到了角色传递(Pass Role)这个功能。 下面,我们都过两个不同场景,来解释和说明。 场景1:子账户执行一个公共模板,比如给一批ECS设置定时启动,并选择使用非默认的角色MyOOSRole(我们的公共模板,是允许用户在执行时选择角色的)。这个场景非常常见。管理员要提前做两步动作:第一步,准备一个权限策略,要允许PassRole调用MyOOSRole这个角色,权限策略具体内容如下: { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram::{parent_uid}:role/myoosrole" } ] } 第二步,把这个权限策略赋予该子账户。 如果子账户没有相应的PassRole权限,会报错提示“User has no permission to do the action: (PassRole)”。 场景2:委托授权。我们想象一个场景,高规格的ECS是需要部门经理审批后才能创建的,按照前面介绍的PassRole场景,我们可以把“申请-审批-创建ECS-给ECS初始化”的整个工作流编排到一个模板里,同时准备一个拥有ECS权限并且信任OOS服务的角色,然后把这个模板交给普通用户使用。这里面有个问题,就是我们既不希望给普通用户授予PassRole权限,也不希望给普通用户授予创建ECS的权限,怎么办呢?为了同时实现安全性和方便性,我们推荐“委托授权”。在这个场景里面,有两类不同的子账户,第一类是模板的管理者,负责自定义模板的开发和维护工作,比如“申请一台高规格的ECS实例”的模板。另一类子账户是模板的执行者,需要通过执行这个模板来发起对于ECS的申请。模板的管理者拥有模板编辑的权限,给模板指定了一个角色,并拥有该角色对应的PassRole权限。而模板的执行者,只需要拥有该模板的执行权限就可以了,并不需要感知模板后面对应的角色,更不需要该角色的PassRole权限。这种场景,就叫做模板的管理者把PassRole权限“委托授权”给了模板的执行者。 在委托授权的场景下,PassRole的鉴权动作,发生在模板管理员创建模板的时候,而不是在模板执行者执行模板的时候,理由是该模板的角色(假设为OOSServiceRole)是在创建时刻被模板管理员指定的,执行者不感知角色。在权限策略的分配上,模板管理者需要PassRole调用OOSServiceRole的权限 + 编辑模板的权限,模板执行者只需要读取和执行模板的权限。请注意,这不适用于场景1中,子账户在执行模板时自主选择角色的情况。 在实际使用中,管理员可能会创建多个角色,都信任给OOS来扮演。那么在给子账户赋予PassRole权限的时候,如果把角色一个个都列出来,也会很繁琐。为了简化,管理员可以决定,只要是OOS能扮演的角色,就都允许某个子账户PassRole调用。比如,AliyunOOSFullAccess这个系统权限策略就是: { "Statement": [ { "Action": "oos:*", "Effect": "Allow", "Resource": "*" }, { "Action": "ram:PassRole", "Resource": "*", "Effect": "Allow", "Condition": { "StringEquals": { "acs:Service": "oos.aliyuncs.com" } } } ], "Version": "1" } 欢迎使用OOS OOS管理控制台的链接: https://home.console.aliyun.com/redirect.htm?productId=ecs&path=automation/region/OOS帮助文档的链接OOS客户支持钉钉群:23330931 系列文章 主题文章 阿里云重磅发布云上自动化利器——运维编排OOS 场景系列 运维编排场景系列-----给ECS实例自动打TAG运维编排场景系列----从实例中拷贝文件到OSS运维编排场景系列----给实例加到SLS机器组
常见的运维问题 人工运维 —— 机械性重复运维,效率地下,错误频发 工具辅助 —— 无法批量操作,批量运行状态缺乏管理,难以定位错误 业务发展过快,缺少运维积累,缺乏运维规范 多人运维缺少权限控制,中心化日志,无法审计 运维权限过大,增加失误风险,运维变成“背锅侠” 运维演进的三个方向 第一阶段:纯手工运维。完全依赖手工的方式运维,有时在命令行里面的敲几行命令,有时用鼠标在几个不同的网页上操作,基本上都是靠“前辈”手把手指导,然后就自己上路了,刚开始操作时心中忐忑,生怕“碰坏了”系统。等到操作熟练以后,又容易掉以轻心,最好操作失误,触发故障。 第二阶段:逐步累积了一些运维脚本和一些小工具,帮助完成单一的运维任务。比起第一阶段,完成单一运维任务的效率提高了很多。但是在处理批量任务时,依然力不从心,无法很好地协同状态,协调各个任务之间的状态。脚本的编写往往不够严格,时常遇到错误,导致无法继续使用脚本和工具,需要退回到手工运维。 第三阶段:完整的自动化系统。比起第二阶段,工具和脚本被系统级的自动化软件所取代,自动化的系统提供完备的批量运行,状态监控,日志和身份认证等功能。此类系统可以完成预先设计的自动化功能,随着任务的需求越来越多,系统需要不断升级和维护。 —— 为了方便阿里云的用户,阿里特意打造了云上的自动化运维平台 —— 运维编排服务OOS。 阿里云运维编排服务 阿里云运维编排服务(Operation Orchestration Service,简称OOS)是一个全面的,免费的云上自动化运维平台,提供了运维任务的管理和执行。典型的使用场景包括:事件驱动运维,批量操作运维,定时运维任务,跨地域运维等,OOS特别为一些重要的运维场景提供了审批,通知等功能。通过使用OOS还可以达到标准化运维任务的目的,从而实践运维即代码(Operations as Code)的先进理念。OOS支持跨产品使用,您可以使用OOS管理ECS、RDS、SLB、VPC等云产品。 产品优势 可视化的执行过程和执行结果 通过提供可视化的执行过程,您可以看到完整的执行过程和执行结果,具体包括: 直观地看到各个任务的执行详情、参数和输出。 清晰地看到执行的流程、顺序和错误跳转。 透明地看到从开始到结束的完整执行过程。 免费的全托管自动化 提供全托管的自动化执行,即无服务器(Serverless)的自动化执行。执行过程无须消耗和使用您的计算资源(如ECS实例),即可满足创业型公司、中小型企业以及大型企业客户的自动化运维需求。完全的自动化模式下无需人工守护,让您更加专注于业务的高速增长。 高效的批量管理 传统场景下,执行批量任务相比执行单一任务的管理复杂度大幅增加,OOS可以帮助您提供实时的进度管理、运行状况统计和快速的错误定位,从而提高整体的运维效率。 完备的鉴权和审计 您可以继续使用熟悉的资源访问管理和用户权限管理系统(RAM)来管理OOS,无论是运维编排自身的操作,还是通过运维编排执行的对其他云产品的操作,均支持鉴权和审计。您无需担心操作的安全。 快速模板构建能力 OOS提供高易用性的模板构建能力,您无需从零开始构建。OOS提供了热门云产品的快速集成能力云产品动作,帮助您快速地构建模板,降低模板编写的难度,提高整体运维的效率。同时,OOS为常见的运维场景提供了公共模板,您可以选择一个类似的模板快速地复制和修改,以便满足您独特的运维需求。 跨地域、多地域的运维能力 因为业务的需要您可能使用了多个地域的资源,普通的运维操作只能在一个地域内单独操作,而OOS同时提供了跨地域和多地域的运维能力。多地域运维时,可以利用OOS的任务循环,能够快速地覆盖多地域。跨地域运维时,只需要指定对应Action的RegionId即可。 标准化运维任务(Operations as Code) 将日常所需要的运维任务以模板的方式提供,并遵循代码(Code)的管理方式来管理模板。从创建到审核,再同步到生产账号中,后续的运维任务只从标准模板中选择运行,确保运维动作的安全,像源代码一样的规范,并以此完成运维即代码(Operations as Code)的最佳实践。 运维权限收敛(委托授权) 运维人员的权限管理非常地复杂,太大的权限意味着太高的风险,太小的权限又无法完成运维操作,如何可以让运维人员完成运维任务,同时又避免他进行非预期的操作。OOS提供了委托授权模式,具有高权限的管理人员编写OOS模板,并配置固定的role,此时即完成了委托授权。然后将执行此模板的权限开放给其他低权限的运维人员,即可完成运维任务,又避免了高权限的风险。 应用场景 OOS的常见应用场景有:事件驱动、批量操作、更新镜像、需要审批的运维场景、定时任务、跨地域、多地域的运维等应用场景,且您也可根据自身实际场景自定义诸多灵活多样的模版。 事件驱动 当一个事件发生时,触发一个运维动作。例如,当某ECS实例的CPU使用量达到了85%时,为了防止业务中断,自动重启。事件驱动场景可以提供主动运维支持,免去中间的人为因素,提高运维效率。 批量操作 批量地执行运维命令,即需要针对多个目标(如ECS实例)进行常规操作,以确保业务的正常和平滑运行,并保持业务的健康状态。 例如,批量检查ECS实例中的硬盘剩余空间。首先选择需要检查的实例列表。(多种选择方式,如名字匹配、标签分组、资源组分组等),然后通过云助手命令执行硬盘检查,最终统一查看结果。 公共模板 名称 用途 ACS-ECS-StartInstancesByInstanceIds 根据实例ID列表开机 ACS-ECS-StartInstancesByTag 根据实例Tag开机 ACS-ECS-StopInstancesByInstanceIds 根据实例ID列表停机 ACS-ECS-StopInstancesByTag 根据实例Tag停机 ACS-ECS-RebootInstancesByInstanceIds 根据实例ID列表重启 ACS-ECS-RebootInstancesByTag 根据实例Tag重启 更新镜像 为了保证ECS实例的运行环境始终是安全的,包括安装最新补丁,或者更新所依赖的组件等,您可以使用OOS更新镜像,从一个源镜像开始逐步更新,最终生成一个新镜像,然后用于测试和生产。 公共模板 名称 用途 ACS-ECS-UpdateImage 更新镜像 需要审批的运维场景 在很多场景下都需要使用审批来确保操作是安全并符合预期的。通过在模板中增加审批动作(ACS::Approve)可以在运维动作实际执行前进行人工审批,以确保运维动作执行的必要性,避免浪费和误操作。 公共模板 名称 用途 ACS-ECS-BuyCostlyInstancesWithApproval 购买实例时需要先审批 ACS-ECS-DeleteInstancesWithApprovalByInstanceIds 删除实例时需要先审批 定时任务 定时执行所定义的运维动作。例如,在某测试场景中,需要清除某账号下因为测试所产生的对象存储OSS文件,则可以创建一个模板,每天凌晨运行,以确保测试环境是一个全新的环境,避免干扰下一次的测试结果。 公共模板 名称 用途 ACS-ECS-ScheduleToStartInstancesByTag 根据实例ID列表定时开机 ACS-ECS-ScheduleToStopInstancesByTag 根据实例ID列表定时停机 跨地域的运维场景 多地域部署已经成为了高可用(HA)架构的通用架构。随之而来的跨地域运维却变得越来越复杂,使用OOS可以帮助您解决跨地域的运维难题。您可以将不同地域的运维操作定义在一个模板内,即可实现跨地域的运维场景。 多地域的运维场景 当您在使用多个地域资源时,经常需要对它们进行同步操作,以便保持它们的一致性。例如,将对象存储(OSS)的多个地域的存储空间(Bucket)进行相同的操作——开启日志功能。 运维编排(OOS)和资源编排(ROS) 相同之处 OOS和ROS都是通过配置YAML或JSON文件的方式来定义模板的——即编排。编排的内容是资源,即ROS,编排的内容是运维动作,即OOS。 OOS和ROS的配置语法是相似的。 OOS和ROS都免费的,全托管的云产品,即本身不花钱,但通过OOS和ROS创建的资源是会按照各自的要求收费的。 OOS和ROS都是阿里云官方的云产品,提供了统一身份认证,安全审计等功能。对比第三方类似产品而言,阿里云提供的云产品将给您提供更加集成,更加一致的产品。 不同之处 ROS专注计划&部署场景,面向云资源的终态,在部署前需要定义好基础设施的形态,然后通过ROS声明出来,ROS负责帮你创建或更新基础设施资源(即云资源),并达到预期的终态。例如,部署一个网站通常需要部署10台ECS实例,1个SLB和1个RDS。那么需要在ROS声明,10台ECS实例,1个SLB和1个RDS。然后再通过创建ROS Stack的方式来实际创建这些资源,并最终创建完成,最终会有10台ECS实例,1个SLB和1个RDS。 OOS专注动作&运维场景,面向运维过程,完成一次任务,只强调本次任务完成的结果。假设有这样的运维场景,有一个已经运行的网站,因为流量增加而需要增加2台ECS实例,于是我们可以创建一个“新增实例的操作手册”(OOS模板的形态),这个操作手册只关注于此次任务,创建实例,并且挂在SLB下面。OOS不关心最终这个SLB下面有多少台ECS实例,只关心此次增加2台实例的运维任务完成。 OOS和ROS在DevOps中的位置 到了该介绍文章开头的图片了,在DevOps的体系中,包括从计划,编码,构建,持续测试,发布,部署,运维和监控的全过程。其中的部署部分又可以分为:环境部署(即基础设施)和应用部署两部分。ROS专注其中的环境部署,常见的环境部署包括这些ECS,VPC,SLB,RDS等。而OOS专注其中的运维,运维不同于部署,部署有相对清晰的概念和范围,而运维的概念相对模糊,范围也更大。运维也包括了非DevOps中的运维,甚至包括了日常的IT运维。OOS支持的运维以云上云产品和其资源为主,同时包括了ECS实例及其内部GuestOS。通过云助手的OpenAPI进行GuestOS的内部运维,如查看磁盘,安装卸载agent,修改配置文件等。 欢迎使用OOS OOS管理控制台的链接如果您遇到链接打不开的问题,请复制此链接到您的浏览器导航栏然后打开:https://home.console.aliyun.com/redirect.htm?productId=ecs&path=automation/region/ OOS帮助文档的链接OOS客户支持钉钉群:23330931 系列文章 最佳实践 玩转运维编排服务的权限:Assume Role+Pass Role 场景系列 运维编排场景系列----更新ECS镜像运维编排场景系列-----给ECS实例自动打TAG运维编排场景系列----从实例中拷贝文件到OSS运维编排场景系列----给实例加到SLS机器组运维编排场景系列----检测MFA功能状态阿里云运维编排新功能:一键批量克隆ECS
阿里云ECS在已有的系统事件的基础上,通过云监控新发布了状态变化类事件和抢占型实例的中断通知事件。利用这些新发布的事件,客户可以将ECS的完整生命周期实时的同步到自己的日志里或者数据库里,满足查询和审计的需要,或者直接触发函数计算进行一些自动化的运维操作。 关于ECS系统事件,请参阅文章让运维更高效:关于ECS系统事件 ECS实例状态变化事件 每当ECS实例的状态发生变化的时候,都会触发一条ECS实例状态变化事件。这种变化包括用户在控制台/OpenAPI/SDK操作导致的变化,也包括弹性伸缩或欠费等原因而自动触发的,还包括因为系统异常而触发的变化。 比如,当一个停止中的ECS实例被启动的时候,会触发一个“启动中”的事件。事件的格式遵循已有的云监控系统事件的格式,事件头会包含时间和唯一ID等信息,事件的完整格式如下: { "status": "Normal", "ver": "1.0", "content": { "resourceId": "i-xxxxxxxxxx", "state": "Starting", "resourceType": "ALIYUN::ECS::Instance" }, "id": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx", "product": "ECS", "groupId": [ ], "resourceId": "acs:ecs:cn-xxxx:xxxxxxx:instance/i-xxxxxxxxxx", "level": "INFO", "instanceName": "", "name": "Instance:StateChange", "userId": "xxxxxxx", "eventTime": "20190130T112734.114+0800", "regionId": "cn-xxxx" } ECS实例状态变化通知事件支持以下六种状态,详见链接。 状态名 控制台显示状态 Pending 无(实例创建后,在进入运行中之前的状态) Starting 启动中 Running 运行中 Stopping 停止中 Stopped 已停止/已过期/即将过期/已锁定/欠费回收中/等待释放 Deleted 无(实例已经被删除) 抢占式实例中断通知 抢占式实例因为资源供需关系发生变化等原因,存在被自动释放的可能。在释放前5分钟左右,会触发抢占式实例中断通知,您可以在收到该事件的时候为抢占式实例的释放提前做准备。 抢占式实例中断通知的事件格式与状态变化事件格式除了name和content字段外,其他格式相同。 { "product": "ECS", "resourceId": "acs:ecs:cn-shanghai:xxxxxxx:instance/i-abcdef", "level": "WARN", "instanceName": "instanceName", "regionId": "cn-hangzhou", "name": "Instance:PreemptibleInstanceInterruption", "content": { "instanceId": "i-abcdef", "action": "delete" }, "status": "Normal", "eventTime": "20190130T112768.222+0800" } 导致抢占式实例进入待回收状态的原因,包括市场价格高于您的出价或者资源供需关系发生变化等,详见链接。 云监控控制台使用新增事件 登陆云监控控制台,进入『事件监控』->『报警规则』->『系统事件』tab,点击『创建事件报警』按钮。 在创建/修改事件报警的对话框里,按以下内容配置事件筛选规则: 事件类型选择『系统事件』 产品类型选择『云服务器ECS』 二级事件类型选择“Status Notification”。 事件等级选择『全部级别』 事件名称选择“实例状态改变通知”或者“抢占式实例中断通知”,可以多选。 在报警方式里面,你可以配置短信/邮件/钉钉通知,或者将该类事件转发给消息队列,函数计算,或者回调某个URL。 新增事件的使用场景 Event的真正价值,在于用Event Driven的方式去触发自动化的业务逻辑,从而解放人力,甚至有可能基于Event诞生新的云产品。在此,我们给出三个典型的自动化场景。 场景1: Auto-Start ECS 如果你的ECS是需要一直保持开机状态来提供某种服务的,那么不论任何原因的关机都是一种异常。您可以考虑消费ECS的状态改变通知,当收到stopped的通知的时候,自动对ECS执行一个启动的命令。 场景2: ECS创建完成后的初始化 比如,当ECS创建完成后,你可能需要在ECS上自动创建用户账户或者执行某个脚本。您可以考虑消费ECS的状态改变通知,当收到第一次running事件后,通过云助手执行一个脚本。 场景3: ECS抢占式实例释放前自动从SLB后端服务器中移出 如果您的SLB负载均衡服务器后配置了多台抢占式实例作为后端服务器,又不想因为抢占式实例的突然释放而影响业务。那么,您可以考虑接收ECS的抢占式实例的中断通知。在抢占式实例被释放前5分钟左右,您将收到抢占式实例中断通知,此时您可以将该抢占式实例后端服务器从SLB中移出,并创建一个新的抢占式实例作为后端服务器加入SLB。 更详细的最佳实践文档以及示例代码,请参阅ECS状态变化事件的自动化运维最佳实践
2022年07月
2020年03月
2020年02月
2019年12月
2019年10月
2019年09月
2019年08月
2019年07月