剑指Kubernetes 揭秘腾讯云的PaaS技术选型策略
1、前言
Kubernetes 很火,一大批互联网公司早已领先一步,搭建起专有的 PaaS平台,传统企业们看到的 Kubernetes的趋势,亦不甘落后,在试水的道上一路狂奔……
虽然,Kubernetes很火,并不代表可以“上手即用”,基于 Kubernetes的容器编排也不是简单的“拿来主义”。在容器圈,除了Kubernetes,还存在着 Mesos、Swarm等分属不同阵营的容器集群管理工具,以及基于这些工具的多个容器云提供商。
腾讯云在 2016年底决定开发容器产品,随后组建容器技术团队并进行技术选型,通过对不同编排工具的分析对比,最终选择 Kubernetes 作为容器编排引擎,并且迅速在 2017 年初推出容器解决方案 CCS,为用户提供托管 Kubernetes 的一站式服务。
随着业务量的增加,腾讯云容器团队基于 Kubernetes,不停的增加和完善容器监控、日志处理、容器 Registry 等关键特性,来保障用户业务的平稳运行。在整个 2017 年的运营过程中,管理了数千个集群、数十万容器,以及业务高峰期的成倍扩容。
2、为何选用 Kubernetes?
容器技术无疑是近几年最热门的技术之一,很多公司或者行业已经把容器作为自己的测试环境以及正式环境,正式上跑一些业务。腾讯紧随外界技术发展的潮流,在三年之前,腾讯云的基础平台部门开始容器方面的技术实践,经过三年时间的积累,腾讯云目前已经有很多业务跑在容器平台上。
在最开始的容器产品技术选型阶段,腾讯云也曾对比过 Kubernetes、Docker Swarm、 Mesos:
Kubernetes的核心是如何解决自动部署,扩展和管理容器化(containerized)应用程序。它支持资源调度、服务发现、服务编排、资源逻辑隔离、服务自愈、安全配置管理等。
Mesos是一个分布式内核,核心理念是数据中心操作系统(DCOS),为了解决 IaaS层的网络、计算和存储问题,所以 Mesos的核心是解决物理资源层的问题。它同时支持 Marathon、 Kubernetes 和 Swarm 等多种框架,Mesosphere 也是 Kubernetes 生态的一员。
Swarm:从 Docker1.12版本开始,Swarm随 Docker一起默认安装发布,也由于随 Docker引擎一起发布,无需额外安装,配置简单。它支持服务注册、服务发现,内置Overlay Network以及 Load Balancer。Swarm是与 Docker CLI非常类似的操作命令,对熟悉 Docker的人非常容易上手学习。
综上来看,每一种工具都有自己的核心理念。
但是,腾讯云最终选择了 Kubernetes, 现在看来这个选择无比正确。在技术选型上,除了编排引擎自身的核心特性,腾讯云也主要从以下几个方面进行了评估。
注:表格里的材料是当初选型时调研的情况,上述编排工具现在的特性已经有了新变化。
从整个行业来看,业界的技术架构正在大规模向微服务迁移,容器技术天生就是部署微服务的最佳方式,腾讯云拥有海量的业务架构,而 Kubernetes 的使用让部署大规模的微服务更加容易,这也是腾讯云选择Kubernetes的主要原因,另外腾讯云选择 Kubernetes还考虑了其它优势,如:
-
出身名门 Google,其开发和设计受到了 Google著名的 Borg系统的影响;
-
GitHub上关注Kubernetes项目和提交代码的开发者非常多,社区活跃,如果遇到问题,通过社区咨询和解决 问题速度也会比较快。
-
Kubernetes可以很好的支持有状态的服务。
Kubernetes 是近 3 年来社区热度最高的项目,Linux 基金会也成立了 CNCF来加强社区运作,不仅对 Kubernetes 进行管理,还对相关项目进行有序的运作,保证了整个技术栈稳定和蓬勃的发展。Kubernetes技术相比Docker swarm和Mesos 学习难度更高。
3、腾讯云目前有哪些容器解决方案?
腾讯云 PaaS平台发展至今已有了丰富的容器解决方案, 包括但不限于:腾讯云 Kubernetes托管服务、单容器实例服务、TencentHub服务、Flow Engine服务、CCI持续集成服务等,以及基于 Kuberentes 的 TensorFlow 和 Spark 解决方案,帮助用户在使用容器解决方案的同时进行数据计算和模型训练。
-
腾讯云 Kubernetes服务:基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务。腾讯云容器服务完全兼容原生 kubernetes API ,扩展了腾讯云的 CBS、CLB 等 kubernetes 插件,为容器化的应用提供高效部署、资源调度、服务发现和动态伸缩等一系列完整功能,解决用户开发、测试及运维过程的环境一致性问题,提高大规模容器集群管理的便捷性,帮助用户降低成本,提高效率。
-
单容器实例服务:基于 Clear Linux 技术提供的单容器实例解决方案,通过单容器实例服务享受容器的便捷、虚拟机级别的隔离, 像使用虚拟机一样如丝般顺滑的来使用容器,非常试用于通过容器来进行批量计算、通过容器来快速部署个人站点。不依赖 VM的容器在配置和使用时间上更灵活,提供了一种更低成本的计算资源。目前,但容器实例服务正在内测阶段。
-
TencentHub服务:在云原生应用盛行的今天,仅仅提供 Git 服务或 Container 镜像存储的 Hub 已经无法满足用户在日常开发和运维过程中的种种需求。构造支持多种文件格式、容器镜像格式、编排方案的云原生 Hub 能更好的降低用户的架构向云原生迁移。 TencentHub不仅仅提供一个私有镜像的存储,同时提供了 Helm包、二进制文件等文件存储。
-
DevOps 产品:DevOps 任务容器化、资源及执行全托管至 Kubernetes、提供给用户一个全生命周期的 Workflow,完成容器构建、测试和部署等 DevOps 流程,支持用户通过界面拖拽定义 Workflow ,支持 Workflow 定义文件导入等功能,和腾讯云已有基础服务和 DevOps 服务打通。核心引擎开源到容器社区,组件库作为配套功能同时开源。
4、腾讯云是如何基于 K8S做容器集群的管理?
1、腾讯云容器服务应用编排
Kubernetes原生的方案中,基于服务粒度对系统组件进行管理,支持服务注册发现和路由管理。对于一个服务提供多种不同的资源描述类型,比较常用的有 Deployment、Job、CronJob、Stateful、Daemonset。
腾讯云容器服务参考社区 Helm的实现形式,在容器服务中实现了完整的应用编排管理功能。腾讯云容器服务编排服务主要分为配置管理,应用模板管理,基于应用的服务组管理几个主要部分。
-
配置管理
配置管理是指将应用中常变的值以变量的形式替代,配置项支持多版本,方便用户进行更新和回滚应用。关于配置管理的实现,腾讯云支持三种实现方式:
-
Helm的模板文件支持变量渲染
-
Kubernetes的 ConfigMap中环境变量方式
-
Kubernetes的 ConfigMap通过 Volume方式进行数据填充
其主要作用包括:
-
通过提取出多个环境中不同的部分,支持同一套系统在多个环境中部署。
-
提取出服务中经常变更的部分,实现服务的灵活变更。并且通过配置文件的版本管理,可以很好的对变更进行追溯和回滚。
-
通过配置项,可以隐含的实现多个服务直接依赖关系的管理。例如:服务 A需要访问服务 B的,一般情况下依赖于服务 B的名称。这种情况下,将服务 B的名称提取成为一个配置项,而将配置项传递给服务 A。这样在不同环境中,服务 B名称的改变,服务 A能自动感知,不需要单独修改服务 A的参数。
-
应用模板
应用模板包括多个服务的定义加一个默认配置,通过应用模板 +配置项的组合,方便用户部署相同应用的不同环境。主要用于描述一个或多个服务的定义,服务的定义支持原生的 Yaml语法,但可以通过 GoTemplate的方式定义对应的变量。其主要作用为:
-
实现应用的快速克隆。由于应用的相关信息已经通过对应的 Template文件进行了描述,复制应用的过程只需要针对性的修改应用的配置,其他结构信息不需要进行改变。
-
应用的多环境部署。在多个环境中,实现应用的部署,也不需要关系每个服务具体的部署信息,只需要在不同环境下修改环境对应的配置,即可以通过应用模板实现在新环境应用的快速部署。
-
更高阶的功能,通过应用市场可以下载通用的模板,快速的部署应用。例如:在 Helm(Charts)的应用市场 https://kubeapps.com/,已经打包好了 100+应用的模板文件。直接下载对应的应用模板就可以实现应用的部署。
-
应用
应用包括描述多个服务以及这些服务间的相互调用依赖关系 ,方便用户管理多个服务。应用可以理解为多个服务的组合,多个服务会统一进行展示,服务支持按照应用进行搜索。多个服务的配置项,统一的通过同一个配置进行管理。通过服务组的方式,管理多个服务。可以简化多个服务管理的复杂度。
应用中的服务支持单独编辑,部署和更新。同时服务支持差异化比较,方便用户查看两次修订之间的差异。在服务编辑时,自动提取出对应的变量,简化配置的过程。并支持服务回滚功能,支持服务回滚到上一个版本。
2、用 K8S托管用户 K8S集群的 Master
与其他云服务商不同的是,腾讯云为用户管理 Master 节点,最重要的挑战是为了保证用户 Kubernetes 集群的高可用,将用户 Kubernetes 集群的 Master 节点的进程以容器方式运行,发挥 Kubernetes 的优势提供稳定保障。
在这个过程中,随着托管集群数量的增加,Kubernetes 的 Master 节点的负载也越来越高,腾讯云提供的 Kubernetes 托管服务面临巨大的稳定性挑战:
-
多集群共享 ETCD面临性能瓶颈、运维困难、可用性较难持续保障
-
大量小集群产生 master服务器成本增加,可用性、性能较难保障
-
用 agent管理节点,随集群增加安装包、证书、配置越发难以维护,更新回滚困难
-
提供给用户的监控与后台使用的监控是完全不同的两套,监控对象与环境不统一,维护困难
Kubernetes为高效运维而生,为什么运维起来却这么难?腾讯云为用户提供了高效的 Kubernetes服务,为什么自己做不到? 通过多次的技术方案碰撞,腾讯云最终选择用 Kubernetes来管理 Kubernetes的方案,让自己成为自己的第一个用户。
如上图,腾讯云将用户集群 Master 节点的组件全部使用容器的方式部署在一个 Kubernetes 集群里进行管理,最大限度的利用了容器的优势和 Kubernetes 本身的能力,通过这样的部署方案:
-
用户集群 Master不再独占云主机,解决成本问题
-
健康检查即可实现基本 HA,多副本可提供更高可用性
-
单个用户集群 Master相关数据放在同一个 namespace下
-
无需额外 db存储用户集群版本信息
-
升级时备份 namespace下数据即可快速回滚
-
无需开发、维护额外的 agent
3、腾讯云 Kubernetes高可用托管架构解析
用 K8S管理 K8S方案说起来简单,但将用户的所有 Master 节点的组件全部使用容器的方式部署在一个 Kubernetes 集群里,其实现过程也并不容易。具体到落地实践上,腾讯云是如何做的呢?下图为腾讯云的 Kubernetes高可用托管架构。
托管服务中将整个平台分为控制面和数据面两层。控制面节点中驻留的是用户 Kubernetes 集群的 Master 相关容器和腾讯云容器服务的服务管理服务节点;数据面的节点是客户运行业务的节点。
服务管理节点是由一组高可用的 Kubernetes Master 节点组成,同时包括一组高可用的 etcd 集群。服务管理节点外的其它机器都属于该 Kubernetes 的 Node 节点。当用户在腾讯云的控制台申请一个 Kubernetes 集群时,在这些 Node 节点上把 etcd/api-server/controller/scheduler 等 Kuberneter Master 必须组件以 Kubernetes Controller 的方式部署在集群内,并且通过 ingress 暴露到 VPC 。用户 Node 节点在初始化时指定要加入的 Kubernetes 集群。
采用以上架构方案,当用户集群负载升高的时候,可以快速启动更多的容器应对访问压力。同时无需开发额外的 agent 管理 Master 节点,减少管理环节有效的降低运维难度。腾讯云可以通过容器的滚动升级,快速为用户升级到最新的 Kubernetes 版本,享用最新的特性。可以方便的为客户部署多种版本的 Kubernetes ,甚至是用户的定制版本。
5、如何用腾讯云容器解决方案部署微服务?
1、腾讯云 CCS解决方案介绍
微服务架构适用于构建复杂的应用,腾讯云 CCS容器解决方案将单体式应用从不同纬度拆分成多个微服务,每个微服务的内容使用一个 Docker 镜像管理。在功能不变的情况,应用拆分成了多个可管理的服务,使得每个单体的服务更容易理解、开发和维护。
不同的微服务也可以由不同的团队来开发,开发团队可自由选择开发技术和程序语言等,每个服务又可独立部署、独立扩展。例如 Web 应用程序可以分割成一组更简单的外部服务及多组内部服务。
2、小红书基于腾讯云的微服务改造实践
小红书是一家发展非常快速的公司,技术团队在急剧增加的同时技术栈也在不断变迁。以前小红书的研发团队采用的是纯 Python 的技术环境,随着业务的发展,不同的团队在做 Java、Go、Node等不同方向尝试 ,同时在每年电商大促时,扩容在现有模式也很耗时耗力。为了为了支撑业务的发展,小红书利用腾讯云的 CCS解决方案对业务系统进行微服务化改造。
在微服务改造的过程中,小红书基于腾讯云容器服务搭配 Jenkins、GitLab、Prometheus 和Spinnaker等开源组件,以最小的投入,最低的开发量快速的实现容器化微服务架构。
上图是小红书之前的应用上线的过程,开发向运维提需求,需要多少台服务器,运维依据需求去做初始化并交付给开发。现在小红书有一个运维平台,所有服务器的部署都是由这个平台来完成的,平台调用腾讯云 API 生成服务器,做环境初始化,配置监控和报警,交付给开发的是一个标准化好的服务器。
如上图,开发者拿到服务器准备线上发布时用 Jenkins 触发脚本的方式:用 Jenkins 的脚本做测试,执行代码推送。当需要新加一台服务器或者下线一台服务器,要去修改这个发布脚本。 发布流程大概为:Jenkins 脚本先往 beta 环境发,开发者在 beta 环境里做自测,自测环境没有问题就全量发。
经过架构的系列微服务改造实践,小红书的资源利用率提高了 100%, 计算资源减少将近 1倍,稳定支撑了双 11等大型促销活动。除了应用于微服务架构改造,CCS解决方案也能够根据业务运行情况,提供集群和服务两个层级的弹性伸缩能力,并为持续集成与持续交付提供的高效的 DevOps 环境。
5、未来规划
在 PaaS平台的未来规划上,腾讯云将会提供更多的容器基础解决方案,支持包括 Docker、OCI、Kata 等容器引擎和镜像格式。同时推出更多配套的 DevOps 服务,为用户提供完整的 PaaS + DevOps 开发部署环境。
据悉,腾讯云单容器实例解决方案 CIS计划在 5 月底发布公测,用户可以通过 CIS从容器 Image 当中快速创建容器实例。同时提供 DevOps 编排引擎的 Tencent Hub 的一部分已经上线,计划将在 5 月底正式发布公测,而在黑石上部署的 CCS 解决方案也即将在 4 月初上线。