为了使读者快速了解Kubernetes,本章将介绍什么是Kubernetes,以及Kubernetes的基本概念。
本章涉及的知识点有:
Kubernetes是容器技术快速发展的产物。Kubernetes的出现使得大规模的服务器运维变得便捷、简单起来。本节先从最简单的概念开始,向读者顺序渐进地介绍Kubernetes。
简单地讲,Kubernetes是一套自动化容器运维的开源平台,这些运维操作包括部署、调度和节点集群间扩展。对比Docker技术来看,可以将Docker看作是Kubernetes内部使用的低级别的组件,而Kubernetes则是管理Docker容器的工具。如果把Docker容器比作是飞机,则Kubernetes可比作是飞机场。
早在十年前,Google就开始大规模地使用容器技术。据说,Google的数据中心运行着20多亿个容器。管理好如此数量庞大的容器是一件非常困难的事情。因此,Google开发了一套叫作Borg的系统来对容器进行调度和管理。
在经过多年的实践、经验积累和改进之后,Google重新编写了这套容器管理系统,并且将其贡献给开源社区,这就是Kubernetes的来源。Kubernetes一经开源就一鸣惊人,并迅速在容器技术领域称霸。
在刚开源的前两年,Kubernetes只有五个主要版本。从2017年起,它相继推出了1.6、1.7、1.8、1.9,围绕稳定性以及性能做了改进。而在2018年,Kubernetes更进一步,又进行了4次重大更新,在企业最关注的安全性和可扩展性上做了显著改善。
2018年3月27日,Kubernetes v1.10发布。此版本持续增强了Kubernetes的成熟性、可扩展性以及可插拔性,并在存储、安全、网络增强了其稳定性。
2018年6月28日,Kubernetes v1.11发布。此版本增强了网络功能、可扩展性与灵活性。Kubernetes v1.11功能的更新为任何基础架构、云或内部部署都能嵌入到Kubernetes系统中增添了更多可能性。
2018年9月28日,Kubernetes v1.12发布。此版本新增了两个备受期待的功能,Kubelet TLS Bootstrap和对Azure虚拟机规模集支持(并已达到GA阶段)。同时,该版本在安全性和Azure等关键功能上做出了改进。
2018年12月4日,Kubernetes v1.13发布。此版本是迄今为止发布时间最短的版本之一。此版本中的显著特征包括:kubeadm简化集群管理、Container Storage Interface(CSI)、CoreDNS为默认DNS。这三个主要特性在这个版本中已逐渐过渡到GA。
截至2020年12月,Kubernetes发布了v1.20.0。
Kubernetes所处的时间点是传统和现代软件开发日益高流量的交叉点。根据CNCF统计数据,2018年,云原生技术增长了200%,全球有近三分之一的企业正在运营多达50个容器,运营50~249个容器的企业占比也超过25%,有超过80%的受访者把Kubernetes作为容器管理的首选。
Kubernetes作为当前唯一被业界广泛认可和看好的Docker分布式系统解决方案,可以预见,在未来几年内,会有大量的新系统选择它。容器化技术已经成为计算模型演化的一个开端,Kubernetes作为容器开端的Docker容器集群管理技术,在这场新的技术革命中扮演着重要的角色,并具有不可预估的发展前景和商业价值。
Kubernetes是一个自动化部署、伸缩和操作应用程序容器的开源平台。使用Kubernetes可以快速、高效地满足用户的以下需求:
Kubernetes具有以下明显的优势:
为什么我们需要Kubernetes,它能做什么?
至少,Kubernetes能在实体机或虚拟机集群上调度和运行程序容器。而且,Kubernetes也能让开发者斩断联系着实体机或虚拟机的“锁链”,从以主机为中心的架构,跃至以容器为中心的架构。该架构最终提供给开发者诸多内在的优势和便利。Kubernetes提供给基础架构以真正的以容器为中心的开发环境。
Kubernetes满足了一系列产品内运行程序的共同需求,诸如:
了解和掌握Kubernetes中的重要概念是非常重要的。只有深入理解Kubernetes的基本概念,才能掌握各个组件的功能,从而能够熟练地部署和维护Kubernetes。本节将对Kubernetes中的重要概念进行介绍。
在Kubernetes中,Cluster是计算、存储和网络资源的集合。Kubernetes利用这些基础资源来运行各种应用程序。因此,Cluster是整个Kubernetes容器集群的基础环境。
Master是指集群的控制节点。在每个Kubernetes集群中,都至少有一个Master节点来负责整个集群的管理和控制。几乎所有的集群控制命令,都是在Master上面执行的。因此,Master是整个集群的大脑。正因为Master如此重要,所以为了实现高可用性,用户可以部署多个Master节点。Master节点可以是物理机,也可以是虚拟机。
关于Master上运行的关键进程,下面进行逐个说明。
Kubernetes API Server的进程名为kube-apiserver。Kubernetes API Server提供了Kubernetes各类资源对象的增、删、改、查的HTTP Rest接口,是整个系统的数据总线和数据中心。Kubernetes API Server提供了集群管理的REST API接口,包括认证授权、数据校验以及集群状态变更,提供了其他模块之间的数据交互和通信的枢纽,是资源配额控制的入口,拥有完备的集群安全机制。
Controller Manager作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源配额(ResourceQuota)的管理。当某个Node意外宕机时,Controller Manager会及时发现,并执行自动化修复流程,确保集群始终处于预期的工作状态。
Kubernetes Scheduler的作用是根据特定的调度算法Pod调度到指定的工作节点(Node)上,这一过程也叫绑定(Bind)。Scheduler的输入为需要调度的Pod和可以被调度的节点(Node)的信息,输出为调度算法选择的Node,并将该Pod绑定到这个Node。
Etcd是Kubernetes集群中的一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息。
在Kubernetes中,除了Master节点之外,其他的节点都称为Node。与Master节点不同,Node才是Kubernetes中的承担主要计算功能的工作节点。Node可以是一台物理机,也可以是一台虚拟机。
整个Kubernetes集群中的Node协同工作,Master会根据实际情况将某些负载分配给各个Node。当某个Node出现故障时,其他的Node会替代其功能。
Node节点将运行以下主要进程:
在Kubernetes集群中,每个Node节点都会启动kubelet进程,用来处理Master节点下发到本节点的任务,管理Pod和其中的容器。Kubelet会在API Server上注册节点信息,定期向Master汇报节点资源使用情况,并通过cAdvisor监控容器和节点资源。可以把Kubelet理解成是一个代理进程,是Node上的Pod管家。
kube-proxy运行在所有Node节点上,它监听每个节点上Kubernetes API中定义的服务变化情况,创建路由规则来进行服务负载均衡。
该Docker引擎指Docker CE服务引擎,负责容器的创建和管理等工作。
Pod是Kubernetes最基本的操作单元,一个Pod中可以包含一个或多个紧密相关的容器,一个Pod可以被一个容器化的环境看作应用层的逻辑宿主机。一个Pod中的多个容器应用通常是紧密耦合的,Pod在Node上被创建、启动或者销毁。每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此它们之间通信和数据交换更为高效。在设计时我们可以充分利用这一特性,将一组密切相关的服务进程放入同一个Pod中。
同一个Pod里的容器之间仅需通过localhost就能互相通信。同一个Pod里面的业务容器共享Pause容器的IP地址,共享Pause容器挂载的存储卷。
Pod是Kubernetes调度的基本工作单元,Master节点会以Pod为单位,将其调度到Node节点上面。Pod的基本组成如图1-1所示。

