当前位置: 首页 > news >正文

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-demolabels:environment: production  # 环境标识app: nginx               # 应用名称version: "1.21"          # 版本号tier: frontend           # 应用层级
spec:containers:- name: nginximage: nginx:1.21

Deployment 示例:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtier: frontendtemplate:metadata:labels:app: nginxtier: frontendversion: "1.21"spec:containers:- name: nginximage: 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: nginxenvironment: testtemplate: # Pod 模板metadata:labels: # 这里定义的标签必须匹配上面的 selector!app: nginxenvironment: testtier: frontend # 可以添加更多标签spec:containers:- name: nginximage: 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: nginxenvironment: testports:- protocol: TCPport: 80targetPort: 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-containerimage: nginxnodeSelector: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
http://www.wxhsa.cn/company.asp?id=837

相关文章:

  • Gitee DevOps平台深度评测:本土化优势如何赋能企业研发效能提升
  • 【SPIE出版】2025计算机视觉和影像计算国际学术会议(CVIC 2025)
  • 密码学工具包中的Hash函数
  • 跟着院士导师做会议口头汇报PPT!
  • 【分享】内外网文件传输方式:从传统痛点到专业解决方案!
  • c# TargetFramework 应该写 net48 还是 net4.8
  • Docker 安装 Elasticsearch 报错
  • 大疆红外TSDK红外照片转RGB888图片JAVA实现方法
  • MCU联网
  • 算法-A*-01 - jack
  • 代码是上午写的,公司是下午解散的!
  • [antlr] 如何在Linux(Ubuntu)环境中安装配置antlr4.9.2
  • 国内开发者如何选择代码管理平台?Gitee、GitHub与Bitbucket深度对比
  • Spring-Android-即时入门-全-
  • 4. 链表
  • Maven-和-Eclipse-全-
  • Prompt、RAG、微调
  • 飞书对程序员下手了,0 代码生成各类系统!!
  • 测试用例设计检查项
  • Android Kotlin请求权限及权限回调处理
  • 版本发布| IvorySQL 4.6 发布
  • Avalonia Calendar 日历控件遇到 Flyout 或者切换页面时出现的鼠标按下失效的解决方法
  • cache和主存的映射方式
  • Vue 2 + Element UI 技术栈的管理端项目和Git使用教程
  • 你好
  • 2025年图像、信号处理与机器学习国际学术会议(ISPML 2025)
  • 利用Ampere Altra与SpinKube实现可扩展工作流的突破性实践
  • 有向距离场SDF,在游戏中如何实现agent导航以及绕障
  • ubuntu22.04.5系统重启后网络配置消失问题
  • 第十届计算机技术与机械电气工程国际学术论坛(ISCME 2025)暨2025年泰山学术论坛-鲁东大学微纳传感器及系统专题论坛