kubernetes 对象的 yaml 描述语法说明
环境信息
- Centos7 5.4.212-1
- Docker 20.10.18
- containerd.io-1.6.8
- kubectl-1.25.0
- kubeadm-1.25.0
- kubelet-1.25.0
几乎所有的 Kubernetes 对象都包含两个嵌套的对象字段:
spec
- 对象的期望状态(desired state
)的描述信息status
- 对象当前的状态(current state
)
Kubernetes 系统的目标就是不停的调整对象的当前状态(current state
)直到和期望状态(desired state
)匹配。
常用字段说明
必需字段
在想要创建的 Kubernetes 对象所对应的 .yaml
文件中,必须配置的字段如下:[1]
apiVersion
- 创建该对象所使用的 Kubernetes API 的版本kind
- 想要创建的对象的类别metadata
- 帮助唯一标识对象的一些数据,包括一个name
字符串、UID
和可选的namespace
spec
- 你所期望的该对象的状态
metadata
帮助唯一标识对象的一些数据,包括一个 name
字符串、UID
和可选的 namespace
集群中的每一个对象都有一个 名称(name
)来标识在同类资源中的唯一性。name
也用来作为 url 中的资源名称 [2]
每个 Kubernetes 对象也有一个 UID(uid
)来标识在整个集群中的唯一性。
apiVersion: apps/v1 |
标签和选择算符
标签(labels) 是附加到 Kubernetes 对象(比如 Pod)上的键值对。 标签旨在用于指定对用户有意义且相关的对象的标识属性,但不直接对核心系统有语义含义。 标签可以用于组织和选择对象的子集。标签可以在创建时附加到对象,随后可以随时添加和修改。 每个对象都可以定义一组键/值标签。每个键对于给定对象必须是唯一的。[3]
通过 标签选择算符,客户端/用户可以识别一组对象。标签选择算符 是 Kubernetes 中的核心分组原语。
对于某些 API 类别(例如
ReplicaSet
)而言,两个实例的标签选择算符不得在命名空间内重叠, 否则它们的控制器将互相冲突,无法确定应该存在的副本个数。
比较新的资源,例如 Job
、 Deployment
、 ReplicaSet
和 DaemonSet
, 也支持基于集合的需求。
selector: |
matchLabels
是由 {key,value}
对组成的映射。 matchLabels
映射中的单个 {key,value}
等同于 matchExpressions
的元素, 其 key
字段为 key
,operator
为 In
,而 values
数组仅包含 value
。 matchExpressions
是 Pod 选择算符需求的列表。 有效的运算符包括 In
、NotIn
、Exists
和 DoesNotExist
。 在 In
和 NotIn
的情况下,设置的值必须是非空的。 来自 matchLabels
和 matchExpressions
的所有要求都按 逻辑与 的关系组合到一起 – 它们必须都满足才能匹配。
字段选择器
字段选择器(Field selectors) 允许你根据一个或多个资源字段的值 筛选 Kubernetes 资源
下面是一些使用字段选择器查询的例子:
metadata.name=my-service
metadata.namespace!=default
status.phase=Pending
下面这个 kubectl
命令将筛选出 status.phase
字段值为 Running
的所有 Pod:
kubectl get pods --field-selector status.phase=Running |
不同的 Kubernetes 资源类型支持不同的字段选择器。 所有资源类型都支持 metadata.name
和 metadata.namespace
字段。 使用不被支持的字段选择器会产生错误
你可在字段选择器中使用 =
、==
和 !=
(=
和 ==
的意义是相同的)操作符。 例如,下面这个 kubectl
命令将筛选所有不属于 default
命名空间的 Kubernetes 服务:
kubectl get services --all-namespaces --field-selector metadata.namespace!=default |
同标签和其他选择器一样, 字段选择器可以通过使用逗号分隔的列表组成一个选择链。 下面这个 kubectl
命令将筛选 status.phase
字段不等于 Running
同时 spec.restartPolicy
字段等于 Always
的所有 Pod:
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always |
你能够跨多种资源类型来使用字段选择器。 下面这个 kubectl
命令将筛选出所有不在 default
命名空间中的 StatefulSet
和 Service
:
kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default |