文/Ypl 20180830

前言
越来越多的系统部署在云上,越来越多的软件架构设计采用了微服务的理念。本文主要分析被广泛使用的Kubernetes微服务架构,并在最后简要的剖析与相对主流的Spring Cloud、Dubbo之间相似和不同之处,通过对比分析来阐明我们该如何选择Kubernetes、Spring Cloud或者Dubbo。
本文内容主要包括以下几个部分:
1) Kubernetes的定位
2) Kubernetes基本概念、组成要素
3) Kubernetes主要资源对象深入剖析
4) Kubernetes关键组件工作原理
5) Docker要素剖析、容器集群
6) 如何使用Kubernetes(安装部署、开发生产)
7) Kubernetes、Spring Cloud、Dubbo对比分析
8) 结论
9) 参考文献
内容安排大致为:第一章Kubernetes的定位,第二章Kubernetes基本概念、组成要素,第三章Kubernetes主要资源对象深入剖析,第四章Kubernetes关键组件工作原理,第五章Docker要素剖析、容器集群,第六章如何使用Kubernetes,第七章结论。
预计按照四部分进行描述,第一部分:了解Kubernetes,包括第一章和第二章内容;第二部分:熟知Kubernetes,包括第三章和第四章内容;第三部分:了解Docker,第五章内容;第四部分:使用Kubernetes,第六章内容;第五部分:对比分析和结论,包括第七章和第八章的内容。
本文主要参考了《Kubernetes权威指南》、“百度”、各大博客。


一、 Kubernetes的定位
《Kubernetes权威指南》1书中1.1节“Kubernetes是什么”的原话如下描述:
首先,它是一个全新的基于容器技术的分布式架构领先方案。……
其次,如果我们的系统设计遵循了Kubernetes的设计思想,那么传统系统架构中那些和业务没有多大关系的底层代码与功能模块,都可以立刻从我们的视线中消失。……
然后,Kubernets是一个开放的开发平台。……,无论是用Java、Go、C++还是Python编写的服务,都可以毫无困难的映射为Kubernets的Service,并通过标准的TCP通信协议进行交互……
最后,Kubernets是一个完备的分布式系统支撑平台。Kubernets具有完备的集群管理能力……
先不用考虑上段话中的一些专业词汇的深意。《Kubernetes权威指南》1中的上述描述基本是对Kubernetes的作用的一个分解,个人理解并没有起到Kubernetes进行定位的作用,回答“是什么”的问题,最好是简洁的一句话。
摘自文献2的一句话:
Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
针对Kubernetes来说,这里的容器指的就是Docker。Kubernetes+Docker的分布式架构解决方案/微服务解决方案/PaaS云解决方案和OpenStack+KVM的IaaS云解决方案,我理解在设计思想上如出一辙。KVM实现的是对基础硬件资源的虚拟化,OpenStack实现虚拟化后的资源池的管理,包括计算、存储、网络等资源的动态分配、负载均衡等。而Docker实现的是对软件进程的隔离,共享底层硬件资源,Kubernetes实现对容器化后的进程(这里和服务应该是对应的),也就是服务进行管理,包括服务发现、服务的动态扩容、负载均衡等。再深一步,和操作系统+CPU/输入输出设备的计算机的计算机资源管理方案在设计思想上也有相似之处。和《大话存储》(文献3)一书中,冬瓜哥提的“万物不离其宗”的思想不谋而合。


