概述

官网:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/

在K8s中,Label(标签) 是用于标识和组织集群资源(如Pod、Service、Deployment、Node等)的核心机制,其主要作用就是在各种资源上添加表示,用来对它们进行区分和选择。

Label的特点

  • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
  • 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
  • Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除

Label的定义规则

Key的定义规则

  • kubernetes.io/ k8s.io/ 前缀是为 Kubernetes 核心组件保留的。
  • 格式:[前缀/]名称
  • 前缀(可选):DNS子域格式(如 k8s.example.com/),不超过253字符。
  • 名称:不超过63字符,允许字母、数字、-、_、.,且需以字母或数字开头和结尾

Value的定义规则

  • 必须为 63 个字符或更少(可以为空)
  • 除非标签值为空,必须以字母数字字符([a-z0-9A-Z])开头和结尾
  • 包含破折号(-)、下划线(_)、点(.)和字母或数字

Label的操作

给资源添加Label

方式一:在资源清单中指定

可以在资源文件中的metadata.labels中指定标签。以定义Pod为例:

# 创建Pod
[root@master01 ~/label]# cat pod-label.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-label
# 添加label标签,标签以key: value的形式定义
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx
[root@master01 ~/label]# kubectl apply -f pod-label.yaml
pod/pod-label created # 验证是否定义成功
[root@master01 ~/label]# kubectl get pod pod-label --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-label 1/1 Running 0 49s app=nginx

方式二:直接在已存在的资源上添加Label

语法:

kubectl label pods <pod-name> <labelKey=value>

示例:在上述创建Pod中添加一个新的label

# 添加label
[root@master01 ~/label]# kubectl label pods pod-label env=dev
pod/pod-label labeled
# 验证是否添加成功
[root@master01 ~/label]# kubectl get pod pod-label --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-label 1/1 Running 0 4m10s app=nginx,env=dev

修改资源中指定的LabelValue

Label的Key无法进行修改,只能进行删除,或者添加一个新的Key,将原来的Key进行删除,形成修改的假象,这里我们主要讲解修改Label的Value

语法:

kubectl label pods <pod-name> <labelKey=value> --overwrite

示例:将上述Pod的env的value修改为prod

# 修改Label
[root@master01 ~/label]# kubectl label pods pod-label env=prod --overwrite
pod/pod-label labeled
# 验证是否修改成功
[root@master01 ~/label]# kubectl get pod pod-label --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-label 1/1 Running 0 12m app=nginx,env=prod

查看资源中的Label

示例:

# 查看指定资源的Label
[root@master01 ~/label]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-label 1/1 Running 0 13m app=nginx,env=prod
static-web-node02 1/1 Running 0 18m role=myrole # 查看指定资源的Label列
[root@master01 ~/label]# kubectl get pod -L env,app
NAME READY STATUS RESTARTS AGE ENV APP
pod-label 1/1 Running 0 13m prod nginx
static-web-node02 1/1 Running 0 18m

删除资源中的Label

语法:

# 注意,labelKey后有一个"-"减号
kubectl label pods <pod-name> <labelKey>-

示例:删除上述Pod中的env的label

# 删除Label
[root@master01 ~/label]# kubectl label pod pod-label env-
pod/pod-label unlabeled # 验证是否删除成功
[root@master01 ~/label]# kubectl get pod pod-label --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-label 1/1 Running 0 18m app=nginx

Label选择器

官网文档:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/#label-selectors

在Kubernetes中,Label选择器(Label Selector) 是用于根据标签(Label)筛选和操作资源的核心机制。

Kubernetes中支持两种类型的Label选择器

等式选择器

通过精确匹配标签的键和值来筛选资源,支持以下操作符:

  • =或者==:匹配key等于指定value的资源
# 选择所有包含 `env=prod` 标签的Pod
kubectl get pods -l env=prod
  • !=:匹配键值不等于指定值的资源
# 选择所有不包含 `tier=frontend` 标签的Pod
kubectl get pods -l tier!=frontend

集合选择器

