kubernetes资源对象集群类
阿里云国际版折扣https://www.yundadi.com |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
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 Serverkube-apiserver提供HTTP RESTful API 接口的主要服务是Kubernetes里对所有资源进行增、删、改、查等操作的唯一入口也是集群控制的入口进程。
- Kubernetes Controller Manager kube-controller-managerKubernetes里所有资源对象的自动化控制中心可以将其理解为资源对象的“大总管”。
- Kubernetes Schedulerkube-scheduler负责资源调度Pod调度的进程相当于公交公司的调度室。
另外在Master上通常还需要部署 etcd 服务。
2. Node
Kubernetes 集群中除Mater外的其他服务器被称为NodeNode在较早的版本中也被称为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 ReadyMaster随后会触发“工作负载大转移”的自动流程。
我们可以运行以下命令查看在集群中有多少个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 |