Cloudpods容器化经验分享
背景介绍
Cloudpods是一个开源的多云混合云管理平台。Cloudpods首先是一个私有云云平台,具备将计算节点使用开源QEMU/KVM虚拟化技术虚拟出虚拟机,实现私有云的功能。其次,Cloudpods能够纳管其他的云平台,包括主流私有云和公有云,实现云管的功能。Cloudpods的目标是帮助用户基于本地基础设置以及已有云基础设置,构建一个统一融合的云上之云,达到降低复杂度,提高管理效率的效果。Cloudpods从3.0开始全面拥抱Kubernetes,基于Kubernetes部署运行云平台的服务组件,采用Kubernetes Operator,基于Kubernetes集群自动化部署服务,实现了云平台的服务的容器化分布式部署。本文总结了Cloudpods在过去3年云平台底层容器化改造的经验。
目前,将Kubernetes作为IAAS平台的底层服务管理平台是一个趋势,例如OpenStack的Kolla项目,VMware的Tanzu,以及基于Kubernetes的虚拟化方案KubeVirt。Cloudpods顺应此趋势,早在2019年下半年开始基于Kubernetes构建Cloudpods的服务组件基础设施。理论上,Cloudpods站在了巨人的肩膀上。有了Kubernetes的加持,我们基于Operator管理CRD(Custom Resource Definition)机制做到了更优雅的服务自动化部署,符合IaC(Infrastructure as code)实践的服务升级和回滚,服务的自动高可用部署等等。但在实际效果上,我们基于Kubernetes,获得了一些便利,但也遇到了不少未曾预料到的问题。本文介绍自从2019年3.0容器化改造以来,因为引入Kubernetes遇到的问题,我们的一些解决方案,以及将来的规划。
容器化带来了哪些好处
1. 方便对分布于多个节点上的服务的管理
管理员可以在控制节点统一地查看运行在各个节点的服务状态,查看日志,启停和发布回滚服务,甚至exec进入服务容器排查问题。同时我们引入Loki收集所有容器的日志,可以统一地查看各个服务的日志。对分布式集群的运维和排障都变得相对简单。采用Kubernetes之后,直接登录各个节点排障的机会大大降低了。
2. 集群配置变更变得方便和可控
整个集群的状态可以保存为一个OnecloudCluster yaml文件。可以方便地变更集群的配置,包括集群的版本,实现版本的升级和回退,以及集群服务的开启和关闭,镜像版本等关键参数的变更等。更进一步地,可以通过git进行配置yaml的版本控制,做到变更的历史记录审计,并且可以随时恢复到任意指定的配置。
3. 易于适配不同的CPU架构和操作系统
Kubernetes作为一层中间层,从一定程度上屏蔽了底层的差异。采用Kubernetes后,对CPU和操作系统的适配大概分为三部分工作:
1)Kubernetes对CPU和操作系统的适配; 2)不同CPU架构下服务容器镜像的构建; 3)Kubernetes之外的组件的适配,例如平台依赖的rpm包等。
基于Kubernetes自身强大的生态,1)基本都有现成的解决方案,只需要做相应的集成工作。2)只需通过docker buildx工具生成异构CPU架构的镜像。因此,整个适配工作复杂度大大降低了。
4. 部署的便利性增加
引入Kubernetes之后,整个部署流程分为几个阶段:
1)Kubernetes的部署,这个步骤通过基于kubeadm改造的ocadm实现。 2)Cloudpods服务容器的部署,这个步骤通过ocadm在容器内部署operator,通过operator实现相应configmaps,deployments和daemonsets等资源的创建,进而自动创建服务集群。 3) Kubernetes之外依赖组件的安装部署。这个步骤通过ocboot集成ansible实现。
每个阶段都是基于成熟的开源方案扩展实现,可靠性高。同时,各个组件分工明确,模块化清晰,易于维护和扩展。
5. 可以复用Kubernetes本身自带的强大功能
如coredns可以自定义域名,甚至可以做泛域名解析。Ingress自带反向代理的功能。service+deployment提供的多副本冗余机制。daemonset提供的在新添加节点自动拉起服务的能力。对服务的资源限制(CPU,内存,进程号等)。这些都使得云平台服务功能特性的实现变得更加容易。
容器化遇到了哪些问题,如何解决
下面总结一些遇到的问题。这些问题是我们在采用Kubernetes管理和运行云平台组件中陆续发现的。有些已经彻底解决,但很大一部分还只是部分解决,彻底解决的方案还在持续摸索中。