19

基于k8s的容器云Paas平台概要设计-8小时

 4 years ago
source link: https://blog.51cto.com/srexin/2487073
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

1. 基础功能

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

1.1 镜像打包

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

image.png

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

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

1.2 基础服务

image.png

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

1.3 日志监控

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

1.4 负载均衡

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

image.png

负载均衡组件的选择通常有两种:老牌的负载均衡组件(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 多租户隔离

image.png

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

2.2 弹性伸缩

image.png

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

2.3 容量规划

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

2.4 配置管理

image.png

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

2.5 共享存储

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

2.6 集群管理

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

2.7 应用市场

image.png

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

2.8 用户中心

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

2.9 基础功能

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

3. 容器Paas平台总结

image.png

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

kubernetes学习笔记地址: https://www.yuque.com/baxiaoshi/tyado3


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK