基于Kubernetes和Docker技 术的企业级容器云平台解决方案

2018-10-20 06:57王骏翔
关键词:镜像组件容器

王骏翔, 郭 磊

(中远海运科技股份有限公司,上海200135)

0 引 言

随着IaaS(Infrastructure-as-a-Service)基础架构层的服务器虚拟化技术不断发展,如何进一步对传统服务资源进行有效整合和再利用得到广泛关注和深入研究。随着企业级微服务应用迅速发展,Containers容器技术虽然会在一定程度上模糊IaaS基础设施即服务与PaaS(Platform-as-a-Service)平台即服务之间的界限,但能大大提升传统虚拟化和物理环境上的工作效率。由此,容器云被提出并得以实现。

目前,主流的微服务架构技术方案都采用Docker容器技术。Docker是一个开源的应用容器引擎,能极大程度地消除开发环境与运维环境的差异,便于进行版本管理和持续交付,使开发者既能将其应用和依赖包打包到一个可移植的容器中,并发布到任何流行的机器上,又可实现虚拟化。Docker的一些特性(如隔离、物理机制等)与微服务架构有着天然的契合度,因此成为构建容器云服务平台的基础。

对于大型企业而言,迫切需要构建一套具备高可用性、高性能、高安全性和易扩展性的容器云服务平台,用于承载微服务系统的应用,而仅依靠Docker容器技术无法完全满足该要求。因此,业界一些开源项目开始不断涌现、发展和状大,自我定位在服务编排和部署工具之上、传统的PaaS平台之下,在功能上既保证容器群集的高效编排和运维,又提供恰当的平台层服务,为系统研发人员和运维人员提供更大的发挥空间,如Docker Swarm、Google Kubernetes和Mesos/Marathon。

Kubernetes是由Google提出的一种全新的基于容器技术的分布式架构方案,与Docker Swarm和Mesos相比,具有更完备的群集管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制及多颗粒度的资源配合管理能力。鉴于Kubernetes有Google强大的开源支撑和成功应用的案例,基于Kubernetes和Docker构建容器云服务平台是大型企业构建生产环境容器云服务平台的较优选择之一。

1 容器云服务的需求与价值

1.1 Docker容器技术的发展趋势[1]

某大型集团企业已利用虚拟化技术实现内部私有云IaaS平台的建设,云计算虚拟化技术已给该企业带来服务器运算资源集中、应用开发速度提升、运维成本下降和系统稳定性提高等显著成效。同时,随着微服务应用的迅速发展及容器技术的逐渐成熟和广泛应用,该企业开始利用Docker容器技术对效率和稳定性的进一步提升进行探索实践——通过用轻量级的Docker Engine取代原有重复的虚拟化层(Hypervisor)和系统服务层(Guest OS),更灵活、高效地利用Linux Namespaces和Cgroups技术为应用程序提供隔离性高、安全灵活的运行空间和运行资源(见图1)。

图1 Docker容器技术与传统虚拟化技术架构对比

应用Docker容器技术给该企业的信息化建设带来的好处包括:持续部署与测试;跨云平台支持;环境标准化和版本控制;高资源利用率与隔离;容器跨平台性与镜像;易于理解和应用;应用镜像仓库。

1.2 微服务的价值与意义

微服务是开发一种单纯、小型、有意义的功能作为一项单一服务。通过微服务能将功能分解到离散的各服务中去,降低系统的耦合性,提供更加灵活的服务支持。微服务的优点包括:

1)体量小,用于实现一种特定的功能或业务需求;

2)可由一个小的开发组独立完成开发;

3)松耦合,服务之间可独立进行开发和部署;

4)可用不同的语言开发;

5)可通过持续集成工具,便捷地自动集成部署;

6)易于理解、修改和维护;

7)易扩展。

1.3 Docker容器的集群需求

图2为传统应用架构与微服务架构对比。Docker提供有编译、上传、下载、启动和停止容器的所有必要功能,对于在单主机环境中容器数量最少的情况下管理这些过程而言是很合适的。但是,对于企业级应用而言,当需跨多个主机管理大量的Docker容器时,集群环境下的Docker宿主机所面对的网络、负载均衡、服务发现和高可用等特殊需求都带来了很大的困扰。

图2 传统应用架构与微服务架构对比

该大型企业虽然已利用Docker容器技术陆续开展并实现容器化和微服务的转型,但在大规模群集部署和应用时,传统的Docker应用依然存在诸多问题:

1)多元化平台不利于统一管理;

2)独立的容器服务不利于企业进行大规模信息系统的建设;

3)高可用、高冗余副本缺失,灵活度低;

4)人工运维,缺乏自动的弹性伸缩。

1.4 Kubernetes技术对企业的价值和意义

调度和编排是集群管理的重要组成部分。当应用被扩展到多台宿主机时,管理每个宿主系统和抽象化底层平台的复杂性变得更高。编排是一个广义的概念,是指容器调度、集群管理和可能的其他主机供应配置。容器管理是控制一组宿主机的过程,包括从一个集群中添加或移除主机、获取宿主机或容器当前的状态信息和启动或管理进程。集群管理与调度紧密相连,因为调度必须有权限通过集群中的每台宿主机来管理服务。

