新国脉文旅科技有限公司 朱振武
随着IT技术的不断发展,新兴的基于容器的PaaS云计算技术凭借自身启动快、资源损耗小、轻量级的、容器中运行的服务功能相对单一等优点迅速被各大企业接受,越来越多的公司开始部署基于容器的PaaS云平台并将之应用于生产中,本文着重论述大中型企业如何建设企业自己的基于容器的PaaS私有云系统。
私有云计算是一种将企业的计算资源统一管理、统一分配、按需分配的IT服务模式。目前,多数大中型企业在数字化转型中已实现基于IaaS的云计算,IaaS云技术在一定程度上提升了计算资源的使用率和运维效率。但随着企业的发展,企业在IT运营和管理上遇到了众多新挑战,主要是IT系统越来越庞杂、IT资源越来越多、应用微服务化后,IaaS云技术存在对算力的管理和分配不够轻便灵活、难于管理海量微服务、自身较重等诸多问题。
为了解决上述问题,大中企业纷纷采用最新IT技术,将企业IT基础架构从IaaS云逐步升级到PaaS容器云或两者并存的时代,利用容器云的轻量级、容器化等特点来管理海量微服务、提高资源的利用率、增强系统可靠性、降低IT运营成本。
LXC(Linux Container)是Linux的内核虚拟化技术,LXC通过Namespace实现了进程资源的隔离,通过Cgroups(Control Groups)控制每个Namespace中的资源分配。与传统虚拟化技术(KVM)相比,LXC与宿主机使用同一个内核,不需要指令级模拟,容器与宿主机的资源可以共享,具有轻量、性能损耗小等优点。
要构建容器云,我们需要选择一个合适的容器技术。目前,容器技术中具有代表性的有Docker技术和Mesos技术。从当前的容器技术发展分析,Docker技术是业界容器技术的主流和事实标准,是容器云的未来。
Docker是一个基于LXC内核容器技术实现的开源应用容器引擎[1],通过对LXC进行进一步封装,实现应用程序级别的隔离,它的分层结构设计极大实现了共享资源,降低了系统的资源使用率,启动非常快,拥有非常高的性能。
容器云架构下,一个业务较复杂的应用将被拆分成若干功能单一的微服务并在容器中运行,为了满足IT系统的高可用和高并发等需求,一个微服务会有若干副本并行运行。故而容器云中将会有成千上万的微服务实例,实例之间还进行着纷繁复杂的交互通信,为了高效管理这些微服务,业界一般采用容器编排技术实现海量容器的自动化的管理、监控、故障发现和隔离、故障迁移等工作。
目前成熟的容器编排技术有Swarm和Kubernetes(以下简称K8S)等技术。其中,K8S提供了丰富的容器编排和管理功能[2],诸如:服务注册与发现、服务网关、服务自动迁移、灰度部署、服务治理等,功能涵盖广泛,能够满足绝大多数企业的IT需求。
我们以K8S和Docker为核心技术,探讨如何构建企业级PaaS容器云,并从企业的IT治理等方面进一步阐述如何高效的管理和使用容器云。容器云平台自底向上共分为IT资源层、服务调度层、云服务层、控制层、云接入层等五层。在IT资源层,使用K8S+Docker技术构建容器云基础环境,实现对算力的统一管理、按需分配;在服务调度层,借助K8S强大的服务编排能力,实现对服务的注册与发现、服务所需资源的弹性伸缩、服务生命周期管理等能力;在云服务层,通过对开源软件进行集成结合自研方式,建设容器云主要支撑系统;在控制层,依托K8S的Ingress网关服务,构建访问容器云的云网关;在云接入层,构建云服务治理系统及用于外部用户统一接入容器云的能力开放系统。平台的系统架构如图1所示。
图1 容器云平台的系统架构Fig.1 System architecture of container cloud platform
容器云采用Master-Slave架构来统筹管理算力,管理节点(Master)及云核心服务软件(代码仓库、镜像仓库等)可采用独立服务器或容器部署,计算(Slave)节点可采用物理机或虚拟机部署(推荐使用物理机)。本文采用管理节点(Master)及云核心服务软件独立服务器部署方式,网络拓扑图如图2所示。
图2 容器云平台的网络拓扑Fig.2 Network topology of container cloud platform
容器云基础环境搭建主要是部署K8S、Docker等容器云核心服务,搭建容器云平台对系统的软硬件环境有一定的要求和建议,主要有以下几个方面:(1)宿主机CPU要支持虚拟化技术并在BIOS中开启;(2)宿主机操作系统基于X86_64架构的各种Linux发行版,Kernel在4.X以上;(3)Master节点的CPU、内存、存储建议要高于2core、4G、20G;(4)Node节点的CPU、内存、存储建议要高于4core 8G 40G;(5)核心软件版本建议:K8S v1.15以上、Docker v1.15以上、Etcd v2.0以上。
生产环境下,选择若干台(一般3台以上、奇数台)高性能服务器作为Master节点集群,部署ETCD(有条件的情况下ETCD可以使用独立服务器部署)、API-Server、Controller-Manager、Scheduler等服务。其中,ETCD作为K8S的运行时数据库,存储K8S集群运行时关键数据。API-Server负责和ETCD交互,并对外提供统一的API调用入口。Controller-Manager作为K8S集群的管理控制中心,负责集群内Node、Service、Replication等资源的管理。Scheduler负责Node节点资源管理,将Pod合理分配到相应的Node节点。
为了容器云能够7×24h的高可用性运行,需对ETCD、API-Server等服务进行高可用配置。可采用ETCD和API-Server的原生集群能力,结合Keepalived、HA-Proxy实现Master节点的高可用。
Node(Slave)节点是容器云的算力节点,众多的算力节点形成算力池,在Master统一调度下对外提供云服务。Node节点上需部署Docker、Kubelet、Kuberoute等服务。其中,Docker提供容器服务。Kubelet负责接收Scheduler的指令,维护Pod和上报Pod状态。Kube-route作为容器云的网络服务,是K8S Service的访问代理和Pod的负载均衡器。
在容器云虚拟网络选型上,我们选择使用支持CNI网络的Kube-router组件替代了Kube-proxy组件。相比业界常用的Overlay方式的Flannel网络,CNI网络的优点是网络速度相对较快、带宽损耗小等优点。如果企业对网络稳定性有非常高的需求,也可以选择最为稳定的Flannel网络。
要使用容器云平台能够对外提供服务,我们还需要部署代码仓库、Docker镜像仓库、云DNS服务、接入网关等容器云配套服务软件,主要包括如下软件服务:(1)代码仓库:采用开源GitLib作为云平台的代码仓库;(2)镜像仓库:选择一台服务器并安装Docker,下载Registry镜像并配置启动;(3)容器云DNS:选用Kube-DNS作为云平台内部DNS服务;(4)服务网关:选用Nginx-Ingress组件实现外部系统通过ClusterIP方式对容器云的访问。
可利旧现网存储系统(如:企业现有IaaS云存储),如果条件允许,也可通使用NFS或GlusterFS等建设容器云专用存储系统。
容器云基础环境搭建完成后,平台的各组件、各模块的架构和调用关系如图3所示。
图3 容器云主要组件调用关系Fig.3 Container cloud's component invocation relationship
为了进一步提升容器云的可用性和自动化程度,还需为容器云配套建设一系列服务治理系统,主要包括基于DevOps的CI/CD自动化流水线子系统、云数据总线服务子系统、微服务日志中心子系统、微服务配置中心子系统等。
企业的容器云构建完成后,并不代表企业就此可以高效的使用容器云,为了更好发挥容器云的优势,企业需从人力资源管理、IT管理流程和IT研发等方面制定适合自身的工作标准和制度,并在生产活动中持续完善和提升IT管理水平和容器云资源利用水平,为企业生产助力。