关于容器迁移、运维、查错与监控,你想知道的都在这里了
作者 |邱戈川(了哥)阿里云智能云原生应用平台部高级技术专家本文根据云栖大会全面上云专场演讲内容整理,关注阿里巴巴云原生公众号,回复“迁移”获得本文 PPT今天上午王坚博士讲了一句话我比较有感触,大家做系统的时候,一定要想下你的系统的数据是怎么流转,这些系统的数据是怎么形成闭环。我们在设计阿里云的 K8s 容器服务 ACK 的时候也是融入了这些思考。容器迁云解决方案一览首先是和大...
作者 | 邱戈川(了哥) 阿里云智能云原生应用平台部高级技术专家
本文根据云栖大会全面上云专场演讲内容整理,关注阿里巴巴云原生公众号,回复“迁移”获得本文 PPT
今天上午王坚博士讲了一句话我比较有感触,大家做系统的时候,一定要想下你的系统的数据是怎么流转,这些系统的数据是怎么形成闭环。我们在设计阿里云的 K8s 容器服务 ACK 的时候也是融入了这些思考。
容器迁云解决方案一览
首先是和大家先看一下整个容器上云的解决方案。首先因为你已经做过容器,所以当你容器上云的时候,实际上这个事情是非常简单的,我们只需要提供的相应的工具,帮助大家把容器镜像迁入阿里云同时通过工具把 K8s 的配置迁到阿里云,以及可以用 DTS 工具把数据库迁入到阿里云。这样我们就可以完成一个完整的容器化上云的过程。
所以这个过程其实非常简单,但是上完云之后,不是说我们的 K8s 原来怎么玩现在还是怎么玩。我们希望大家从上云的过程中有些收益,所以我们希望提供一些更高效敏捷的一些方式给到大家,包括怎么去做 DevOps,包括我们怎么去做安全的软件供应链,以及我们做灰度发布。
同时我们希望成本更优一点,关键是大家上完云之后的成本怎么去核算,以及怎么去节约。所以容器上云后我们怎么去做更好的弹性伸缩、做自动化的运维,这个是大家需要在上云的过程中去考虑的问题。同时我们需要更好的管理我们的系统,一定要做到更好的高可用,而且要做到一个全局的管理。包括现在很多的公司已经在做混合云管理,这个也是大家在上云的过程中需要考虑的问题。
阿里云的 K8s 容器服务 ACK 到底长什么样,给大家一个概览图:
中间的 K8s 部分就跟大家去玩开源自建是一个道理,这个 K8s 没有什么本质上的区别。但是上了阿里云之后,我们希望给到大家的是一个完整的体系,而不是单单一个 K8s。所以我们会把底下的部分跟我们的 GPU 服务器、跟我们弹性计算 ECS、跟我们的网络 VPC、跟我们的 SLB 打通。这个在上完阿里云 ACK 之后,我们一键的方式把它全部集成好,所以大家不用再去关心阿里云的 IaaS 层应该怎么去做,我们希望给大家屏蔽掉这一层复杂性。
存储也是一样的道理。存储的话,就是所有的阿里云的存储我们全部都已经支持完了,但是现在我们还在做什么事情?我们在把阿里云的日志服务、阿里云的中间件服务,包括我们 APM 的 ARMS、我们云监控、以及我们高可用服务 Ahas 等全部对接在一起,让大家有一个更高可用的环境,以及一个更安全的环境。
我们给到大家一个 K8s 还是个原生态的 K8s,大家可能会问我们你的 K8s 跟我自己的 K8s 到底有什么区别,所以还是很简单的回答大家这个问题。首先我们在上云的过程中给到大家永远是一个非云厂商锁定的 K8s。就是你在线下怎么玩 K8s,在线上也可以怎么玩 K8s。如果你哪天你想下云的时候,你一样是可以下去的,所以这是我们很坚持的一个宗旨,就是我们不做任何的锁定。
是我们会注重什么事情?
- 首先我们会去考虑怎么做好安全,就是当你的 K8s 有问题时,我们怎么做快速响应,做 CVE 快速修复,然后我们怎么去打补丁,我们怎么做安全加固;
- 第二就是我们跟阿里云的整个生态做结合。因为阿里云是我们更熟悉,所以我们跟阿里云的底层技术设施怎么打通,这个事情我们自己会做得更好一点。
我们现在也跟神龙服务器在一起,我们知道怎么让神龙服务器发挥更好的性能。同时我们还有很多创新,这样可以帮助大家更好的做好弹性。最重要的一点实际上是:我们做了那么久,已经积累了超过几千家的在线客户,这也是我们最大的优势。所以我们从几千家的客户里面浓缩回来大家所需要的最佳实践,我们收集完、整理完之后要返回给大家,帮助大家去用 K8s 上生产,这也是我们给客户最大的一个核心价值。
容器上云之“攻”
上完云之后,怎么用好 K8s?怎么提升你的整个管理能力、提升你的系统效率?这个是我们要讲的“进攻”的部分。我们主要分三个方面去讲:
- 第一个,怎么跟我们阿里云的裸金属服务器做结合;
- 第二个,我们会提供性能比较优化好的网络插件 Terway;
- 第三个,怎么做好灵活的弹性。
物理裸金属服务器神龙
神龙裸金属服务器已经跟我们的容器平台 ACK 做了无缝融合。它最大的好处是什么?在容器化的时代,我们不需要再去考虑虚拟化的问题。所以两者的融合基本上是一个零虚拟化的开销的方案,容器直接使用到物理上的资源。在我们的神龙服务器里面,给到大家的实际上是个真实的 Memory 以及真实的 CPU,但它因为使用了阿里云专有的 MoC 卡技术,所以它可以直接对接到阿里云的云盘、对接到阿里云的 VPC 网络。这样的话它的体验跟所有的 ECS 是一个道理。
这样容器化去做资源切割的时候,我们就不会再受虚拟化的影响。同时,它带来了另外一个好处就是它有一个 offload 的技术。这样网卡的中断会下沉到下面的这张卡上去,当你的流量比较大的时候,它将处理所有的网卡中断的开销,并不开销你本身的 CPU,所以我们可以得到一个更极致的计算性能。
同时因为它的密度比较高,它基本上是个 96 核的机器,当它加入容器集群之后,这个集群的容器的密度相对来说会比较高,所以它成本节约会比较好一点。另外,它是整个阿里云弹性计算资源里面最高规格的网络带宽,单独给 30G 的网络带宽带给到 VPC,同时有 20G 的网络带宽留给云盘。这样大家可以比较好的去部署高密度的容器,同时它还是可以支持跟 ECS 是混搭组建集群的。这个特点在弹性场景里面特别高效。你日常的流量可以用到神龙服务器去构建,当你要去做动态伸缩的时候,你可以用 ECS。这样两种弹性资源一起使用会帮助大家把成本做到最优。
性能优化网络 Terway
另外一个方面,就是网络支持的情况了。网络的话是由阿里云独创的 Terway 网卡的多 IP 方式。实际上我们利用了阿里云里面的 ENI 的弹性网卡来构建我们的容器的网络,这样的话我们可以用一个 ENI 来支持 10 个 IP,来构建我们的 POD 网络。它最大的好处就是它不会再受 VPC 路由表大小的约束。POD 跟你的 ECS 或者神龙服务器在同一个网络平面,所以它的网络中转开销是非常小的。
同时我们还支持了 Network Policy,就是 K8s 里面标准的 Network Policy,以及我们扩展了带宽限流。这样的话也是避免大家不知道怎么去做网络内部的 POD 跟 POD 之间的安全管控,以及去做 POD 之间的网卡的带宽的约束,避免一个 POD 可以打爆整个网卡,这样的话就会比较好的去保护你的网络。而这个只需要添加 annotation 就可以完成,不影响 K8s 的兼容性。
灵活弹性
最后一个就是我们要去做灵活的弹性。做 K8s 有个说法:你不做弹性基本上就相当于没玩 K8s。所以,我们给大家提供了一个完整弹性的体系,除了标准的 HPA 去做伸缩 POS 之外,我们实际上还提供了阿里云开源的 CronHPA,就是定时的方式来支持大家去伸缩 POD。我们还提供了额外的指标,来帮助大家按指标的方式来去做弹性伸缩。包括我们日服务 SLS 里面提供的 Ingress Dashboard,拿到你的 QPS 以及 Latency,或者从我们的 Arms、Ahas 拿到你的每一个 POD 流量的情况,每个 POD 延迟的情况来做对应的伸缩。
因为大家知道你的程序可能开发出来之后,不一定能那么好的完美地去适配 CPU。也就是说不是你所有的 POD 都能够按照 CPU 的方式来做伸缩,这个时候你就需要根据我们提供的额外指标的方式来做伸缩,这是公有云里面给大家一个比较好的弹性的方式。
另外一个问题就是,当你的资源不够的时候,你可能就需要买更多的机器来支持容量,这个时候我们提供了 Autoscaler,它会对接阿里云的 ESS 来帮助大家自动化的方式来够买机器,然后再重新扩容。通过这种方式,来帮助大家做好自动化的运维。
但是这里也有一个问题,你可能希望这个伸缩速度会更快。但是从购买台机器到冷启动再到加入 K8s 集群,然后再去扩容器这个时间会比较长,如果你的业务是一个突发业务的话,可能你等不及机器伸缩。为了适配这个场景,我们现在又融合了阿里云的 ECI,利用弹性容器实例来做这个事情,我们做了一个虚拟化的 Kubelet,来对接 ECI。这个时候大家不需要再去买机器,你可以直接用扩容的方式去做就好了。
所以它最大的好处是什么?就是说你不需要额外买机器,你只需要根据你的业务的情况下,直接伸缩容器,它会到 ECI 的池子里面去找到对应的空闲容器,然后挂到你的集群里面去。当你不需要的时候,它更快,它直接就可以释放掉了。因为大家知道,如果你是普通的方式,你还要等那台机器所有的容器全释放才可以释放机器,这时还有一个时间差。
大家知道,弹性好最耗钱的地方就是时间。所以我们用最快的方式来帮大家去节约掉这个成本。同时大家如果用这样的方式,还可以不去做容量规划,因为很多时候很难去做容量规划。如果今天有 100QPS,明天又有 1000个QPS,我不知道这个容量怎么做,这个时候利用 ECI 的技术,大家就可以避免这个容量规划了。
当然我前面提到,阿里云 ACK 制定了很多自定义的指标,所以大家只需要去配置对应的定制指标,根据 QPS 也好,平均 Latency 也好,还是 P99、P999 这些相应的最大延迟指标,以及你的入口流量的指标,来做相应的伸缩。所以大家只需要根据这些指标来配置对应的 HPA 的扩容伸缩就可以了。这样的话,大家比较容易去找到适配你业务场景的方式。特别是对于电商场景来讲,如果大家比较有经验的话,大家很多时候根据 QPS 去做是比较合理的。
另外,伸缩不是做某一个业务/应用的伸缩。大家一定要记住一点就是:伸缩一定是一个一体化的联动性的伸缩,所以大家一定要从接入层到服务层同时考虑伸缩性。我们利用了 Ingress Dashboard 的指标(后面监控会提到),拿到了 QPS,可以伸缩我们的接入层,同时我们可以根据 APM 的系统,就是像阿里云的 ARMS 这样一个系统,拿到对应的 Latency 来伸缩我们服务层。这样的话,大家可以构造一个联动性的全局性的伸缩。不然很可能你在入口层面上做了一次伸缩,直接把流量倒了进来,最后打爆了你的服务层。
大家一定要考虑这一点,就是所有的伸缩一定是联动性、全局性的。
容器上云之“守”
前面讲了,我们怎么去更好地去做管理?以及我们有什么好的方式来提高我们的性能?第三部分的话给大家讲一下怎么去做防守,主要有三部分:
- 怎么做智能化运维;
- 怎么做安全体系;
- 怎么去做监控体系。
智能化运维
从管理角度来讲的话,大家不可或缺的点就是一定要去做灰度。从接触的情况来看,很多同学实际上并没有完全做到全灰度才上线。但在阿里云这个是强制要求,在 K8s 里面有方便的方式,大家可以用 Ingress 的方式来做灰度。其实比较简单,就是大家原来有一个旧的服务,那重新启动一个新的服务,都挂同一个 Ingress 上。那你在 Ingress 上面配置流量分割。可以是 90% 的流量割了旧服务,10% 的流量给到新的服务,这样的话,Ingress 会帮你做一个分流,这是比较简单的一个方式。
但是这里面还有个问题:大家怎么知道什么时候能不能把 90% 的流量再切割10%流量过去新服务,让 10% 变成 20%?这个是大家目前比较痛苦的一个地方。因为很多时候发现很多同学,他们最常见的方式是什么?就是找了一个测试同学过来,帮我测一下新的服务到底 OK 不 OK,如果 OK 它就直接将 90% 的流量下降到 80%,将 10% 的流量涨到 20%,但当它涨上去的时候你的系统立马出问题。
因为什么?因为你没有很好的依据去做这个流量的切割,你只是去看测试结果,只是看了当时那一刻到底对还是不对,而不是全局性的来看。所以在阿里云的 K8s 里面,我们会帮助大家集成好对应的灰度监控,然后帮助大家去做好可依据的灰度。我们会同时帮助大家去对比新的服务、旧的服务、当前的流量、平均的延迟、错误率、成功率、最大的延迟等等。通过这些去看新服务到底是不是已经满足你的真实的要求,以这个对比的依据来看,你流量的是否应该再继续切割。
就像刚才这例子一样,新服务 10% 要变成 20%,很可能你的延迟已经在增大、你的错误率已经在升高,这个时候你并不应该再去增加流量,而是要做回滚。大家一定要记住一点,就是我们在运维的过程中,一定要做到运维所有的动作一定要有依据。所以我们利用 Ingress Dashboard 给大家去做相关有依据的灰度。
另外是给大家做好对应的主机上在容器层面上的对应的监测和预警。在开源体系里面有一个组件叫 NPD,然后我们阿里云又开一个事件告警器叫 Eventer。我们把这两个东西打成了一个 Helm 包,在应用目录里面提供给大家。大家可以做好相应的配置之后,当你发生 Docker 挂了、当你发现主机时间同步有问题,或者程序没开发好造成 FD 被打爆,这个时候我们会把相应的通知,通过钉钉的方式发给大家。
大家一定要记住在上完容器之后,你还在容器层面上的主机层的监控,跟你普通的非容器的主机监控是有区别的。所以大家接下来一定要想办法把容器层面的主机监控再重新补回去。
另外,我们还一直在深化去做一些智能化的运维。例如容器上云后还必须做一些相关优化的配置。大家知道,上云之后,K8s 应该用什么机器?用什么的 SLB?用什么网络?这些东西都需要做一个选优,根据你的业务场景去做选优,怎么去选呢?我们会做一些相关的优化的推荐,帮助大家去做一些相应的深度的监测,你到底有没有改过哪些配置,哪些配置被你改错了等等。
如果有一些错误的配置,智能运维会提醒你要去做一些纠错,减少大家后期发现错误的纠错高成本。这一块,我们还一直在深化中。
安全与信任
“防守”的第二件事情是要做安全。上云之后,大家会觉得就主机层面上的安全不一定够了。所以在容器管理层面上大家还需要去看看这个安全应该怎么做。安全的话,就是大家还是要记住一点就是安全一定要做全方位的安全,大家不要把安全认为是一个很小的事情,特别是很多公司是没有安全团队的,所以这个时候运维要承担好这个职责。
安全的话,我们主要是分三个方面来做安全。
- 第一就是“软性安全”,例如社区层面的合作,然后是阿里云安全团队来帮我们做相应的一些“加持”,同时我们也会给客户做一些定期的安全的赋能。
- 另外一块的话就是 IaaS 层的安全,我们会做一些 CVE 的修复。我们还有阿里云自己的 IaaS 加固,以及我们现在还有镜像漏洞扫描。阿里云的镜像仓库已经支持了镜像扫描,所以这里也提醒大家:每次上业务、上生产之前,务必做一次镜像扫描,所有的开源社区提供的镜像都可能有漏洞。所以怎么去做好这些漏洞的防护,大家一定要下好功夫。同时我们提供对应的磁盘的加密,这一块大家可以做好数据的加密。
- 在 K8s 运行层面的话,我们团队做的更多的是在 K8s 审计日志方向,我们过会儿讲一下。包括我们会有更严密的 K8s 的这种安全的配置,以及我们会去做容器运行时的实时安全监测。大家有兴趣的话,可以看看阿里云安全的产品,他们已经支持了安全运行态的这种实时检测。
同时我们还支持安全的管控,就是所有的安全配置我们都是双向认证。特别强调一点就是从管理层面上来讲的话,我们会做好对应的整个平台的安全管理,这里更多的是针对内控。大家知道,实际上真正能偷盗你数据那个人,最容易的那个人是你们公司运维里面最有权限的那个人。所以,这里面才是大家日常需要重点管控的一个地方。
我们把所有能够接触到 K8s 的入口,都做了一层安全审计。除了安全审计落日志的同时,我们还提供了很多预置的安全的审计项来帮助大家做预警。这里举一个例子,就是假如你的 K8s 有安全性的入侵、有人进入你的容器,我们会给大家落审期日志,包括到底是哪个用户用了什么命令进入了哪个容器。同时大家可以去配一个钉钉告警,一分钟内我们会把这个告警给告出来,这样大家就可以知道有人进入你的容器环境了。
这样确保整个 K8s 环境足够的安全。原则上是这样的,就是大家去用 K8s 的时候,在生产系统里面不应该在有人能够进入容器,所以一定要提醒大家做一点防范。
另外一点大家比较难做的地方就是人员的变动。人员变动之后,他这个人对系统在之前的时间内做过什么事情,大家有没有清楚?所以,同样的道理,我们会提供人员审计视图,根据人员子账户进行搜索审计的信息。这样的话,大家对内的安全管控是比较容易去做的,你只需要输入他使用的子账户名字,我们会帮助你把他所有 K8s 的操作都列出来。这样就避免有人偷你的数据到外面去了,而不是两三个月后你还不知道。所以这个是帮助大家去做好人员离职的管控。安全层面上的话,大家务必要把审计日制这个事情看得比较重。
一体化监控体系全链路分析与定位
最后给大家讲一下,我们怎么去做整个监控体系,以及整个链路分析体系。整个监控体系的话,是非常的庞大。因为大家知道,很多同学在 IDC 里面自建 K8s 也好、还是在云上玩也好,只会去考虑 Prometheus 监控架构为主。但实际上,在上完阿里云之后,我们会帮助大家做好整个 K8s 的监控体系以及链路分析。
首先是我们从全局的角度来讲,会去给大家展示一下你整个 K8S 层面上,到底有多少个网络单元、有多少个 ECS、有多少个 SLB,然后你机器部署的情况什么样子。
(Demo 演示图)
我们底层会依赖于阿里云的云监控,以及刚才说的 NPD 的组件。中间这层还是标准的 Prometheus 架构。但是这里 Prometheus 架构非常耗费资源,所以我们会把它剥离出来作为一个托管的服务来提供,避免大家在集群规模越来越大的时候,Prometheus 会把资源重新吃回去。
顶层的话,我们会给大家提供对应的 ARMS 以及 SLS 的 Ingress Dashboard 的监控。
我们细看一下整个流程应该如上图所示,大家一定要把所有的监控体系,以及链路分析体系构建完整。包括你从前端进来,到 Ingress 入口,然后到中间的 Prometheus,再到应用层的监控 Arms,最后落到代码层面上的执行效率还是错误。大家一定要把这个链路链条构建出来,这样能够帮助大家在出现问题的时候,立马找到问题根源。在互联网体系里面,大家的每一次的问题,解决所带来的时间开销,就是你的成本。
前面刚才提到了,在应用层面的话,我们给大家预置了日志服务 SLS 提供的 Ingress Dashboard。因为大家知道,从 Ingress 是全局的流量入口,大家通常的做法是:都去构建一个庞大的 ELK 系统做监控,这个成本是相当高的。我们会帮助大家只需要落盘到我们的阿里云的 SLS 的服务,就会把全部 Ingress 监控指标构建出来,包括你当天的 PV/UV;包括你现在延迟的情况;包括你上一周以及昨天的同时间的一个 PV/UV 的对比;包括你流量的 TOP 的省份、TOP 的城市;包括你最后错误的以及最高延迟的地方,有 500 错误发生的地方在 URL 是什么。我们把这些东西全部给大家做成一个大的 Dashboard,这样大家可以以成本最低的方式来看你的整个系统的运行情况。同时这个 Dashboard 是支持扩展的,目前这个也是现在上阿里云 ACK 的时候,大家非常喜欢的一个东西。
如果我们要对服务体系做监控的话,可能大家要去考虑怎么接入 APM 系统了。这一部分,我们之前发现很多同学最痛苦的地方在于:很多业务开发的同学其实并不喜欢做接入。因为他去做接入的时候,你要给他一个 jar 包,然后他要在程序里去引入这个 jar 包,重新打镜像才能上线,这个是其中一个繁琐的环节。
另外一个环节就是大家其实最讨厌的地方就是当你的 APM 系统升级的时候,你要求所有的业务人员全部更新换 jar 包,要重新打包镜像、重新上线,业务开发人员就是非常恼火了。所以在容器时代的时候,我们做了一个比较简单以及优雅的方案:我们提供一个应对的 helm 包给大家,做好相应的部署之后,只需要做一个事情:你在发布容器的时候打上两个 Annotation 我们就自动做好 APM 系统(阿里云 Arms)接入了。当你要做升级的时候,只需要把那个应用重新做一次发布,它自动用最新的 jar 包把那个旧包给换掉了。
所以在运维阶段,大家就可以去决定要不要接入 APM 系统,而不需要开发的参与,甚至我们连开发包都不需要给到开发。大家也可以用同样思路,在接入外部系统的时候,思考怎么做到一个无侵入的一个方式。
刚才提到了,我们实际上是支持了 Prometheus 的托管。原来大家在 K8s 里面去做 Prometheus 的话,需要构建一堆的组件,而这些组件是非常耗费资源的。所以我们现在的做法就是提供一个 Helm 包给到大家。这样的话,大家只需要简单的一键安装,就可以用到阿里运托管的 Prometheus 服务。然后通过托管的 Grafana 方式去看相应的数据、去做相应的告警。这些都是在后台做了,跟你整个集群没有任何关系,这样你的集群资源是最节约的也是最稳定的。
“ 阿里巴巴云原生微信公众号(ID:Alicloudnative)关注微服务、Serverless、容器、Service Mesh等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术公众号。”
更多推荐
所有评论(0)