二、 Kubernetes基本概念、组成要素
《Kubernetes权威指南》一书在1.4节描述了Kubernetes基本概念和术语,由于其内容前后交叉,对于初学者来说看的比较吃力(需要多遍学习,前后贯通),以《Kubernetes权威指南》书中内容为基础,本文进行调整修改并分析描述。
从使用Kubernetes的角度,可以将Kubernetes的组成划分为以下几部分:
1) 集群节点,包括集群控制节点Master和工作负载节点Node;
2) 关键进程,即关键组件。主要包括分别运行在Master节点上的和运行在Node节点上的关键进程;
3) 资源对象,即服务的承载者,也是Kubernetes的核心,Service(简写为Svc)和Pod。围绕着它们有一堆的很重要的概念Replication Controller、Label等;
4) 管理工具Kubectl。
此处可以先看一张Kubernetes关键组成要素关系图(此图来源于文献4),暂不对此图进行分析,此处可以不予理会,在第二章学习完毕后再返回看此图。
这里写图片描述
图 1 Kubernetes关键组成要素关系图
2.1 集群节点
1) Master节点
Master节点负责整个集群的管理和控制,基本上Kubernetes所有的控制命令都发给它。执行的命令一般都是在Master上执行,Master一般独占一台服务器。由于Master节点至关重要,一旦宕机会导致整个集群的失效不可用,Master节点的高可用部署至关重要。后续会有专题来讨论Kubernetes的Master节点的高可用部署方案。
2) Node节点
除了Master节点,其它的实际的工作负载节点称为Node,早期称为Minion,Node节点承载Master节点分配给它的容器负载。
2.2 关键进程
1) Master节点上运行的负责集群管理调度的一组进程
Kubernetes API Server(kube-apiserver):是Kubernetes里所有资源的增删改查等操作的唯一入口,是集群控制的入口进程;
Kubernetes Controller Manager(kube-controller-manager):Kubernetes里所有资源对象的自动化控制中心;
Kubernetes Scheduler(kube-scheduler):负责资源调度;
etcd存储服务。
此处可以先不去纠结kube-controller-manager和kube-scheduler的关系,后面第四章会有专门的分析二者的作用。
2) Node节点上运行的负责资源创建、通信、负载均衡、Docker创建与管理的一组进程
kubelet:与Master节点密切协作实现集群管理,负责Pod对应的容器的创建、启停等任务;
kube-proxy:实现服务间的通信与负载均衡;
Docker Engine(Docker):负责本机Docker容器的创建于管理等。
2.3 资源对象
Pod和Service是Kubernetes中较为核心的两个概念,抛开概念的说法,本文将其统一理解为资源,2.2节说到了Node节点是工作负载节点,对于Node来说,其上运行了除了2.2节描述的一组关键进程外,还有多个Pod资源,每个Pod里包含的就是一组容器镜像(至少包括一个根容器Pause容器)。一个或者多个Pod被映射为一个服务资源Svc。
本节内容对主要的概念进行介绍性描述,第三章会进行详细分析。
1) Pod
Pod是Kubernetes里最小的资源管理对象,Pod运行在Node节点上,容器运行在Pod里,Pod里包含一个根容器和一个或多个业务容器,一般情况下,紧密相关联的几个业务进程会被以不同的容器镜像的形式放在同一个Pod里。Node、Pod、容器之间关系如图 2所示(图 2来源于文献1)。
这里写图片描述
图 2 Node、Pod、容器之间关系图
Pod有两种类型,普通的Pod和静态Pod,静态Pod存放在某个具体的Node上的一个具体文件中,且只在此Node上运行;普通的Pod一旦创建,就会被放入到etcd存储中,随后会被Master节点调度到某个具体的Node上进行绑定,然后被该Node上的kubelet进程实例化为一组相关的Docker容器并启动起来。
2) Service(Svc)
Svc就是一个“微服务”,Svc定义了一个服务的访问入口地址,前端应用(Pod)通过这个入口地址访问其背后的一组由Pod副本组成的集群实例。Service与其后端的Pod之间通过Label Selector实现“无缝对接”,Replication Controller(简称RC)的作用是通过满足要求的Pod副本数,保证Svc的服务能力和服务质量始终处于预期的标准。Svc、Pod、RC、Label Selector之间的关系如图 3所示(图 3来源于文献1)。
这里写图片描述
图 3 Svc、Pod、RC、Label Selector之间的关系
这里提出一个思考的问题,后端的多个Pod副本实例保证Svc的服务能力,为前端提供服务,前端是如何访问后端的多个Pod的?毫无疑问,是负载均衡,在第三章和第四章的内容里会详细讨论这部分内容。
3) 其它相关的关键概念
这里主要介绍如下几个关键概念,Label、RC、Deployment、HPA、Volume、Namespace和Annotation。
由图 3可知,Label Selector和RC是和Pod、Svc直接相关的两个概念,Label Selector选择的对象是Pod,依据的是Pod的Label,可以简单理解为我选了你,但我称呼你为小明是一个道理。
Deployment可以理解为RC的升级版,HPA解决的是Pod的自动化扩容问题,Volume为Pod里的容器提供逻辑卷。
此处还有一个Persistent Volume(简称PV)的概念,是Kubernetes里的网络存储,和Persistent Volume Claim(PVC)结合为Pod提供网络存储服务。类似于我们日常使用的NAS网络附加存储。
Namespace用于实现多租户的资源隔离。通过将集群内的资源对象“分配”到不同的Namespace,可以实现资源的逻辑分组,形成逻辑上分组的不同项目小组或用户组。
Annotation是用户任意定义的“附加”信息,便于外部工具查找。
2.4 管理工具
kubectl是Kubernetes的客户端CLI工具,让用户通过命令行方式对Kubernetes集群进行操作,在第三章和第四章中会经常使用该工具的一些命令,第六章会详细阐述kubectl的相关命令和参数用法。

未完待续


  1. 《Kubernetes权威指南》从Docker到Kubernetes实践全接触;
  2. https://blog.csdn.net/amery2011/article/details/78365453
  3. 《大话存储》冬瓜哥
  4. https://www.kubernetes.org.cn/2931.html
Logo

开源、云原生的融合云平台

更多推荐