Kubernetes是什么?
Kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。Kubernetes是Google开源的一个容器编排引擎,同时也是一个开源的容器集群管理系统,可以实现容器应用的自动化部署、自动扩缩容、监控和维护等功能。
一、Kubernetes架构
Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统。Kubernetes的目标旨在消除编排物理/虚拟计算、网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心的原理上进行自助运营。
Kubernetes具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和在线扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。
Borg是谷歌内部的大规模集群管理系统,负责对谷歌内部很多核心服务的调度和管理。Borg的目的是让用户能够不必操心资源管理的问题,从而更专注于自己的核心业务。Borg甚至能做到跨多个数据中心的资源利用率最大化。
Kubernetes属于主从分布式架构,主要由Master和Node组成,以及包括客户端命令行工具kubectl和其它附加项。
Master:作为控制节点,对集群进行调度管理;由kube-apiserver、kube-scheduler、kube-controller-manager和etcd组成。
Node:作为工作节点,运行业务应用的容器;由kubelet、kube-proxy和docker(或者rocket)组成。
二、Kubernetes组件
Master指的是集群控制节点,每个Kubernetes集群里需要有至少一个Master来负责集群的管理和控制。Master可以是一台物理机,也可以是一台虚拟机,Master节点上运行着以下组件:
kube-apiserver:提供了HTTP Rest接口的关键服务进程,是集群里所有资源的增、删、改、查等操作的唯一入口,也是集群的控制入口。
kube-controller-manager:运行管理控制器,是集群中处理常规任务的后台进程,每个Controller都负责一种具体的控制流程,而Controller Manager就是这些Controller的核心管理者。
kube-scheduler:负责资源调度(Pod调度)的进程,为新创建的Pod选择一个Node节点。
etcd:是kubernetes默认的存储系统,集群里所有资源对象的数据全部保存在etcd中。
Node指的是集群的工作节点,和Master一样,可以是一台物理主机,也可以是一台虚拟机。每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上去。Node上运行的组件如下:
kubelet:负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。
kube-proxy:实现Kubernetes Service的通信与负载均衡机制的重要组件。
docker:容器引擎,负责本机的容器创建和管理工作。
三、Kubernetes对象
- Pod
Pod是Kubernetes集群创建或部署的最基本、最小的单位,每个Pod里运行着一个或多个容器,每个Pod里都有一个特殊的被称为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume(存储卷)。Kubernetes为每个Pod都分配了唯一的IP地址,称为Pod IP,一个Pod里的所有容器共享这一个Pod IP。 - Service
Service定义了这样一种抽象:一个Pod的逻辑分组,一种可以访问它们的策略。Service通常被称为微服务,定义了一个服务的访问入口地址,前端的应用(Pod)通过这个入口访问其背后的一组由Pod副本组成的集群实例,Service与其后端Pod副本集群之间通过Label Selector来实现通信。 - Label
标签,一个Label就是一个key=value的键值对,由用户自己指定。Label可以附加到各种资源对象上,例如Pod、Service等,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。 - Volume
存储卷,与Docker的Volume比较类似,不同的是,Kubernetes中的Volume定义在Pod上,这个Pod里的所有容器都可以将其挂载到具体的文件目录下,实现容器间的资源共享。 - Persistent Volume
网络存储卷,与Volume不同的是,它是在Node之间共享资源,每个Node都可以挂载使用。Pod可通过定义一个PersistentVolumeClaim(PVC)对象,来使用Persistent Volume资源。 - Name
Kubernetes REST API中的所有对象都用Name和UID来明确地标识。Name在一个对象中同一时间只能拥有一个Name,如果对象被删除,也可以使用相同的Name创建新的对象,Name用于在资源引用URL中的对象。 - Namespace
命名空间,很多情况下用于实现多租户的资源隔离。Namespace通过将集群内部的资源对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。 - Horizontal Pod Autoscaling
简称HPA,是Kubernetes中实现Pod水平自动伸缩的功能。对于Pod集群来说,HPA可以实现很多自动化功能,当Pod中业务负载上升的时候,可以创建新的Pod来保证业务系统稳定运行;当Pod中业务负载下降的时候,可以销毁Pod来提高资源利用率。 - Annotation
注解,与Label类似,使用key/value键值对的形式进行定义。Annotation是用户任意定义的“附加”信息,以便于外部工具进行查找。很多时候,Kubernetes的模块自身会通过Annotation的方式标记资源对象的一些特殊信息。 - ReplicaSet
ReplicaSet(RS)是Replication Controller(RC)的升级版本,确保运行指定数量的Pod。RC与RS的唯一区别就是对Lable Selector的支持不同,RS支持新的基于集合的标签,RC仅支持基于等式的标签。
当我们定义了一个RS并提交到Kubernetes集群中,Master节点上的Controller Manager组件就得到通知,定期巡检系统中当前存活的目标Pod,并确保目标Pod实例的数量刚好等于此RS的期望值,如果有过多的Pod副本在运行,系统就会停掉多余的Pod;如果小于RS的期望值,系统就会自动创建一些新的Pod,使其目标Pod实例的数量等于RS的期望值。 - Deployment
Deployment为Pod和ReplicaSet提供声明式更新,通过它来管理Pod和ReplicaSet。当我们要部署一个Pod时,需要创建、调度、绑定节点和启动容器这一完整过程,而Deployment就是负责这一整个部署过程的。Deployment的典型使用场景有以下几个: 创建一个Deployment对象来生成对应的ReplicaSet,并完成Pod副本的创建过程。 检查Deployment的状态来查看部署工作是否完成(Pod副本的数量是否达到预期的值)。 更新Deployment以创建新的Pod(比如镜像升级)。 如果当前Deployment不稳定,则回滚到一个早先的Deployment版本。 挂起或者恢复一个Deployment。
- StatefulSet
StatefulSet为Pod提供唯一标识,实现有序的部署、删除和扩展。Deployment用于部署无状态服务,StatefulSet用来部署有状态服务。StatefulSet的使用场景如下: 稳定性,唯一的网络标识。 稳定性,持久化存储。 有序的部署和扩展。 有序的删除和终止。 有序的自动滚动更新。
- DaemonSet
DaemonSet能够让所有(或者特定)的Node节点运行同一个Pod。当节点加入到Kubernetes集群中,Pod会被DaemonSet调度到该节点上运行,当节点从集群中移除时,被DaemonSet调度到该节点上的Pod也会被移除。如果删除DaemonSet,与DaemonSet相关的Pod都会被删除。 - Job
仅执行一次的任务,任务执行完成后Pod销毁,可批量处理一次性任务。还可以让任务定时运行。
四、总结
上述这些组件都是Kubernetes系统的核心组件,它们共同构成了Kubernetes系统的框架和计算模型。通过对它们进行灵活组合,用户就可以快速、方便地对容器集群进行配置、创建和管理。除了本文所介绍的核心组件,Kubernetes中还有许多辅助配置的资源对象,例如LimitRange、ResourceQuota等。另外,还有一些系统内部使用的对象,例如Binding、Event等可参考官方API文档。
说在最后
本人也是刚接触Kubernetes(K8s),本文内容是摘自相关书籍和网上的相关资料,并结合自己的理解所写的,如有理解错误的地方还请大家不吝指出,共同进步。
由于国内关于Kubernetes的学习资料很少,51cto上倒是有相关的订阅专栏,但都是要钱的,对于这个我不做评论。这里向跟我一样的初学者推荐一本书《Kubernetes权威指南(第2版)》,网上可以下载到PDF版本,虽然这本书讲的Kubernetes的版本是1.3的,版本比较老,但对于初学者可以学习它的理论知识,并结合网上新版本的相关资料自行理解,也是一种非常不错的学习方法。
对Kubernetes(K8s)有兴趣的朋友,可以关注我的博客,后面我会继续发表学习Kubernetes的博文,欢迎各位朋友和我一起踏上Kubernetes(K8s)的旅程。
原文地址:http://blog.51cto.com/andyxu/2308937