找回密码
 立即注册
首页 业界区 安全 Kubernetes标签(Label)

Kubernetes标签(Label)

古修蟑 2025-10-1 16:17:51
标签(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示例
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: label-demo
  5.   labels:
  6.     environment: production  # 环境标识
  7.     app: nginx               # 应用名称
  8.     version: "1.21"          # 版本号
  9.     tier: frontend           # 应用层级
  10. spec:
  11.   containers:
  12.   - name: nginx
  13.     image: nginx:1.21
复制代码
Deployment 示例:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: nginx-deployment
  5.   labels:
  6.     app: nginx
  7. spec:
  8.   replicas: 3
  9.   selector:
  10.     matchLabels:
  11.       app: nginx
  12.       tier: frontend
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: nginx
  17.         tier: frontend
  18.         version: "1.21"
  19.     spec:
  20.       containers:
  21.       - name: nginx
  22.         image: nginx:1.21
复制代码
2.2 为现有资源添加或修改标签

使用 kubectl label 命令:
  1. # 给一个已存在的 Pod 添加/修改标签
  2. kubectl label pods <pod-name> environment=prod
  3. # 覆盖已存在的标签(需要 --overwrite)
  4. kubectl label pods <pod-name> environment=staging --overwrite
复制代码
2.3 查看资源标签
  1. # 查看所有 Pod 及其标签
  2. kubectl get pods --show-labels
  3. # 查看指定命名空间的 Pod 及其标签
  4. kubectl get pods -n <namespace> --show-labels
  5. # 查看特定资源的标签
  6. kubectl describe pod label-demo | grep Labels
  7. # 使用标签选择器筛选 Pod
  8. kubectl get pods -l app=nginx
  9. kubectl get pods -l 'environment in (prod, staging)'
  10. kubectl get pods -l 'tier!=backend'
复制代码
2.4 删除标签

通过将标签值设置为空字符串来删除标签:
  1. # 使用减号 - 来删除一个标签
  2. kubectl label pods <pod-name> environment-
复制代码
3、标签选择器(Label Selectors)

标签选择器是用于筛选具有特定标签的资源的查询条件,Kubernetes 中许多资源都使用标签选择器来关联其他资源。
3.1 基于等值(Equality-based)的选择器

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

  • environment = production: 选择所有具有 environment 标签且值等于 production 的对象。
  • tier != frontend: 选择所有具有 tier 标签且值不等于 frontend,或者根本没有 tier 标签的对象。
示例
  1. # 选择 environment 为 production 的 Pod
  2. kubectl get pods -l environment=production
  3. # 选择 app 为 nginx 且 tier 不是 backend 的 Pod
  4. kubectl get pods -l app=nginx,tier!=backend
复制代码
3.2 基于集合(Set-based)的选择器

使用 in、notin、exists 运算符进行更灵活的匹配。

  • environment in (production, staging): 选择所有具有 environment 标签且值是 production 或 staging 的对象。
  • tier notin (frontend, backend): 选择所有具有 tier 标签且值既不是 frontend 也不是 backend 的对象。
  • release: 选择所有具有 release 标签的对象,不检查其值。
  • !release: 选择所有不具有 release 标签的对象。
示例
  1. # 选择 version 为 v1 或 v2 的 Pod
  2. kubectl get pods -l 'version in (v1, v2)'
  3. # 选择 environment 不是 production 也不是 staging 的 Pod
  4. kubectl get pods -l 'environment notin (production, staging)'
  5. # 选择所有具有 app 标签的 Pod(无论值是什么)
  6. kubectl get pods -l 'app'
  7. # 选择所有没有 tier 标签的 Pod
  8. kubectl get pods -l '!tier'
复制代码
4、应用场景

4.1 连接 Pod 与 Controller(控制器)

Deployment、ReplicaSet、StatefulSet、DaemonSet 等控制器通过标签选择器来管理它们所控制的 Pods。
示例: 一个 Deployment 的配置如下。它通过 selector 字段找到所有带有 app: nginx 和 environment: test 标签的 Pod 来进行管理。
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: nginx-deployment
  5. spec:
  6.   selector:
  7.     matchLabels: # 使用 matchLabels 进行等值匹配
  8.       app: nginx
  9.       environment: test
  10.   template: # Pod 模板
  11.     metadata:
  12.       labels: # 这里定义的标签必须匹配上面的 selector!
  13.         app: nginx
  14.         environment: test
  15.         tier: frontend # 可以添加更多标签
  16.     spec:
  17.       containers:
  18.       - name: nginx
  19.         image: nginx:1.14.2
复制代码
4.2 连接 Service 与 Pods

Service 通过标签选择器决定它将流量路由到哪些 Pods。
示例:下面的 Service 会将所有进入的流量负载均衡到所有带有 app: nginx 和 environment: test 标签的 Pods 上。
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: nginx-service
  5. spec:
  6.   selector: # Service 的选择器
  7.     app: nginx
  8.     environment: test
  9.   ports:
  10.     - protocol: TCP
  11.       port: 80
  12.       targetPort: 9376
复制代码
4.3 节点选择(Node Selection)

你可以给 Node 打上标签(如 disktype: ssd, gpu: "true"),然后在 Pod 配置中通过 nodeSelector 将 Pod 调度到特定的节点上。
步骤1:给节点打标签
  1. kubectl label nodes <node-name> disktype=ssd
复制代码
步骤2:在 Pod 定义中使用节点选择器
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: my-pod
  5. spec:
  6.   containers:
  7.   - name: my-container
  8.     image: nginx
  9.   nodeSelector:
  10.     disktype: ssd # 这个 Pod 只会被调度到带有 disktype=ssd 标签的节点上
复制代码
4.4 金丝雀发布(Canary Releases)

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

  • 部署稳定版:deployment + service,标签为 app: myapp, version: stable。
  • 部署金丝雀版:deployment,标签为 app: myapp, version: canary。
  • Service 的选择器是 app: myapp,它会将流量同时路由到 stable 和 canary 版本的 Pod。通过控制两个 Deployment 的副本数比例,可以控制流量分配。
4.5 批量操作

可以使用标签选择器对一组资源执行操作。
  1. # 删除所有 environment 为 test 的 Pods
  2. kubectl delete pods -l environment=test
  3. # 查看所有 tier 是 frontend 的 Pods
  4. kubectl get pods -l tier=frontend
  5. # 查看所有具有 release 标签的 Pods(不管值是什么)
  6. kubectl get pods -l release
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

12 小时前

举报

不错,里面软件多更新就更好了
您需要登录后才可以回帖 登录 | 立即注册