基于Kubernetes的容器云PaaS平台概要设计

GallacherThomas 发布于1月前

基于Kubernetes的容器云Paas平台应该是每个使用Kubernetes的公司必须要做的一件事,今天我们尝试以应用为中心,采用搭积木的方式完成一个最小版本的容器云Paas平台的设计。

基础功能

我们期望是实现一个尽可能自助的服务,所以里面先不考虑一些诸如审批之类的操作,在此部分我们要完成应用从打包到上线的关键流程。

镜像打包

研发编写好代码,此时就要进行代码的生产环境部署,而部署的最小单元通常就是Docker镜像,那么我们就要实现一个自助的镜像打包服务,来实现从源代码到Docker镜像的交付。

基于Kubernetes的容器云PaaS平台概要设计

研发将代码提交到GIt代码仓库后,可以让代码仓库管理员设定一个回调钩子,通知我们的部署流水线,按照部署流水线按照之前设定的步骤来进行目标镜像的构建,并将构建的镜像发布到我们的镜像仓库中。

其中部署流水线我们可以直接使用老牌的Jenkins,也可以选择Tekton这种云原生的部署工具。

基础服务

基于Kubernetes的容器云PaaS平台概要设计

如果仅仅从应用本身来说,除了基础的运行环境和代码,通常还会依赖于一些基础服务(不考虑应用层的依赖), 比如MySQL、Redis、Kafka等基础服务,但是诸如这种服务通常可能并不在Kubernetes中(Opeartor除外),则此时我们就需要一种自助的集成方式,这里我们通过Service catalog进行集成,用户只需要进行申请,就可以自助获取对应的基础服务资源。

日志监控

应用上线后,我们如何获取到对应的健康状态呢?通常就需要日志和监控来进行辅助,我们希望一种方式可以自助的进行服务的日志收集、监控项的收集,此时我们就需要一种与监控和日志系统集成的方式, 还会涉及到各自监控告警,针对日志我们使用EFK来进行日志的收集,监控则采用Prometheus完成,此外除了应用的基础资源监控,可以让业务也进行对应业务指标的暴露,这样我们就可以实现业务层的指标级别的监控。

负载均衡

应用上线后,通常需要对外提供访问,在Kubernetes中因为网络的原因,通常需要通过Ingress来进行网络内部Service的暴露,则要给用户提供一个可以将服务和负载均衡自动关联的组件。

基于Kubernetes的容器云PaaS平台概要设计

负载均衡组件的选择通常有两种:老牌的负载均衡组件(Nginx、Kong、Haproxy)和微服务服务网关(Traefik)等,选择的核心通常是我们要不要改造,比如我们想在Ingress上做一些基础验证、熔断、限流等实现就需要进行二次开发,这就需要选择合适技术栈的Ingress。

这些Ingress通常我们需要一些专有节点,即只负责Ingress的运行,即通常说的Proxy节点,我们需要结合Kubernetes中的污点来进行一些控制,只允许Ingress容器调度到这些节点上。

部署更新

大多数应用都会随着产品的迭代或者bug修复,进行代码的迭代,而在Kubernetes中则通常就是我们说的镜像更新,此过程可以借助Kubernetes的Deployment来进行自动完成。

在应用更新的时候,通常需要进行灰度测试,即只允许部分用户进行访问,如果出现异常,则立刻回滚,如果正常就滚动更新整个应用集群,而在Kubernetes中实现该种方法主要包是通过Deployment来实现,我们这里主要是按照用户灰度的比例通过创建一个新的Deployment,如果成功就继续更新旧的Deployment来实现。

应用下线

针对下线的应用,通常我们要进行对应的资源的释放操作,这里可能需要一个gc模块,负责应用的各种资源的清理工作。

至此我们基于Kubernetes和应用的一些基本需求,完成了基础版本的应用从代码打包、上线监控、部署更新、可观测性(日志监控)等基于云原生的应用全生命周期管理。

基于Kubernetes的PaaS平台功能实现

