基于K8s的容器云Paas平台应该是每个使用k8s的公司必须要做的一件事,今天我们尝试以应用为中心,采用搭积木的方式完成一个最小版本的容器云Paas平台的设计,Let's Go
1. 基础功能
我们期望是实现一个尽可能自助的服务,所以里面先不考虑一些诸如审批,之类的操作,在此部分我们要完成应用从打包到上线的关键流程
1.1 镜像打包
研发编写好代码,此时就要进行代码的生产环境部署,而部署的最小单元通常就是Docker镜像,那么我们就要实现一个自助的镜像打包服务,来实现从源代码到docker镜像的交付
研发将代码提交到GIt代码仓库后,可以让代码仓库管理员设定一个回调钩子,通知我们的部署流水线,按照部署流水线按照之前设定的步骤来进行目标镜像的构建,并将构建的镜像发布到我们的镜像仓库中
其中部署流水线我们可以直接使用老牌的Jenkins,也可以选择Tekton这种云原生的部署工具
1.2 基础服务
如果仅仅从应用本身来说,除了基础的运行环境和代码,通常还会依赖于一些基础服务(不考虑应用层的依赖), 比如mysql、redis、kafka等基础服务,但是诸如这种服务通常可能并不在k8s中(opeartor除外),则此时我们就需要一种自助的集成方式,这里我们通过service catalog 进行集成,用户只需要进行申请,则就可以自助获取对应的基础服务资源
1.3 日志监控
应用上线后,我们如何获取到对应的健康状态呢?通常就需要日志和监控来进行辅助,我们希望一种方式可以自助的进行服务的日志收集、监控项的收集,此时我们就需要一种与监控和日志系统集成的方式, 还会涉及到各自监控告警,针对日志我们使用EFK来进行日志的收集,监控则采用Prometheus完成,此外除了应用的基础资源监控,可以让业务也进行对应业务指标的暴露,这样我们就可以实现业务层的指标级别的监控
1.4 负载均衡
应用上线后,通常需要对外提供访问,在k8s中因为网络的原因,通常需要通过ingress来进行网络内部service的暴露,则要给用户提供一个可以将服务和负载均衡自动关联的组件
负载均衡组件的选择通常有两种:老牌的负载均衡组件(Nginx/Kong/Haproxy)和微服务服务网关(Traefik)等,选择的核心通常是我们要不要改造,比如我们想在ingress上做一些基础验证、熔断、限流等实现则就需要进行二次开发,则就需要选择合适技术栈的ingress
这些Ingress通常我们需要一些专有节点,即只负责ingress的运行,即通常说的Proxy节点,我们需要结合K8s中的污点来进行一些控制,只允许ingress容器调度到这些节点上
1.5 部署更新
大多数应用都会随着产品的迭代或者bug修复,进行代码的迭代,而在k8s中则通常就是我们说的镜像更新,此过程可以借助k8s的deployment来进行自动完成
在应用更新的时候,通常需要进行灰度测试,即只允许部分用户进行访问,如果出现异常,则就立刻回滚,如果正常就滚动更新整个应用集群,而在k8s中实现该种方法主要包是通过Deployment来实现,我们这里主要是按照用户灰度的比例通过创建一个新的Deployment,如果成功就继续更新旧的Deployment来实现
1.6 应用下线
针对下线的应用,通常我们要进行对应的资源的释放操作,这里可能需要一个gc模块,负责应用的各种资源的清理工作
至此我们基于k8s和应用的一些基本需求,完成了基础版本的应用从代码打包、上线监控、部署更新、可观测性(日志监控)等基于云原生的应用全生命周期管理
2.基于K8s的Paas平台功能实现
在本节中我们主要关注基于K8s平面完成一些Paas平台相关的功能的实现,主要包含:多租户管理、弹性伸缩、容量规划、配置管理、共享存储、集群管理、应用市场等功能
2.1 多租户隔离
多租户是基于paas平台的一种重要机制,多租户的本质是实现资源的隔离,资源的隔离通常又包含物理隔离和软件隔离,所谓物理隔离即在物理实体上(比如服务器)就进行隔离,而软件隔离则是指通过准入控制来进行资源的访问隔离,考虑大多数的公司内部通常不会对k8s进行物理隔离,所以我们这里可以直接使用k8s中的namespace来做软件几倍的隔离
2.2 弹性伸缩
弹性伸缩按需计费是Paas平台的典型特点,而K8s中自带了HPA(横向自动伸缩),并且通过autoscaler实现了VPA(纵向自动伸缩)以及Cluster自动伸缩, 依靠这些控制器我们可以很容易的为用户提供弹性伸缩的功能(一般还是横向的多一些)
2.3 容量规划
容量规划主要的目标是通过限定各业务线的资源配额实现资源隔离,同时通过容量计算可以进行资源计费,并且进行未来容量的规划决策资源采购,进行企业的成本核算与控制, 此部分主要是依赖于k8s的ResourceQuota来实现配额功能,通过监控数据来做成本核算
2.4 配置管理
在应用开发的过程中通常会使用一些配置信息,比如基础的日志、缓存、数据库等配置信息,在以前的环境中要么是基于env文件,要么是基于配置中心来进行管理,而在k8s中文名可以通过configMap和Secret两种资源来实现基础的配置管理,即将配置数据与镜像分离,实现按环境进行自动的配置加载
2.5 共享存储
在k8s中共享存储主要是依赖于PV/PVC来实现,这部分由于每个公司的基础设施差异相对较大,通常需要根据公司现有的技术能力来进行调整,具体的实现则依赖于CSI相关的实现,这里不再进行说明
2.6 集群管理
在公司内部的环境中有时候需要进行容灾备份等的考虑,则就需要进行多机房部署,那我们的PAAS的平台也需要拥有这种多集群管理的能力, 其实也适用于生产、测试等多环境集群的管理,集群的管理主要是为了解决平台多环境部署的问题,通过一套平台来进行整个集团所有集群的管理
2.7 应用市场
应用市场主要是指的针对一些诸如redis、etcd、kafka中间件等应用除了之前说的服务目录的集成方式之外,我们还允许用户通过opeartor来创建一些基础服务,从而推动基础设施的容器化,这部分通常需要根据当前的环境还有开源的opeartor来进行微调,从而适配公司的内部环境
2.8 用户中心
在很多公司通常都会有一些企业内部的用户中心服务,可以集成该部分来进行容器云平台的用户认证甚至一些权限控制,避免重复造轮子
2.9 基础功能
除以上的业务功能外,通常我们还要进行基础的功能,比如操作审计、权限控制、安全管控等基础功能,至此我们已经拥有了一个基础可用的基于k8s的云原生Paas平台
3. 容器Paas平台总结
通过上面的的基础建设,我们通常可以得到一个以应用为中的基于K8s的容器PaaS平台,并且从各种功能上来看,基于k8s的各种资源我们只需要很少的开发工作,就可以完成整个Paas平台的建设,从下一节我们开始进行一些关键部分的开发工作,并进行一些k8s operator的开发, Let's Go。。
kubernetes学习笔记地址: https://www.yuque.com/baxiaoshi/tyado3