Kubernetes标签(Label)

标签(Labels)是 Kubernetes 中用于对资源进行标识和分类的键值对,是实现资源管理、筛选和关联的核心机制。它们不直接影响资源的功能,但为集群中的资源组织、查询和操作提供了强大的灵活性。

1、概念

1.1 定义与作用

标签是附加在 Kubernetes 资源(如 Pod、Node、Service、Deployment 等)上的键值对

特点:

  • 每个对象可以有多个标签。
  • 标签的 Key 必须是唯一的。
  • 标签可以在创建时添加,也可以后期动态修改。

1.2 标签的语法和规范

  • 键(Key): 分为两部分(可选):前缀/名称

    • 前缀: 可选。如果指定,必须是一个 DNS 子域名,如 example.com/my-key。它用于区分第三方工具使用的标签。
    • 名称: 必填。不能超过 63 个字符。必须以字母数字开头和结尾,中间可以包含连字符 -、下划线 _、点 .。
  • 值(Value): 必须不超过 63 个字符。同样必须以字母数字开头和结尾,中间可以包含连字符 -、下划线 _、点 .。

有效示例:

environment: production
tier: frontend
app.kubernetes.io/name: mysql (使用前缀的最佳实践)

release: "canary" (值可以用引号,但非必须)

无效示例:

.environment: prod (键名不能以点开头)
environment: prod/ (值不能以斜杠结尾)

2、标签的使用

2.1 创建资源时添加标签

Pod示例

apiVersion: v1
kind: Pod
metadata:
  name: label-demo
  labels:
    environment: production  # 环境标识
    app: nginx               # 应用名称
    version: "1.21"          # 版本号
    tier: frontend           # 应用层级
spec:
  containers:
  - name: nginx
    image: nginx:1.21

Deployment 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
      tier: frontend
  template:
    metadata:
      labels:
        app: nginx
        tier: frontend
        version: "1.21"
    spec:
      containers:
      - name: nginx
        image: nginx:1.21

2.2 为现有资源添加或修改标签

使用 kubectl label 命令:

# 给一个已存在的 Pod 添加/修改标签
kubectl label pods <pod-name> environment=prod

# 覆盖已存在的标签(需要 --overwrite)
kubectl label pods <pod-name> environment=staging --overwrite

2.3 查看资源标签

# 查看所有 Pod 及其标签
kubectl get pods --show-labels

# 查看指定命名空间的 Pod 及其标签
kubectl get pods -n <namespace> --show-labels

# 查看特定资源的标签
kubectl describe pod label-demo | grep Labels

# 使用标签选择器筛选 Pod
kubectl get pods -l app=nginx
kubectl get pods -l 'environment in (prod, staging)'
kubectl get pods -l 'tier!=backend'

2.4 删除标签

通过将标签值设置为空字符串来删除标签:

# 使用减号 - 来删除一个标签
kubectl label pods <pod-name> environment-

3、标签选择器(Label Selectors)

标签选择器是用于筛选具有特定标签的资源的查询条件,Kubernetes 中许多资源都使用标签选择器来关联其他资源。

3.1 基于等值(Equality-based)的选择器

使用 ===!= 运算符进行匹配。

  • environment = production: 选择所有具有 environment 标签且值等于 production 的对象。

  • tier != frontend: 选择所有具有 tier 标签且值不等于 frontend,或者根本没有 tier 标签的对象。

示例

# 选择 environment 为 production 的 Pod
kubectl get pods -l environment=production

# 选择 app 为 nginx 且 tier 不是 backend 的 Pod
kubectl get pods -l app=nginx,tier!=backend

3.2 基于集合(Set-based)的选择器

使用 innotinexists 运算符进行更灵活的匹配。

  • environment in (production, staging): 选择所有具有 environment 标签且值是 production 或 staging 的对象。

  • tier notin (frontend, backend): 选择所有具有 tier 标签且值既不是 frontend 也不是 backend 的对象。

  • release: 选择所有具有 release 标签的对象,不检查其值。

  • !release: 选择所有不具有 release 标签的对象。

示例

# 选择 version 为 v1 或 v2 的 Pod
kubectl get pods -l 'version in (v1, v2)'

# 选择 environment 不是 production 也不是 staging 的 Pod
kubectl get pods -l 'environment notin (production, staging)'

# 选择所有具有 app 标签的 Pod(无论值是什么)
kubectl get pods -l 'app'

# 选择所有没有 tier 标签的 Pod
kubectl get pods -l '!tier'

4、应用场景

4.1 连接 Pod 与 Controller(控制器)

Deployment、ReplicaSet、StatefulSet、DaemonSet 等控制器通过标签选择器来管理它们所控制的 Pods。

示例: 一个 Deployment 的配置如下。它通过 selector 字段找到所有带有 app: nginxenvironment: test 标签的 Pod 来进行管理。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels: # 使用 matchLabels 进行等值匹配
      app: nginx
      environment: test
  template: # Pod 模板
    metadata:
      labels: # 这里定义的标签必须匹配上面的 selector!
        app: nginx
        environment: test
        tier: frontend # 可以添加更多标签
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2

4.2 连接 Service 与 Pods

Service 通过标签选择器决定它将流量路由到哪些 Pods。

示例:下面的 Service 会将所有进入的流量负载均衡到所有带有 app: nginx 和 environment: test 标签的 Pods 上。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector: # Service 的选择器
    app: nginx
    environment: test
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

4.3 节点选择(Node Selection)

你可以给 Node 打上标签(如 disktype: ssd, gpu: "true"),然后在 Pod 配置中通过 nodeSelector 将 Pod 调度到特定的节点上。

步骤1:给节点打标签

kubectl label nodes <node-name> disktype=ssd

步骤2:在 Pod 定义中使用节点选择器


apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
  nodeSelector:
    disktype: ssd # 这个 Pod 只会被调度到带有 disktype=ssd 标签的节点上

4.4 金丝雀发布(Canary Releases)

通过标签可以将一部分流量路由到新版本的 Pod(金丝雀),另一部分路由到稳定版本的 Pod。
示例:

  1. 部署稳定版:deployment + service,标签为 app: myapp, version: stable。

  2. 部署金丝雀版:deployment,标签为 app: myapp, version: canary。

  3. Service 的选择器是 app: myapp,它会将流量同时路由到 stable 和 canary 版本的 Pod。通过控制两个 Deployment 的副本数比例,可以控制流量分配。

4.5 批量操作

可以使用标签选择器对一组资源执行操作。

# 删除所有 environment 为 test 的 Pods
kubectl delete pods -l environment=test

# 查看所有 tier 是 frontend 的 Pods
kubectl get pods -l tier=frontend

# 查看所有具有 release 标签的 Pods(不管值是什么)
kubectl get pods -l release
posted @ 2025-09-11 10:18  xclic  阅读(6)  评论(0)    收藏  举报