在本节中我们主要关注基于Kubernetes平面完成一些PaaS平台相关的功能的实现,主要包含:多租户管理、弹性伸缩、容量规划、配置管理、共享存储、集群管理、应用市场等功能。

多租户隔离

基于Kubernetes的容器云PaaS平台概要设计

多租户是基于PaaS平台的一种重要机制,多租户的本质是实现资源的隔离,资源的隔离通常又包含物理隔离和软件隔离,所谓物理隔离即在物理实体上(比如服务器)就进行隔离,而软件隔离则是指通过准入控制来进行资源的访问隔离,考虑大多数的公司内部通常不会对Kubernetes进行物理隔离,所以我们这里可以直接使用Kubernetes中的namespace来做软件级别的隔离。

弹性伸缩

基于Kubernetes的容器云PaaS平台概要设计

弹性伸缩按需计费是PaaS平台的典型特点,而Kubernetes中自带了HPA(横向自动伸缩),并且通过autoscaler实现了VPA(纵向自动伸缩)以及Cluster自动伸缩,依靠这些控制器我们可以很容易的为用户提供弹性伸缩的功能(一般还是横向的多一些)。

容量规划

容量规划主要的目标是通过限定各业务线的资源配额实现资源隔离,同时通过容量计算可以进行资源计费,并且进行未来容量的规划决策资源采购,进行企业的成本核算与控制, 此部分主要是依赖于Kubernetes的ResourceQuota来实现配额功能,通过监控数据来做成本核算。

配置管理

基于Kubernetes的容器云PaaS平台概要设计

在应用开发的过程中通常会使用一些配置信息,比如基础的日志、缓存、数据库等配置信息,在以前的环境中要么是基于env文件,要么是基于配置中心来进行管理,而在Kubernetes中可以通过ConfigMap和Secret两种资源来实现基础的配置管理,即将配置数据与镜像分离,实现按环境进行自动的配置加载。

共享存储

在Kubernetes中共享存储主要是依赖于PV/PVC来实现,这部分由于每个公司的基础设施差异相对较大,通常需要根据公司现有的技术能力来进行调整,具体的实现则依赖于CSI相关的实现,这里不再进行说明。

集群管理

在公司内部的环境中有时候需要进行容灾备份等的考虑,那就需要进行多机房部署,我们的PaaS的平台也需要拥有这种多集群管理的能力, 其实也适用于生产、测试等多环境集群的管理,集群的管理主要是为了解决平台多环境部署的问题,通过一套平台来进行整个集团所有集群的管理。

应用市场

基于Kubernetes的容器云PaaS平台概要设计

应用市场主要是指的针对一些诸如Redis、etcd、Kafka中间件等应用,除了之前说的服务目录的集成方式之外,我们还允许用户通过Opeartor来创建一些基础服务,从而推动基础设施的容器化,这部分通常需要根据当前的环境还有开源的Opeartor来进行微调,从而适配公司的内部环境。

用户中心

在很多公司通常都会有一些企业内部的用户中心服务,可以集成该部分来进行容器云平台的用户认证,甚至一些权限控制,避免重复造轮子。

基础功能

除以上的业务功能外,通常我们还要进行基础的功能,比如操作审计、权限控制、安全管控等基础功能,至此我们已经拥有了一个基础可用的基于Kubernetes的云原生PaaS平台。

容器PaaS平台总结

基于Kubernetes的容器云PaaS平台概要设计

通过上面的的基础建设,我们通常可以得到一个以应用为中的基于Kubernetes的容器PaaS平台,并且从各种功能上来看,基于Kubernetes的各种资源我们只需要很少的开发工作,就可以完成整个PaaS平台的建设,从下一节我们开始进行一些关键部分的开发工作,并进行一些Kubernetes Operator的开发。

Kubernetes学习笔记: https://www.yuque.com/baxiaoshi/tyado3

原文链接: https://mp.weixin.qq.com/s/q88guR-1IYEBzaR0ITo7Pg

查看原文: 基于Kubernetes的容器云PaaS平台概要设计

  • blackleopard
  • yellowsnake
  • yellowcat
  • JiangHanXin