剑指Kubernetes 揭秘腾讯云的PaaS技术选型策略

欢迎你们前往 腾讯云 +社区,获取更多腾讯海量技术实践干货哦~
本文由 腾讯云容器技术团队 首发于腾讯云+社区

一、背景

Kubernetes 很火,一大批互联网公司早已领先一步,搭建起专有的 PaaS平台,传统企业们看到的 Kubernetes的趋势,亦不甘落后,在试水的道上一路狂奔……api

虽然,Kubernetes很火,并不表明能够“上手即用”,基于 Kubernetes的容器编排也不是简单的“拿来主义”。在容器圈,除了 Kubernetes,还存在着 Mesos、Swarm等分属不一样阵营的容器集群管理工具,以及基于这些工具的多个容器云提供商。安全

腾讯云在 2016年末决定开发容器产品,随后组建容器技术团队并进行技术选型,经过对不一样编排工具的分析对比,最终选择 Kubernetes 做为容器编排引擎,而且迅速在 2017 年初推出容器解决方案 CCS,为用户提供托管 Kubernetes 的一站式服务。服务器

随着业务量的增长,腾讯云容器团队基于 Kubernetes,不停的增长和完善容器监控、日志处理、容器 Registry 等关键特性,来保障用户业务的平稳运行。在整个 2017 年的运营过程当中,管理了数千个集群、数十万容器,以及业务高峰期的成倍扩容。网络

那么,在 16年末,Kubernetes并未大热时,腾讯云为什么恰恰在诸多主流的编排引擎当中选择 Kubernetes?腾讯云 Kubernetes架构和资源调度原理是什么样的?在用户托管服务中,又为什么采用 Kubernetes来托管用户 Kubernetes集群的 Master?做为国内最大基于 Kubernetes的容器服务提供商,腾讯云在 Kubernetes上还有哪些应用实践…… 本文将带着这些疑问,为你一一揭开腾讯云基于 Kubernetes的 PaaS平台神秘面纱。架构

二、为什么选用 Kubernetes?

容器技术无疑是近几年最热门的技术之一,不少公司或者行业已经把容器做为本身的测试环境以及正式环境,正式上跑一些业务。腾讯紧随外界技术发展的潮流,在三年以前,腾讯云的基础平台部门开始容器方面的技术实践,通过三年时间的积累,腾讯云目前已经有不少业务跑在容器平台上。app

在最开始的容器产品技术选型阶段,腾讯云也曾对比过 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 学习难度更高,腾讯云为此提供了免费容器实验室, 帮助开发者快速入门学习kubernetes,感性趣的读者能够点击【阅读原文】了解详情。

三、腾讯云目前有哪些容器解决方案?

腾讯云 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 服务打通。核心引擎开源到容器社区,组件库做为配套功能同时开源。

四、腾讯云是如何基于 K8S作容器集群的管理?

腾讯云容器服务应用编排

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+应用的模板文件。直接下载对应的应用模板就能够实现应用的部署。

应用

应用包括描述多个服务以及这些服务间的相互调用依赖关系 ,方便用户管理多个服务。应用能够理解为多个服务的组合,多个服务会统一进行展现,服务支持按照应用进行搜索。多个服务的配置项,统一的经过同一个配置进行管理。经过服务组的方式,管理多个服务。能够简化多个服务管理的复杂度。

应用中的服务支持单独编辑,部署和更新。同时服务支持差别化比较,方便用户查看两次修订之间的差别。在服务编辑时,自动提取出对应的变量,简化配置的过程。并支持服务回滚功能,支持服务回滚到上一个版本。

用 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

腾讯云 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 ,甚至是用户的定制版本。

五、如何用腾讯云容器解决方案部署微服务?

腾讯云 CCS解决方案介绍

微服务架构适用于构建复杂的应用,腾讯云 CCS容器解决方案将单体式应用从不一样纬度拆分红多个微服务,每一个微服务的内容使用一个 Docker 镜像管理。在功能不变的状况,应用拆分红了多个可管理的服务,使得每一个单体的服务更容易理解、开发和维护。

不一样的微服务也能够由不一样的团队来开发,开发团队可自由选择开发技术和程序语言等,每一个服务又可独立部署、独立扩展。例如 Web 应用程序能够分割成一组更简单的外部服务及多组内部服务。

小红书基于腾讯云的微服务改造实践

小红书是一家发展很是快速的公司,技术团队在急剧增长的同时技术栈也在不断变迁。之前小红书的研发团队采用的是纯 Python 的技术环境,随着业务的发展,不一样的团队在作 Java、Go、Node等不一样方向尝试 ,同时在每一年电商大促时,扩容在现有模式也很耗时耗力。为了为了支撑业务的发展, 小红书利用腾讯云的 CCS解决方案对业务系统进行微服务化改造。

在微服务改造的过程当中,小红书基于腾讯云容器服务搭配 Jenkins、GitLab、Prometheus 和 Spinnaker等开源组件,以最小的投入,最低的开发量快速的实现容器化微服务架构。

上图是小红书以前的应用上线的过程,开发向运维提需求,须要多少台服务器,运维依据需求去作初始化并交付给开发。如今小红书有一个运维平台,全部服务器的部署都是由这个平台来完成的,平台调用腾讯云 API 生成服务器,作环境初始化,配置监控和报警,交付给开发的是一个标准化好的服务器。

如上图,开发者拿到服务器准备线上发布时用 Jenkins 触发脚本的方式:用 Jenkins 的脚本作测试,执行代码推送。当须要新加一台服务器或者下线一台服务器,要去修改这个发布脚本。 发布流程大概为:Jenkins 脚本先往 beta 环境发,开发者在 beta 环境里作自测,自测环境没有问题就全量发。

通过架构的系列微服务改造实践,小红书的资源利用率提升了 100%, 计算资源减小将近 1倍,稳定支撑了双 11等大型促销活动。除了应用于微服务架构改造,CCS解决方案也可以根据业务运行状况,提供集群和服务两个层级的弹性伸缩能力,并为持续集成与持续交付提供的高效的 DevOps 环境。

六、将来规划

在 PaaS平台的将来规划上,腾讯云将会提供更多的容器基础解决方案,支持包括 Docker、OCI、Kata 等容器引擎和镜像格式。同时推出更多配套的 DevOps 服务,为用户提供完整的 PaaS + DevOps 开发部署环境。

据悉,腾讯云单容器实例解决方案 CIS计划在 5 月底发布公测,用户能够经过 CIS从容器 Image 当中快速建立容器实例。同时提供 DevOps 编排引擎的 Tencent Hub 的一部分已经上线,计划将在 5 月底正式发布公测,而在黑石上部署的 CCS 解决方案已上线。


问答
如何在已存在的Docker容器上运行命令?
相关阅读
Docker容器技术
容器时代的DevOps部署
打破神话:容器vs虚拟机


此文已由做者受权腾讯云+社区发布,原文连接:https://cloud.tencent.com/developer/article/1077383?fromSource=waitui

相关文章
相关标签/搜索