欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

云计算】从Serverless谈边缘计算的未来;从物理机到Kubernetes的那些坑与启示

最编程 2024-06-30 15:14:04
...

本文根据谭霖老师在〖2017 GdevOps全球敏捷运维峰会北京站〗现场演讲内容整理而成。



讲师介绍

谭霖滴滴出行弹性云架构师、云计算专家,曾任职于英特尔从事云计算方向研究。OpenStack Ironic 项目核心开发者,《OpenStack设计与实现》作者,多次在OpenStack Summit SRECon峰会上分享Topic。目前从事基于Kubernetes的私有云平台的研发,专注提高服务的稳定性和研发、运维效率。


今天我将带来一些关于滴滴弹性云的分享,标题是从物理机到Kubernetes的那些坑与心得。


先简单自我介绍下,我叫谭霖,之前曾在Intel从事于Open Stack相关的工作,也花了很大精力在开源社区这一方面,后来我来到滴滴的弹性云团队,主要从事基于Kubernetes的基础平台建设,可以说是从一个做菜的“厨师”变成了一个“食客”。


主题简介:

1. 整体架构

2. 产品功能

3. 方案细节

4. 心得展望



前言


在我们准备做弹性云时,我们问了自己三个问题:

1. 为什么要做私有云

2. 为什么选容器

3. 为什么选Kubernetes


为什么要做私有云


这个其实是最好回答的。因为滴滴的集群规模太大,有数万台物理机(这样的规模量要求我们做一个私有云平台),结果因为之前没有一个比较好的方案,造成了资源使用率特别低、资源浪费大的问题。


另一个主要原因是滴滴的发展太快,总有新的业务,隔一段时间就听说成立了一个新的部门,而且随着新需求的出现,更新迭代异常频繁,这些都对平台的稳定性提出了特别高的要求。这个问题靠堆人是解决不了的,所以需要有一个好的平台和机制来解决它。


为什么选容器


这个问题也比较好回答。KVM / Xen这样的传统虚拟化已经出现多年了,很稳定,但大家也知道其弊端,就是损耗比较大。另外,传统混部也就是滴滴现在在用的方案(即继续保持原有的传统混部),虽然能够部分解决资源使用率低的问题,但因为完全没有隔离,导致程序之间容易互相影响。


而容器是一个相对折中的方案,具有一定的隔离性、损耗更少,这是我们选择它的最主要原因。同时,更重要的是容器的镜像所带来新的玩法,因为镜像的环境是一致的,对运维人员特别友好,因此他们不用再关心那些纷繁复杂的配置文件,也不用频繁地走初始化流程,更不用每次上线更新都提心吊胆,担心会对新的服务造成影响。


为什么要选择Kubernetes


现在这个问题就比较容易回答,但一年前是个比较艰难的选择。大家都知道现在比较著名的容器平台有Mesos、Kubernetes 和Swarm,一年前我们在Mesos和Kubernetes之间犹豫过很久,后来主要觉得因为我们要做的是一个基于容器的平台,相比Mesos,Kubernetes更专注容器。


而Swarm当时还很年轻,很多功能不够完善,相较之下Kubernetes更成熟。当然更关键的原因是Kubernetes的社区更有活力,设计架构也更清晰,可拓展性也高。


现在回过头来看一年前的选择,非常很庆幸我们做了正确的选择,因为之前相较于两者,Kubernetes还只是旗鼓相当,而现在则有一统*的趋势。我们目前还是基于Kubernetes1.6版本做的改造,接下来1.8版本release之后,我们会尽量跟上保持和社区同步。



一、整体架构


项目介绍


滴滴弹性云的目标就是基于容器技术,为滴滴提供稳定高效、可伸缩的服务管理平台。先简单看看弹性云的项目历程。


2016年7月,弹性云项目正式启动,然后10月份出了第一版,2017年4月,发布了第二版。在几个月的使用体验中,我们根据用户的反馈,不管是产品形式还是底层网络方案都经过大规模优化。目前第三版也正在开发中,这一版会更侧重用户交互和可视化上。


截止到目前为止,我们总共有300多台宿主机,2000+的容器实例,不算很多,但目前有多条滴滴核心业务线跑在我们的平台上,预见2018年规模会有指数型的上升。


整体目标