图1-1 Pod的基本组成
在Kubernetes的集群中,虽然每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失。这就引出一个问题,如果有一组Pod组成一个集群来提供服务,那么如何来访问它呢?那就是通过服务。
一个服务可以看作一组提供相同服务的Pod的对外访问接口,服务作用于哪些Pod是通过标签选择器来定义的。服务通常拥有以下特点:
如果服务要提供外网服务,则需指定公共IP和Node端口,或外部负载均衡器。
默认情况下,容器的数据都是非持久化的,在容器消亡以后数据也跟着丢失,所以Docker提供了卷机制以便将数据持久化存储。类似地,Kubernetes提供了更强大的卷机制和丰富的插件,解决了容器数据持久化和容器间共享数据的问题。
与Docker不同,Kubernetes卷的生命周期与Pod绑定。容器宕掉后Kubelet再次重启容器时,卷的数据依然还在,而Pod删除时,卷才会清理。数据是否丢失取决于具体的卷类型,比如emptyDir类型的卷实际上是一个临时空目录,为Pod内多用户同享一个目录。与Pod的生命周期一致,Pod创建时创建,删除时删除。持久化存储卷为独立于计算资源的一种实体存储资源,不属于任何一个Node。因此,在Pod被删除时,不会丢失数据,除非人工将其删除。
命名空间是Kubernetes系统中的另一个重要的概念,通过将系统内部的对象分配到不同的命名空间中,形成逻辑上的不同项目、小组或用户组,从而使得在共享使用整个集群的资源的同时还能被分别管理。
Kubernetes集群在启动后,会创建一个名为default的默认的命名空间,如果不特别指明命名空间,则用户创建的Pod、RC、服务都被系统创建到默认的命名空间中。
当团队或项目中具有许多用户时,可以考虑使用命名空间来区分。在未来的Kubernetes版本中,默认情况下,相同命名空间中的对象将具有相同的访问控制策略。