Kubernetes作为Docker生态圈中的重要一员,是Google大规模容器管理技术的开源版本,基于Docker实现包括应用部署、服务编排、高可用管理和弹性伸缩在内的一系列功能,具有以下优点:

1)提供高可用、高冗余的群集化管理模式;

2)为容器组件提供高效的弹性伸缩;

3)提供一整套易于对接的RESTfull API;

4)能与企业级微服务架构无缝结合;

5)实现零停机的灰度发布。

2 Kubernetes和Docker容器云服务的架构设计

通过合理的资源和组件架构设计,按不同业务功能和模块对该大型集团企业的各Docker容器资源进行拆分,并纳入到不同的容器群集服务中,通过借助Kubernetes的Pod和Service分组化管理实现不同业务类型服务器资源的最大隔离及促进企业应用微服务的合理有效拆分和运营[2]。

2.1 Docker容器群集设计

在容器集群规划中,将承载微服务的Docker容器部署于Kubernetes集群体系中,利用其Master组件(APIs、Scheduler、Etcd)和多个Node节点组件(Kubelet、Kube-Proxy)及分布式存储系统保障容器群集的高效、稳定服务。将整个系统模块分为运行在Node节点上的容器服务和运行在Master节点上的用于组成集群级别的控制管理服务。

Kubernetes节点有运行应用容器必备的服务,而这些都受Master的控制。每个节点上都需运行Docker服务,用来负责所有具体的映像下载和容器运行。

Kubernetes体系主要由以下核心组件组成:

1)Etcd,负责提供和保存整个集群的状态;

2)APserver,负责提供资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;

3)Controller Manager,负责维护集群的状态,如故障检测、自动扩展和滚动更新等;

4)Scheduler,负责调度资源,按照预定的调度策略将Pod调度到相应的机器上;

5)Kubelet,负责容器的生命周期维护及Volume(CVI)和网络(CNI)管理;

6)Container runtime,负责镜像管理及Pod和容器的真正运行(CRI);

7)Kube-Proxy,负责为Service提供Cluster内部的服务发现和负载均衡。

Kubernetes的体系架构见图3。

2.2 容器云私有镜像仓库设计

镜像仓库作为Docker容器环境的重要组成部分,主要用来存储和管理容器镜像。Docker有公共的镜像仓库,考虑到定制化、便捷性和安全性等因素,大部分企业都会基于自身环境需求构建内部专属的镜像仓库进行统一运营和维护。

图3 Kubernetes的体系架构

根据该企业业务系统的结构和功能特色,定制化地设计相应的基于应用商店的Docker镜像仓库,并通过利用Kubernetes的RC副本复制机制和NFS共享存储保证其服务可靠和运行稳定。

2.3 容器云高可用设计

2.3.1 通过Replication Controller/Replicat Set服务提供Pod组件的冗余性[3]

RC是Kubernetes集群中用来保证Pod服务组件高可用的API对象。通过旁路监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的Pod Replication数目既可是多个,也可是1个;若运行中的Pod少于指定数目,RC就会启动并运行新的Pod副本;若运行中的Pod多于指定数目,RC就会消除多余的Pod副本。即使是在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更合理,因为RC也可发挥其高可用的能力,保证始终有1个Pod在运行。

Replicat Set是Kubernetes体系中的新一代RC,具有与RC相同的高可用能力,主要区别在于Replicat Set能支持更多种类的匹配模式,更灵活便捷。Replicat Set一般不单独使用,而是作为Deployment的理想状态参数使用。

2.3.2 通过多节点Master和Etcd群集保障群集服务的冗余性

鉴于Kubernetes中Master和Etcd组件的重要性,在设计容器云的部署架构时,通过采用部署Active-Active的方式和Etcd服务集群的模式来保障其整个容器群集的冗余和稳定。Kubernetes高可用群集架构见图4。

图4 Kubernetes高可用群集架构

1)Master服务的Active-Active设计。Kube-Controller-Manager和Kube-Scheduler服务通过添加--leader-elect=true参数来保证其服务同时启动,系统会自动选举leader;Kube-Apiserver原生则支持多节点同时运行,通过配置VIP对其进行浮动指向。

2)Etcd服务的集群设计。Etcd支持集群化部署方式,规划通过利用Static的方式对其集群进行配置。

3 Kubernetes和Docker容器云服务的部署与实现

与传统的IaaS和虚拟化平台架构不同,Kubernetes和Docker容器云服务平台主要用来解决企业级的微服务应用和Docker容器的孤岛现象,提供统一的服务管理、弹性伸缩及高可用的容器集群、服务发现和服务编排的PaaS平台。

