API 对象
Kubernetes 中大部分的概念都可以被看做是一种资源对象,通过 kubectl 命令行工具就可以实现对这些资源对象执行增、删、改、查等操作并且保存在 Etcd 中进行持久化存储。Kubernetes 通过对比存储在 Etcd 库里面的“资源期望状态”和当前环境中的“实际资源状态”的差异来实现自动控制和自动纠错,努力使“实际资源状态”和“资源期望状态”保持一致。
API 对象是 Kubernetes 集群中的管理操作单元。一旦创建对象 Kubernetes 会持续工作来保证对象的存在。
在 Kubernetes 中,一个 API 对象在 Etcd 中的完整资源路径是由:Group(API 组)、Version(API 版本) 和 Resource(API 资源类型) 构成。如果想要查找更多关于 API 信息可以参考 kubernetes-api/v1.19。
在声明一个 Kubernetes 资源对象时需要注意一个关键属性:apiVersion。
每个 API 对象有 3 大类属性:
metadata:元数据。用来标识 API 对象,每个对象都至少有 3 个元数据:namespace、name 和 uid,还可以使用标签 labels 标识和匹配不同的对象。
spec:规范。描述用户期望集群中的分布式系统达到的理想状态。
status:状态。描述系统当前达到的状态。在任何时候,Kubernetes 会管理对象使它的实际状态和期望状态相一致。
Pod
Pod 是 Kubernetes 中最重要的核心概念,Kubernetes 中其它的对象都是在管理、暴露 Pod 或是被 Pod 使用。一个 Pod 是 Kubernetes 最基本的构建单元,也是最小、最简单的构建单元。Pod 也是扩缩容的基本单位,Kubernetes 的扩容和缩容都是直接对 Pod 进行操作的,直接增加 Pod 或是减少 Pod。
Label
Label(标签),一个 Label 是一个 key=value 的键值对,用户可以自定义 key 和 value。标签可以添加到各种资源对象上,标签和资源对象是多对多的关系。通过标签可以对资源对象进行多维度的管理,这样可以方便灵活的进行资源分配、调度、配置和部署等工作。
ReplicationController
ReplicationController(副本控制器,简写:RC),RC 是 Kubernetes 最开始用来保证集群中 Pod 高可用的资源对象。它通过启动或删除 Pod 来保证运行中的 Pod 数量跟要求一致。RC 只适用于长期运行的服务型应用,它已经被更加强大的 RS 取代。
ReplicaSet
ReplicaSet(副本集,简写:RS),RS 是 RC 的替代者,相比于 RC,它支持更多种的应用类型。RS 一般不单独使用,而是作为 Deployment 的期望状态来使用。
Deployment
Deployment(部署),用来描述应用的运行状态,包括运行多少个 Pod 副本,每个 Pod 里包含哪些容器,每个容器运行哪个镜像等。Deployment 创建完成之后,可以对其进行更新,比如修改镜像版本,扩容或缩减副本数量等。如果更新出现问题,还可以回滚到以前的版本。
Service
Service(服务),通过 Deployment 我们能够完成应用部署,但如何访问应用提供的服务呢?因为 Deployment 的 Pod 可能有多个,并且这些 Pod 所在的 Node 并不固定,因此没法使用固定的 IP 和端口去访问。Kubernetes 使用 Service 来解决此问题,一个 Service 对应一个应用,代表该应用提供的服务。每个 Service 有一个集群内部的虚拟 IP,客户端通过该 IP 来请求应用服务时,kube-proxy 会将请求转发给 Deployment 中的某个 Pod。当 Pod 位置发生变化时,kube-proxy 能够及时感知到。通过 kube-proxy 就解决了单个 Pod 服务的注册和发现问题,同时也实现了负载均衡。
Horizontal Pode Autoscaler
Horizontal Pode Autoscaler(Pod 横向自动扩容,简写:HPA),通过追逐分析指定 RS 控制的所有目标 Pod 的负载变化情况,来确定是否需要有针对性地调整目标 Pod 的副本数量,目前有两种方式来作为 Pod 负载的度量指标:CPUUtilizationPercentage(目标 Pod 所有副本自身的 CPU 利用率的平均值),和应用程序自定义的度量指标。
StatefulSet
StatefulSet(有状态服务集),有时候希望在所有 Node 上都运行某个 Pod,比如网络路由、存储、日志、监控等服务,这个时候就可以使用 DaemonSet。
Job
Job(任务),Deployment 代表的是长期运行的应用服务,而短暂运行的应用(比如定时任务)就要用 Job 来表示。Job 有开始和结束,可以使用一个或多个 Pod 来执行。在多个 Pod 上运行时,运行成功可以配置为是其中一个完成还是全部都完成。
Volume
Volume(存储卷),Volume 是存储的抽象,Kubernetes 中的存储卷跟 Docker 中的类似,只不过 Docker 中存储卷的作用范围是单个容器,而 Kubernetes 中是单个 Pod,被 Pod 中的多个容器共享。
Persistent Volume 和 Persistent Volume Claim
Persistent Volume(持久存储卷,简写:PV),Persistent Volume Claim(持久存储卷声明,简写:PVC),就像 Node 提供计算资源,PV 提供了存储资源。PV 是对底层存储服务的抽象,其实现方式可以是本地磁盘,也可以是网络磁盘。PVC 用来描述 Pod 对存储资源的需求,它需要绑定到某个 PV。PV 和 PVC 是一对一关系,而 PV 和 Pod 是多对多关系,单个 PV 可以被多个 Pod 共享,且单个 Pod 可以绑定多个 PV。
Namespace
Namespace(命名空间),命名空间为同一个 Kubernetes 集群里的资源对象提供了虚拟的隔离空间,避免了命名冲突,比如在同一个集群里同时部署测试环境和生产环境服务。Kubernetes 里默认提供了两个命名空间,分别是 default 和 kube-system,前者是资源对象默认所属的空间,后者是 Kubernetes 自身资源对象所属的空间。只有集群管理员能够创建新的命名空间。
Secret
Secret(密钥对象),Secret 对象用来存放密码、CA 证书等敏感信息,这些信息不适合直接用明文写在 Kubernetes 的对象配置文件里。Secret 对象可以由管理员预先创建好,然后在对象配置文件里通过名称来引用。这样可以降低敏感信息暴露的风险,也便于统一管理。
User Account 和 Service Account
User Account(用户帐号)和 Service Account(服务帐号),用户帐号为人提供身份标识,而服务帐号为 Kubernetes 集群中的 Pod 提供身份标识。用户帐号与命名空间无关,是跨命名空间的,而服务帐号属于某一个命名空间。
Role-based Access Control
Role-based Access Control(访问授权,简写:RBAC),使用 RBAC,用户不再直接跟权限进行关联,而是通过角色。角色代表的一组权限,用户可以具备一种或多种角色,从而具有这些角色所包含的权限。如果角色权限有调整,那么所有具有该角色的用户权限自然而然就随之改变。
Annotation
Annotation(注解),与 Label 类似,使用 Key/Value 键值对的形式进行定义,相较于 Label,它可以用来保存更大的键值对,并且可能包含可读性低的数据,目的是用来保存非辨认性目的的数据,特别是那些由工具和系统扩展操作的数据。主要是用于用户任意定义的附加信息,方便外部工具的查找。Annotation 的值无法用来进行有效地过滤。