通过集合操作符(如 in、notin、exists)灵活筛选资源,支持更复杂的条件。

  • in:指定key的value在指定的集合中
# 选择 `env` 是 `prod` 或 `staging` 的Pod
kubectl get pods -l "env in (prod, staging)"
  • notin: key的value不在指定集合中
kubectl get pods -l "env notin (frontend, backend)"
  • exists:key必须存在(不关心value)
# 选择存在env这个key的Pod
kubectl get pods -l "env,app"
  • doesnotexist:key必须不存在
# 选择不包含 `tier`、`test` 标签的Pod,
# 注意!!!这里需要使用单引号,使用双引号可能导致bash不解析
kubectl get pods -l '!tier,!test'

通过Label操作K8s的资源

通过Label查看指定的资源

语法:

kubectl get <resource-type> -l <label-operation> -n <namespace>

示例:

# 查看label为app=nginx的Pod
[root@master01 ~/label]# kubectl get pod -l "app=nginx"
NAME READY STATUS RESTARTS AGE
pod-label 1/1 Running 0 37m # 查看calico-system名称空间下指定的Label存在的Pod
[root@master01 ~/label]# kubectl get po -l "app.kubernetes.io/name" -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-585c6db9c7-9wm4p 1/1 Running 1 (6d22h ago) 6d23h
calico-node-64sq8 1/1 Running 0 22h
calico-node-kgkmk 1/1 Running 0 22h
calico-node-vn47d 1/1 Running 0 22h
calico-typha-666d79c78b-65szp 1/1 Running 1 (6d22h ago) 6d23h
calico-typha-666d79c78b-n9mjq 1/1 Running 1 (6d22h ago) 6d23h
csi-node-driver-92w48 2/2 Running 4 (6d22h ago) 6d23h
csi-node-driver-96tfv 2/2 Running 2 (6d22h ago) 6d23h
csi-node-driver-wbf7v 2/2 Running 2 (6d22h ago) 6d23h

通过Label删除资源

语法:

kubectl delete <resource-type> -l <label> -n <namespace>

示例:

# 通过label删除Pod
[root@master01 ~/label]# kubectl delete po -l "app=nginx"
pod "pod-label" deleted # 验证是否删除成功
[root@master01 ~/label]# kubectl get po pod-label
Error from server (NotFound): pods "pod-label" not found

资源文件中使用选择器

示例:Deployment中使用

在Deployment中,spec.selector 用于选择目标Pod。常用 matchLabelsmatchExpressions

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx # 精确匹配标签 app=nginx
matchExpressions: # 集合选择器(可选)
- {key: env, operator: In, values: [prod, staging]}
template:
metadata:
labels:
app: nginx
env: prod
# ... Pod配置

示例:Service中使用

Service通过 spec.selector 选择Pod:

apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx # 选择所有包含 app=nginx 标签的Pod
ports:
- protocol: TCP
port: 80
targetPort: 9376

Label及Label选择器的使用场景

  • 批量操作资源:通过标签选择器批量操作符合条件的资源
  • 服务发现:Service通过选择器关联Pod,实现动态流量路由
  • 多维度分组:按照业务、环境、层级等多维度管理资源
  • 通过标签区分新旧版本Pod,逐步切换流量

