K8s对象是什么?
K8s对象是K8s系统中的持久实体,用来表示集群的状态。
K8s对象是“意图的记录”——创建对象后K8s会不断工作以保证该对象存在。通过创建K8s对象,K8s可以明白你希望集群怎么样运作。
对象的规范(spec)和状态(status)
几乎所有K8s对象都包含两个嵌套的对象字段,用于管理对象的配置: spec
、status
。
spec
是一个规范,在创建对象的时候我们需要设置它,用来描述我们希望它是一个什么状态(即希望资源具有的特征的描述)。
status
描述对象的当前状态,这个状态由K8s系统及其部件供给和更新。K8s的控制平面control plane
持续积极管理每个对象的实际状态status
,将它匹配所需的状态spec
。
举个例子:在K8s中,一个部署Deployment
是一个对象,代表运行在集群上的应用程序。创建部署Deployment
的时候,可以将spec
设置为指定要运行应用程序的三个副本。Kubernetes 系统读取部署规范Deployment spec
并启动所需应用程序的三个实例——更新状态 status
以匹配您的规范spec
。如果这些实例中的任何一个失败(状态更改),Kubernetes 系统会通过进行更正来响应规范和状态之间的差异——在这种情况下,启动一个替换实例。
创建K8s对象
上面提到创建K8s对象时,必须描述对象所需的对象规范spec
,除此以外还要有该对象的一些基本信息(例如名称)。使用K8s API创建对象时(直接创建或通过kubectl),API请求中必须包含前面所说的需要的信息,将信息作为JSON包含在请求中。大多数情况下,我们将在.yaml文件中向kubectl提供信息。kubectl在发出请求时将信息转换为JSON。
示例.yaml
文件(包含所需字段和对象规范):
apiVersion: apps/v1
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
必填字段:
-
apiVersion
-使用哪个版本的K8s API创建此对象 -
kind
-创建哪个类型的对象 -
metadata
-能唯一标识对象的数据,包括name
字符串UID
、和可选namespace
-
spec
-规范,即你希望对象应有的状态
在.yaml
文件中填好以上内容后,可以通过在kubectl
命令行界面中使用kubectl apply
命令,将.yaml
文件作为参数传递。
例如:
kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record
其中https://k8s.io/examples/application/deployment.yaml
是.yaml
所在的位置。
输出类似于:
deployment.apps/nginx-deployment created