我们的整体目标有四点,主要是为了解决先前提出的三个问题,如下:


  • 实现资源按需分配,提高资源利用率;

  • 实现资源的弹性伸缩,可以快速响应负载变化;

  • 基础环境保持一致,实现服务的快速交付;

  • 保证服务的容错性,实现基础设施免运维。


解决方案


针对不同的产品线和需求,我们具体落地的产品解决方案主要分为两大块:一个是基于容器构建的轻量级虚拟机,叫做静态容器组;第二个是更纯粹的微服务类容器,我们称之为弹性伸缩组。同时我们还整合了滴滴现有的部署监控和日志收集系统。



这是整体的架构图,中间最大的一块就是我们的K8S集群,它主要分成控制节点和工作节点两部分。上面一块是我们的控制台和管理员入口,左边是滴滴的一些现有的权限认证系统和服务树,右边是我们的网络方案。



所以按照流程我们主要做的操作有用户先通过权限系统认证后,创建服务(也就是K8S的实例),实现容器的扩容缩容和部署更新。之后我们平台就会进行实时监控和日志收集,完成监控数据的上报和镜像拉取。



刚才说的主要是管理员相关的工作流程,现在看看用户流量。首先我们这边实现了每个容器通过IPAM组件,都能获取一个独立的IP,这个IP可以和物理机双向互通,所以允许用户的流量可以直接通过容器IP访问实例。同时我们也提供了一个4层的LB,允许用户可以通过只访问一个VIP,自动把流量打到后面的容器里。



二、产品功能


接下来详细讲讲滴滴弹性云具体的产品功能。


功能类型


正如之前所说,我们主要提供静态容器和动态伸缩两大产品,同时伸缩组方面又细分为有状态和无状态伸缩组。


其实在刚开始时,我们只想提供K8S支持得最好的Deployment,也就是无状态伸缩,这也是最符合容器使用习惯的产品形式。但在实际落地的过程中,我们发现完全不是那么一回事。


首先,不是所有程序都能比较轻易地改造成Cloud-Native的服务,所以针对这样的传统服务,我们还是需要提供一个比较贴近物理机的用户体验的产品,它的问题就是不能弹性伸缩,但好处是可以挂载本地存储,IP是恒定的。


同时为了支持有状态的服务,我们也提高了有状态伸缩组。既支持弹性伸缩又支持挂载网络存储。不过比较出人意料的是,用户选择有状态伸缩组的很大一部分原因并不是因为挂载Ceph,而是因为有状态伸缩组的容器IP/HostName是不变的,这样不管是从监控和日志上,都是更友好的。


而无状态伸缩我们这个当初最想推动的服务,也就只有在一些对弹性伸缩速度有特别高的要求的场景下才会用到。


功能特性


具体到产品功能的特性上,我们主要有三大块:复杂配置简单化、上线流程标准化和服务管理。


1.复杂配置简单化


了解过K8S的朋友们都清楚,它上手很难,有特别多的配置,有时候反而给用户带来了困扰。所以我们做了减法,简化了很多配置,只留给用户一些接口,避免不必要的困扰。比如我们支持多种接入方式,既可以一键完成从Git代码仓库到上线镜像的转换过程,也支持直接通过自定义镜像。


同时我们也对镜像做了分层(基础镜像→环境镜像→服务镜像),实现RD和SRE每个角色负责不同的镜像制作,这样分工更合理、层次更清晰,做到比较好的权责分明、高效有序。监控日志自动配置关联也是做了减法,希望用户较少关注这一点,从而得到更好的体验。


2.上线流程标准化


相对于减法来说,我们也做了很多的加法,因为我们是一个严肃的运维平台,之所以强调严肃,是因为只要有人参与的地方就容易犯错。一方面我们要尽量减少人工参与的地方,另一方面又要尽量通过各种规范来减少人犯错的机会。


比如变更审批系统,每一次上线变更都需要开发leader的审核;同时也对它进行了改造,使其每次分组小流量灰度;每次发布更新的过程中都有强制的观察时间,如果在观察过程中,比如说你发布了第二组后,发现你的更新过程中代码出了BUG,我们还支持了一键回滚。


3.服务管理


在服务管理方面,我们实现了服务不可用自动重启、一键扩容和负载均衡等,最为重要的就是对用户强制异地多活,必须在我们的两个机房都有实例。



三、方案细节


上一篇: 基于 Java 的网吧计费管理系统的设计和开业报告的实施

下一篇: 代码