在k8s系统中,kubernetes
对象是持久化的实体,kubernetes使用这些实体去表示 整个集群的状态,具体而言,他们描述了以下信息:
kubernetes
对象是一种 意向表达, 一旦创建该对象,kubernetes系统将不断工作,以确保该对象存在。
通过创建对象,本质上是在告诉k8s系统,我们想要的集群工作负载状态看起来应该是什么样子,这就是k8s集群所谓的期望状态(Desired State)
操作k8s对象(无论是创建、修改还是删除),都需要使用 kubernetes API
。比如,在使用kubectl
命令行(CLI)接口时,CLI会调用必要的kubernetes API
,也可以在程序中使用客户端库,来直接调用kubernetes API
对象规约(Spec)与状态(Status)
几乎每个k8s对象都包含两个嵌套的对象字段:对象规约 和 对象状态,他们负责管理对象的配置。
对于具有Spec
的对象,必须在创建对象时设置其内容,描述你希望对象所具有的特征,即 期望状态(Desired State)
Status
描述了对象的当前状态(Current State),他是由k8s系统和组件设置并更新的。在任何时刻,k8s控制平面都一直在积极地管理着对象的实际状态,以使之达成期望状态。
例如,Kubernetes 中的 Deployment 对象能够表示运行在集群中的应用。 当创建 Deployment 时,你可能会设置 Deployment 的 spec,指定该应用要有 3 个副本运行。 Kubernetes 系统读取 Deployment 的 spec, 并启动我们所期望的应用的 3 个实例 —— 更新状态以与规约相匹配。 如果这些实例中有的失败了(一种状态变更),Kubernetes 系统会通过执行修正操作来响应 spec 和 status 间的不一致 —— 意味着它会启动一个新的实例来替换
创建k8s对象时,必须提供对象的spec
,用来描述该对象的期望状态,以及关于对象的一些基本信息。当使用kubernetes API
(或者经由kubectl
)创建对象时,API请求必须在请求主体中包含JSON 格式的信息,大多数情况下,我们是通过 清单(Manifest)文件为kubectl
提供这些信息。按照惯例,清单是yaml
格式的,当然,也可以使用JSON格式。
像kubectl
这样的工具在通过HTTP进行API请求的时候,会将清单中的信息转换为JSON 或者其他受支持的 序列化格式
这里有一个清单示例文件,展示了 kubernetes Deployment
的必须字段
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # 告知 Deployment 运行 2 个与该模板匹配的 Pod
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
与上面使用 清单 的方式创建 deployment一致,另一种方式是使用kubectl
命令行接口(CLI)的kubectl apply
命令,将 .yaml
文件作为参数。具体如下所示:
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
输出类似下面这样:
deployment.apps/nginx-deployment created
必需字段
在想要创建的kubernetes
对象所对应的清单(yaml文件或JSON文件)中,需要配置的字段如下:
apiVersion
kind
metadata
name
字符串、UID
和可选的namespace
spec
从k8s v1.25
开始,API 服务器提供了服务器端字段验证,可以检测对象中未被识别或重复的字段。他在服务器端提供了kubectl --validate
的所有功能
kubectl
工具使用--validate
标志来设置字段验证级别。可以接受的值为:ignore warn strict
,同时还接受值 true(等同于strict)
和 false(等同于ignore)
kubectl
的默认验证设置为--validate=true
strict
warn
ignore
当 kubectl 无法连接到支持字段验证的 API 服务器时,它将回退为使用客户端验证。 Kubernetes 1.27 及更高版本始终提供字段验证;较早的 Kubernetes 版本可能没有此功能