跳到主要内容
08:44:02
🔅🔆

推荐使用的标签

除了 kubectl 和 Dashboard 之外,你还可以用更多的工具来可视化和管理 Kubernetes 对象。一套通用的标签可以让这些工具互操作,以所有工具都能理解的通用方式描述对象。

除了支持工具化之外,推荐标签还以一种可查询的方式描述应用。

元数据是围绕**应用(application)**这一概念组织的。Kubernetes 不是平台即服务(PaaS),没有也不强制一个正式的"应用"概念;应用是松散的、用元数据来描述的,"一个应用包含什么"的定义是宽松的。

这些标签只是"推荐"而非"强制"

推荐标签让应用更容易管理,但任何核心工具都不强制要求使用它们。

共享标签和注解使用共同的前缀:app.kubernetes.io。没有前缀的标签是用户私有的。共享前缀确保共享标签不会与用户自定义标签互相干扰。

官方文档参考​

文档链接
推荐使用的标签(中文)https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/common-labels/
Recommended Labels(英文,内容补充参考)https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/

标签列表​

为了充分发挥这些标签的作用,应该把它们应用到每一个资源对象上。

键描述示例类型
app.kubernetes.io/name应用的名称mysqlstring
app.kubernetes.io/instance标识应用实例的唯一名称mysql-abcxyzstring
app.kubernetes.io/version应用的当前版本(例如 SemVer 1.0 版本号、修订哈希等)5.7.21string
app.kubernetes.io/component架构中的组件databasestring
app.kubernetes.io/part-of此应用所属的更高层级应用的名称wordpressstring
app.kubernetes.io/managed-by用于管理应用运行的工具Helmstring

用下面的 StatefulSet 对象来说明这些标签的用法:

# 这是一个节选
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app.kubernetes.io/name: mysql # 应用名
app.kubernetes.io/instance: mysql-abcxyz # 应用实例唯一名
app.kubernetes.io/version: "5.7.21" # 应用版本
app.kubernetes.io/component: database # 架构组件
app.kubernetes.io/part-of: wordpress # 所属的上层应用
app.kubernetes.io/managed-by: Helm # 管理工具

应用与应用实例​

一个应用可以在 Kubernetes 集群中安装一次或多次,某些情况下甚至安装到同一个命名空间。例如 WordPress 可以安装多次,不同的网站就是 WordPress 的不同安装实例。

应用名称和实例名称是分开记录的:WordPress 的 app.kubernetes.io/name 是 wordpress,而它的实例名由 app.kubernetes.io/instance 表示,值为 wordpress-abcxyz。这样,应用本身和应用的每个实例都是可识别的。应用的每个实例都必须有唯一的名称。

name 与 instance 的区别

name 回答"这是哪个应用",instance 回答"这是这个应用的哪一次部署"。同一集群里并行部署两套 WordPress 时,两者 name 相同而 instance 不同——这是实现多实例共存与精准过滤的关键。

示例​

为了说明这些标签的不同用法,下面的示例具有不同的复杂度。

简单的无状态服务​

考虑一个使用 Deployment 和 Service 对象部署的简单无状态服务。以下两个片段展示了标签最简形式的使用方式。

Deployment 用于管理运行应用本身的 Pod:

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: myservice
app.kubernetes.io/instance: myservice-abcxyz
...

Service 用于暴露该应用:

apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: myservice
app.kubernetes.io/instance: myservice-abcxyz
...

带数据库的 Web 应用​

考虑一个稍复杂的应用:使用 Helm 安装、由 Web 应用(WordPress)加数据库(MySQL)组成。下面的片段展示了部署该应用所用对象的起始部分。

用于 WordPress 的 Deployment 的起始部分:

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: wordpress
app.kubernetes.io/instance: wordpress-abcxyz
app.kubernetes.io/version: "4.9.4"
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: server
app.kubernetes.io/part-of: wordpress
...

用于暴露 WordPress 的 Service:

apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: wordpress
app.kubernetes.io/instance: wordpress-abcxyz
app.kubernetes.io/version: "4.9.4"
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: server
app.kubernetes.io/part-of: wordpress
...

MySQL 以 StatefulSet 的形式暴露,其元数据既包含自身的、也包含其所属的更大应用的信息:

apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app.kubernetes.io/name: mysql
app.kubernetes.io/instance: mysql-abcxyz
app.kubernetes.io/version: "5.7.21"
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: database
app.kubernetes.io/part-of: wordpress
...

用于把 MySQL 作为 WordPress 一部分暴露的 Service:

apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: mysql
app.kubernetes.io/instance: mysql-abcxyz
app.kubernetes.io/version: "5.7.21"
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: database
app.kubernetes.io/part-of: wordpress
...

从 MySQL 的 StatefulSet 和 Service 可以注意到:其中既包含 MySQL 自身的信息,也包含它所属的更广泛的应用 WordPress 的信息(part-of: wordpress)。

我的总结与避坑清单​

  1. 前缀必须是 app.kubernetes.io,逐字写对;少个 s、写成 app.k8s.io 都不匹配通用工具的查询约定。
  2. 推荐标签应应用到应用相关的每一个资源对象(Deployment、Service、StatefulSet、ConfigMap 等),只给工作负载打标签会让 Service/ConfigMap 查不全。
  3. name 与 instance 要分开理解:同一应用多次安装(哪怕同命名空间)时靠 instance 区分,实例名必须唯一。
  4. version 值建议用 SemVer 或 commit hash,并且记得加引号(如 "5.7.21"),避免 YAML 把它解析成数字。
  5. managed-by 如实填写管理工具(Helm、Kustomize、Argo CD 等);由人工维护的资源不要乱填,否则工具的"接管/清理"判断可能出问题。
  6. part-of 把多个组件挂到同一上层应用名下,配合 component 可以实现按应用的整树过滤:-l app.kubernetes.io/part-of=wordpress。
  7. Helm 生成的对象会自带这套标签并附带 app.kubernetes.io/managed-by: Helm 和 release 哈希后缀,手动改模板标签时注意不要破坏 Helm 的 selector 匹配。
  8. 这套标签是工具互操作的通用约定(Dashboard、Prometheus、备份工具等都可能识别),自研平台应优先复用它而不是另起炉灶定义私有标签体系。
🛡️本站已安全运行2334天23时18分58秒
Bottom GIF
Top GIF