K8s新手系列之Label标签和Label选择器的更多相关文章

  1. k8s核心资源之:标签(label)

    简介 label是标签的意思,一对 key/value ,被关联到对象上,k8s中的资源对象大都可以打上标签,如Node.Pod.Service 等 一个资源可以绑定任意多个label,k8s 通过  ...

  2. Tkinter 之Label标签

    一.参数说明 语法 作用 Label(window,text=‘xxxxx’) 需要在界面显示的Label标签内容 Label(window,text=‘xxxxx’,height=2) 组件的高度( ...

  3. WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展

    一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...

  4. 【转】WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展

    一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要是对文本输入控件进行样式开发,及相关扩展功能开发,主要内容包括: 基本文 ...

  5. 在学习HTML——form表单中的label标签时的一点小体会

    在我啃了一遍书本之后,开始了在慕课看视频的过程,从最开始的HTML+CSS的基础课程看起,在第5-9小节讲到了form表单的label标签, 首先看一下慕课的讲解:  label 标签不会向用户呈现任 ...

  6. 关于label标签的作用

    label标签的定义和用法: <label> 标签为 input 元素定义标注(标记). label 元素不会向用户呈现任何特殊效果.不过,它为鼠标用户改进了可用性.如果您在 label ...

  7. Echarts —自定义label标签的样式(formatter,rich,添加图标等操作)

    最近公司项目中在使用 Echarts 绘制图表时,由于默认的 label 标签不能满足设计稿需求,所以研究了对 label标签进行格式化的方案,了解到可以使用 formatter 内容格式器对标签内容 ...

  8. HTML label标签的一点理解

    label标签为input元素定义标注. label元素不呈现任何特殊效果.不过他为鼠标用户改进了可用性.如果你在label元素内点击文本就会触发此控件.就是说当用户选择该标签是,浏览器就会自动的将焦 ...

  9. HTML <label> 标签

    定义:<label> 标签为 input 元素定义标注(标记). 用法: label 元素不会向用户呈现任何特殊效果.不过,它为鼠标用户改进了可用性.如果您在 label 元素内点击文本, ...

  10. label标签使用过程中遇到的问题

    最近在做东西时候使用到了label标签,由于之前很少使用label标签,所以就遇到一个很奇怪的问题.什么问题呢?下面来看一个效果 <!DOCTYPE html> <html> ...

随机推荐

  1. 使用nvm管理node.js版本,方便vue2,vue3开发

    在Vue项目开发过程中,我们常常会遇到同时维护Vue2和Vue3项目的情况.由于不同版本的Vue对Node.js 版本的要求有所差异,这就使得Node.js 版本管理成为了一个关键问题.NVM(Nod ...

  2. sql server 新建用户数据库授权

    必须对数据库进行 db_owner 授权.

  3. Python类型提示完全指南:用类型安全重构你的代码,提升10倍开发效率

    title: Python类型提示完全指南:用类型安全重构你的代码,提升10倍开发效率 date: 2025/2/23 updated: 2025/2/23 author: cmdragon exce ...

  4. Windows 提权-UAC 绕过

    本文通过 Google 翻译 UAC-Bypass – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 ...

  5. Ethernet协议和ARP协议分析

    实验介绍: 在信息的传输中,协议至关重要. 使用的实验环境是 kali 2017.arp协议还需要用到靶机centos7 如果是kali的其他版本可能会导致无法抓包. 一:网络分析工具(kali) S ...

  6. 【自编RSG插件】梁结构生成插件QGToolBox

    正在学习基于ABAQUS-PYTHON的GUI开发,出于练手的想法,编写了一个简单的插件. 实现功能: 基于nodes. rods的table,完成桁架结构的几何建模. GUI界面: RSG Buil ...

  7. C/C++ GOTO妙用

    目录 GOTO 语句 跳出多层循环 循环首次部分跳过 GOTO 语句 C/C++ 的 goto 语句用来在一个函数内进行任意跳转,用起来也是很方便.示例如下: int a() { int x = 0, ...

  8. next.js 添加 PWA 渐进式WEB应用(service-worker) 支持

    本文仅作为 next 系列文章中的一部分,其他 next 文章参考: https://blog.jijian.link/categories/nextjs/ 去 github 搜索了一把,估计是我关键 ...

  9. 记录一下 简单udp和sni 代理 done

    由于之前借鉴 Kestrel 了非常多抽象和优化实现,对于后续的扩展非常便利, 实现 简单udp和sni 代理 两个功能比预期快了超多(当然也有偷懒因素) (PS 大家有空的话,能否在 GitHub ...

  10. (Python)用栈实现计算器的原理及实现

    前言 我们日常使用的计算器是怎么实现计算的呢?能自己判断运算符的优先级去计算,能处理括号的匹配,这些都是怎么实现的呢? 一个大家熟知的答案是用栈,好的,那么为什么要用栈?为什么栈能实现呢? 目录 前言 ...