声明:这是我在大学毕业后进入第一家互联网公司学习的内容
在 Kubernetes 系统中,Kubernetes 对象 是持久化的实体。Kubernetes 使用这些实体去表示整个集群的状态。特别地,它们描述了如下信息:
哪些容器化应用在运行(以及在哪个 Node 上)
可以被应用使用的资源
关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略
Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,本质上是在告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的 期望状态(Desired State)。
操作 Kubernetes 对象 —— 无论是创建、修改,或者删除 —— 需要使用 Kubernetes API。比如,当使用 kubectl 命令行接口时,CLI 会执行必要的 Kubernetes API 调用,也可以在程序中使用客户端库直接调用 Kubernetes API。
每个 Kubernetes 对象包含两个嵌套的对象字段,它们负责管理对象的配置:对象 spec 和 对象 status 。 spec 是必需的,它描述了对象的期望状态(Desired State) —— 希望对象所具有的特征。 status 描述了对象的 实际状态(Actual State) ,它是由 Kubernetes 系统提供和更新的。在任何时刻,Kubernetes 控制面一直努力地管理着对象的实际状态以与期望状态相匹配。
例如,Kubernetes Deployment 对象能够表示运行在集群中的应用。 当创建 Deployment 时,可能需要设置 Deployment 的规约,以指定该应用需要有 3 个副本在运行。 Kubernetes 系统读取 Deployment 规约,并启动我们所期望的该应用的 3 个实例 —— 更新状态以与规约相匹配。 如果那些实例中有失败的(一种状态变更),Kubernetes 系统通过修正来响应规约和状态之间的不一致 —— 这种情况,会启动一个新的实例来替换。
当创建 Kubernetes 对象时,必须提供对象的规约,用来描述该对象的期望状态,以及关于对象的一些基本信息(例如名称)。 当使用 Kubernetes API 创建对象时(或者直接创建,或者基于kubectl),API 请求必须在请求体中包含 JSON 格式的信息。 大多数情况下,需要在 .yaml 文件中为 kubectl 提供这些信息。 kubectl 在发起 API 请求时,将这些信息转换成 JSON 格式。
这里有一个 nginx.yaml 示例文件,展示了 Kubernetes Deployment 的必需字段和对象规约:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
使用类似于上面的 .yaml 文件来创建 Deployment,一种方式是使用 kubectl 命令行接口(CLI)中的 kubectl apply 命令, 将 .yaml 文件作为参数。下面是一个示例:
kubectl apply -f nginx.yaml --record
输出:
deployment.apps/nginx-deployment created
在想要创建的 Kubernetes 对象对应的 .yaml 文件中,需要配置如下的字段:
您也需要提供对象的 spec 字段。对象 spec 的精确格式对每个 Kubernetes 对象来说是不同的,包含了特定于该对象的嵌套字段。Kubernetes API 参考能够帮助我们找到任何我们想创建的对象的 spec 格式。 例如,可以从 这里 查看 Pod 的 spec 格式, 并且可以从 这里 查看 Deployment 的 spec 格式。
REST API是Kubernetes的基础架构。组件之间的所有操作和通信,以及外部用户命令都是API Server处理的REST API调用。因此,Kubernetes平台中的所有内容都被视为API对象,并且在API中具有相应的条目 。
大多数操作可以通过 kubectl命令行界面或其他命令行工具(例如kubeadm)执行,而后者又使用API。但是,您也可以使用REST调用直接访问API。
如果要使用Kubernetes API编写应用程序,请考虑使用一种客户端库。
Kubernetes API是通过HTTP提供的基于资源的(RESTful)编程接口。它支持通过标准HTTP动词(POST,PUT,PATCH,DELETE,GET)检索,创建,更新和删除主要资源,包括许多对象的附加子资源,这些对象允许进行细粒度的授权(例如将Pod绑定到节点) ,并且可以方便或有效地接受并以不同的表示形式提供这些资源。它还支持通过“监视”和一致的列表对资源进行有效的更改通知,以允许其他组件有效地缓存和同步资源状态。
大多数Kubernetes API资源类型都是对象:它们代表集群上某个概念的具体实例,例如pod或名称空间。API资源类型的一个较小数目是“虚拟” -它们通常代表操作,而不是物体,如权限检查(使用POST用的JSON编码体SubjectAccessReview到subjectaccessreviews资源)。所有对象都将具有唯一名称,以允许进行幂等的创建和检索,但是如果虚拟资源类型不可检索或不依赖幂等,则它们可能没有唯一的名称。
这是Kubernetes API提供的基本资源类型及其主要功能的高级概述。
工作负载是用于在集群上管理和运行容器的对象。
发现和LB资源是用于将工作负载“缝合”到外部可访问的负载平衡服务中的对象。
配置和存储资源是用于将初始化数据注入到应用程序中并持久化容器外部数据的对象。
群集资源对象定义了群集本身的配置方式。这些通常仅由集群运营商使用。
元数据资源是用于配置集群中其他资源行为(例如HorizontalPodAutoscaler扩展工作负载)的对象。
资源对象通常具有3个组成部分:
大多数资源提供以下操作:
创建操作将在存储后端中创建资源。创建资源后,系统将应用所需的状态。
更新有2种形式:Replace(替换)和补丁
注意:替换资源对象可能不会立即导致更改传播到下游对象。例如,替换a ConfigMap或Secretresource不会导致所有Pod都看到更改,除非Pod重新带外重启。
读分为3种形式:Get、 List 、 Watch
删除将删除资源。根据特定的资源,子对象可能会也可能不会被服务器垃圾回收。有关详细信息,请参见有关特定资源对象的注释。
资源可以定义特定于该资源类型的其他操作。
Kubernetes API是系统描述性配置的基础。 Kubectl 命令行工具被用于创建、更新、删除、获取API对象。
Kubernetes 通过API资源存储自己序列化状态(现在存储在etcd)。
Kubernetes 被分成多个组件,各部分通过API相互交互。
Kubernetes 对象一般由3个部分组成(Resource ObjectMeta、ResourceSpec、ResourceStatus)
而操作 Kubernetes 对象 —— 无论是创建、修改,或者删除都要使用 Kubernetes API。
从下章开始,我具体讲解各个 Kubernetes 对象的实体化。
API参考
Kubernetes API概念