Kubernetes提供并支持多种部署方式,如:适用于入门和基础功能测试的Minikube方式;适用于开发测试环境的Kubeadm Cluster方式;适用于高可用生产环境的多组件冗余方式等。这里为满足大型企业生产环境的高可用需求,计划在底层环境的建设中在X86物理服务器上直接构建,并通过一系列核心组件冗余的方式进行设计部署,以确保其整个平台的高可用和稳定性[4]。

3.1 Docker和Kubernetes环境部署

Docker引擎的环境部署可利用YUM的方式进行,Docker.repo的配置源信息为:

name=Docker Repository

baseurl=https://yum.dockerproject.org/repo/main/centos/7/

enabled=1

gpgcheck=1

gpgkey=https://yum.dockerproject.org/gpg

Kubernetes基础环境的部署可通过源码下载,利用二进制编译的方式进行systemctl服务注册配置。

3.2 私有镜像仓库部署

对于私有镜像仓库的配置,可通过利用Kubernetes的群集环境进行Service和Replication Controller的配置部署,以保障其Pod服务的高可用。

3.3 高可用Master和Etcd集群架构部署

Kubernetes系统的各组件需采用TLS证书对通信进行加密,通过cfsslgencert生成证书和密钥,并将.pem密钥文件存放于各节点的/etc/kubernetes/ssl目录中。同时,通过配置多Mater节点服务和Etcd群集的方式构建Kubernetes高可用环境(见图5)。

图5 Kubernetes Master和Etcd组件架构图

3.3.1 Master服务Active-Active模式的实现

在部署Kubernetes Master服务时,通过对Kube-Controller-Manager和Kube-Scheduler服务添加--leader-elect=true参数来保证其服务的同时启动,系统会自动选举leader。

3.3.1.1 Kube-Controller-Manager服务

Kube-Controller-Manager的Serivce配置为:

[Unit]

...

[Service]

Environment File=-/etc/kubernetes/config

Environment File=-/etc/kubernetes/controller-manager

ExecStart=/usr/bin/kube-controller-manager

$KUBE_LOGTOSTDERR

$KUBE_LOG_LEVEL

$KUBE_MASTER

$KUBE_CONTROLLER_MANAGER_ARGS

Restart=on-failure

Limit NOFILE=65536

[Install]

...

3.3.1.2 Kube-Scheduler服务

Kube-Scheduler的Serivce配置为:

[Unit]

...

[Service]

EnvironmentFile=-/etc/kubernetes/config

Environment File=-/etc/kubernetes/scheduler

ExecStart=/usr/bin/kube-scheduler

$KUBE_LOGTOSTDERR

$KUBE_LOG_LEVEL

$KUBE_MASTER

$KUBE_SCHEDULER_ARGS

Restart=on-failure

Limit NOFILE=65536

[Install]

...

3.3.2 Etcd服务集群环境的实现

在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,如何构建一套高可用、安全、易于部署和响应快速的服务集群,已成为迫切需要解决的问题,而Etcd服务可为有效解决该问题助力。

Etcd服务是一个高可用的键值存储系统,主要用于配置共享和服务发现。Etcd是由CoreOS开发、维护的,借鉴Zoo Keeper和Doozer,使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。

Etcd Raft协议见图6,每个Etcd节点都维护一个状态机,且任意时刻至多存在1个有效的主节点。主节点处理所有来自于客户端的写操作,通过Raft协议保证写操作对状态机的改动会可靠地同步到其他节点。

图6 Etcd Raft协议

Etcd工作原理的核心部分是Raft协议,主要分为选主、日志复制和安全性等3部分。Etcd具有以下4个特点:

1)简单,基于HTTP+JSON的API使得通过curl命令就可轻松使用;

2)安全,可选SSL客户认证机制;

3)快速,每个实例每秒支持1 000次写操作;

4)可信,采用Raft算法充分实现分布式。

3.4 容器云服务的应用效果

利用云计算Kubernetes和Docker容器云技术实现大型集团企业资源整合是较为高效、稳妥和冗余的建设方案。该大型集团企业建设容器云服务平台前后的技术指标对比见表1。

表1 某大型集团企业建设容器云服务平台前后的技术指标对比

从表1中可看出,容器云服务平台的建设不仅使整体容器云服务的管理、伸缩性和性能等得到了提升,同时给整个架构体系模式带来了质的飞跃。未来该企业所有的微服务系统和容器的需求都将在该Kubernetes和Docker容器云平台上进行统一的资源服务开设、管理和回收,将极大地降低企业运维成本和数据服务资源的生命周期管理成本。

4 结 语

如今越来越多的企业面临IaaS和PaaS云平台的建设及微服务系统的构建和转型。对此,在企业私有云平台中构建一个企业自身适用的应用容器云服务体系尤为重要。

猜你喜欢
镜像组件容器
无人机智能巡检在光伏电站组件诊断中的应用
Kistler全新的Kitimer2.0系统组件:使安全气囊和安全带测试更加可靠和高效
3月光伏组件出口量增长164.6%至7.49GW!单价创新低
镜像
一种嵌入式软件组件更新方法的研究与实现
难以置信的事情
镜像
液体对容器底及容器对桌面的压力和压强
取米
镜像