Kubernets的基本概念和术语
考虑到kubernets相关概念和术语非常多,它们之间的关系也比较复杂,本节将由浅入深地讲解Kubernetes的一些基本概念和术语,对它们更详细的原理和应用说明参见后续章节的内容。
资源对象概述
Kubernetes中的基本概念和术语大多是围绕资源对象(Resource Object)来说的,而资源对象在总体上可分为一下两类。
(1)某种资源的对象,例如节点(Node)、Pod、服务(Service)、存储卷(Volume)。
(2)与资源对象相关的事物与动作,例如标签(Label)、注解(Annotation)、命令空间(Namespace)、部署(Deployment)、HPA、PVC。
资源对象一般包括几个通用属性:版本、类别(Kind)、名称、标签、注解、如下所述。
(1)在版本信息里包括了此对象所属的资源组,一些资源对象的属性会随着版本的升级而变化,在定义资源对象时要特别注意这一点。
(2)类别属性用于定义资源对象的类型。
(3)资源对象的名称(Name)、标签、注解这三个属性属于资源对象的元数据(metadata)。
- 资源对象的名称要唯一
- 资源对象的标签是很重要的数据,也是Kubernetes的一大设计特性,比如通过标签来表明资源对象的特征、类别,以及通过标签筛选不同的资源对象并实现对象之间的关联、控制或协作的功能。
- 注解可被理解为一种特殊的标签,不过更多地是与程序挂钩,通常用于实现资源对象属性的自定义扩展。
我们可以采用YAML或JSON格式声明(定义或创建)一个Kubernetes资源对象,每个资源对象都有自己的特定结构定义(可以理解为数据库中一个特定的表),并且统一保存在etcd这种非关系型数据库中,以实现最快的读写速度。此外,所有资源对象都可以通过Kubernetes提供的kubectl工具(或者API编程调用)执行增、删、改、查等操作。
一些资源对象有自己的声明周期及相应的状态,比如Pod,我们通过 kubectl 客户端工具创建一个 Pod 并将其提交到系统中后,它就处于等待调度的状态,调度成功后为pending状态,等待容器镜像下载和启动、启动成功后为Running状态,调度成功后为Pending状态,非正常停止后为Failed状态。同样,PV也是具有明确生命周期和资源对象。对于这类资源对象,我们还需要了解其生命周期的细节及状态变更的原因,这有助于我们快速排查故障。
另外,我们在学习时需要注意与资源对象相关的其他资源对象或者事务,把握它们之间的关系,同时思考为什么会有这种资源对象产生,哪些是核心的资源对象,哪些是外围的资源对象。由于Kubernetes的快速发展,新的资源对象不断出现,一些旧的资源对象也被遗弃,这也是我们要与时俱进的原因。
为了更好地理解和学习Kubernetes的基本概念和术语,特别是数量众多的资源对象,这里按照功能或用途对其进行分类,将其分为集群类、应用类、存储类及安全类这四大类,在接下来的小节中一一讲解。
集群类
集群(Cluster)表示一个由Master和Node组成的Kubernetes集群。
1. Master
Master指的是集群的控制节点。在每个Kubernetes集群中都需要有一个或一组被称为Master的节点,来负责整个集群的管理和控制。Master通常占据一个独立的服务器(在高可用部署中建议至少使用 3 台服务器),是整个集群的 ”大脑“,如果它发生宕机或者不可用,那么对集群内容器应用的管理都将无法实施。
在Master上运行着以下关键进程。
- Kubernetes API Server(kube-apiserver):提供HTTP RESTful API 接口的主要服务,是Kubernetes里对所有资源进行增、删、改、查等操作的唯一入口,也是集群控制的入口进程。
- Kubernetes Controller Manager (kube-controller-manager):Kubernetes里所有资源对象的自动化控制中心,可以将其理解为资源对象的“大总管”。
- Kubernetes Scheduler(kube-scheduler):负责资源调度(Pod调度)的进程,相当于公交公司的调度室。
另外,在Master上通常还需要部署 etcd 服务。
2. Node
Kubernetes 集群中除Mater外的其他服务器被称为Node,Node在较早的版本中也被称为Minion。与Master一样,Mode可以是一台物理主机,也可以是一台虚拟机。Node 是 Kubernetes 集群中的工作负载节点,每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,其上的工作负载会被Master自动转移到其他Node上。在每个Node上都运行着以下关键进程。
- kubelet:负责Pod对应容器的创建、启停等任务,同时与Master密切协作,实现集群管理的基本功能。
- kube-proxy:实现Kubernetes Service 的通信与负载均衡机制的服务。
- 容器运行时(如Docker):负责本机的容器创建和管理。
Node可以在运行期间动态增加到Kubernetes集群中,前提是在这个Node上已正确安装、配置和启动了上述关键进程。在默认情况下,kubelet会向Master注册自己,这也是Kubernetes推荐的Node管理方式。一旦Node被纳入集群管理范畴,kubelet进程就会定时向Master汇报自身的情报,例如操作系统、主机CPU和内存使用情况,以及当前有哪些资源调度策略。而某个Node在超过指定时间不上报信息时,会被Master判定为“失联”,该Node的状态就被标记为不可用(Not Ready),Master随后会触发“工作负载大转移”的自动流程。
我们可以运行以下命令查看在集群中有多少个Node:
kubectl get nodes
结果:
| NAME | STATUS | ROLES | AGE | VERSION |
|---|---|---|---|---|
| k8s-node-1 | Ready | 350d | v1.14.0 |
然后通过 kubectl describe node <node_name> 命令查看某个Node的详细信息:
kubectl describe node k8s-node-1
在以上命令的运行结果中会展示目标Node的如下关键信息。
- Node的基本信息:名称、标签、创建时间等。
- Node当前的运行状态:Node启动后会做一系列自检工作,比如磁盘空间是否不足(DiskPressure)、内存是否不足(MemoryPressure)、网络是否正常(NetwrokUnavailable)、PID资源是否充足(PIDPressure)。在一切正常时才设置Node为Ready状态(Ready=True),表示Node处于健康状态,Master就可以在其上调度新的任务了(如启动Pod)。
- Node的主机地址与主机名
- Node上的资源数量:描述Node可用的系统资源,包括CPU、内存数量、最大可调度Pod数量等。
- Node可分配的资源量:描述Node当前可用于分配的资源量。
- 主机系统信息:包括主机ID、系统UUID、Linux Kernel 版本号、操作系统类型与版本、Docker版本号、kubelet与kube-proxy的版本号等。
- 当前运行的Pod列表概要信息
- 已分配的资源使用概要信息,例如资源申请的最小、最大允许使用量占系统总量的百分比
- Node相关的Event信息
如果一个Node存在问题,比如存在安全隐患、硬件资源不足要升级或者计划淘汰,我们就可以给这个Node打一种特殊的标签–污点(Taint),避免新的容器被调度到该Node上。而如果某些Pod可以(短期)容忍(Toleration)某种污点的存在,则可以继续将其调度到该Node上。Taint与Toleration这两个术语术语Kubernetes调度相关的重要术语和概念,在后续章节中会详细讲解。
在集群类里还有一个重要的基础概念–命名空间,它在很多情况下用于实现多租户的资源隔离,典型的一种思路就是给每个租户都分配一个命名空间。命名空间属于Kubernetes集群范畴的资源对象,在一个集群里可以创建多个命名空间,每个命名空间都是相互独立存在,属于不同命名空间的资源对象从逻辑上相互隔离。在每个Kubernetes集群安装完成且正常运行之后,Master会自动创建两个命名空间,一个是默认的(default)、一个是系统的(kube-system)。用户创建的资源对象如果没有指定命名空间,则被默认存放在default命名空间中;而系统相关的资源对象如网络组件、DNS组件、监控类组件等,都被安装在kube-system空间中。我们可以通过命名空间将集群内部的资源对象“分配”到不同的命名空间中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时能被分别管理。当给每个租户都创建一个命名空间来实现多租户的资源隔离时,还能结合Kubernetes的资源配额管理,限定不同租户能占用的资源,例如CPU使用量、内存使用量等。
命名空间的定义很简单,如下所示的YAML文件定义了名为development的命名空间:
development.yaml
apiVersion: v1
kind: Namespace
metadata:
name: development
执行创建命令
kubectl create -f development.yaml
一旦创建了命名空间,我们在创建资源对象时就可以指定这个资源对象属于哪个命名空间。比如在线面的例子中定义了一个名为busybox的Pod,并将其放入 development 这个命名空间中:
busybox.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: development
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
name: busybox
执行创建命令:
kubectl create -f busybox.yaml
此时使用kubectl get 命令查看,将无法显示:
kubectl get pods
| NAME | READY | STATUS | RESTARTS | AGE |
|---|---|---|---|---|
这是因为如果不加参数,则 kubectl get 命令将仅显示属于 default 命名空间的资源对象。
可以在 kubectl get 命令中加入 --namespace 参数来操作某个命名空间中的对象:
kubectl get pods --namespace=development
| NAME | READY | STATUS | RESTARTS | AGE |
|---|---|---|---|---|
| busybox | 1/1 | Running | 0 | 1m |
2092

被折叠的 条评论
为什么被折叠?



