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

Kubernetes 从入门到精通-label标签

       Label(标签)是 Kubernetes 中用于标识和选择资源对象的核心机制,本质是附加到资源(如 Pod、Node、Service 等)上的键值对(Key-Value)。

一、核心概念与作用

1.概念

       在Kubernetes(k8s)中,标签(Labels)和选择器(Selectors)是用于组织和筛选Pod以及其他Kubernetes资源的关键机制。通过使用标签和选择器,你可以轻松地管理和定位到特定的资源实例,这对于资源的调度、部署策略的制定以及服务的编排至关重要。

       Label 以 key=value 形式标记资源,例如 env=prod、role=backend,用于表示资源的特性(如环境、版本、角色)

2.特点

  • 一个资源可拥有多个 Label(如同时标记 env=prod 和 app=nginx)。

  • 同一 Label 可被添加到多个资源上。

  • 支持动态增删改,无需重建资源。

3.用途

  • 资源分组:按维度(环境、版本、架构)对资源分类,便于批量操作。

  • 精细调度:通过 Label Selector 选择特定资源(如将 Pod 调度到指定 Node)。

  • 服务关联:Service 通过 Label 关联后端 Pod,实现流量路由。

二、基础命令

1.查看标签

# 查看所有 Pod 的 Label
kubectl get pods --show-labels# 查看 Node 的 Label
kubectl get nodes --show-labels# 按列显示特定 Label
# 显示 env 和 app 列:cite[1]:cite[3]
kubectl get pods -L env,app

图片

2.添加标签

#给node节点添加标签
kubectl label nodes node-2 IngressProxy=true#给pod添加标签方式一
kubectl label pods nginx-78c796f476-g6rn9 role=backend
#给pod添加标签方式二
[root@master231 pod]# cat 10-pods-labesl.yaml 
apiVersion: v1
kind: Pod
metadata:name: nginx
# 给Pod资源添加标签labels:app: nginxenv: prod
spec:containers:- name: webimage: nginx:1.22.0#给pod添加标签方式三
kubectl label -f 10-pods-labesl.yaml role=backend

3.修改标签

#需加 --overwrite 覆盖更新
kubectl label --overwrite pod nginx-78c796f476-g6rn9 role=pc

4.删除标签

kubectl label pod nginx-78c796f476-g6rn9 role-

        可以看到role标签已经被删除

图片

5.根据标签筛选资源

#筛选role=app的资源
kubectl get pods -l role=app# 基于集合筛选(Set-based)
# 支持 in, notin, !=:cite[2]:cite[8]
kubectl get pods -l 'env in (prod, dev), tier!=backend'

       可以看到只会查出对应标签的资源

图片

三、Label Selector(选择器)

1.标签选择器类型

  • 基于等值(Equality-based)的选择器:使用等式运算符进行精确匹配。

  • 基于集合(Set-based)的选择器:支持更复杂的集合运算,比如in(值在集合中)、not in(值不在集合中)、exists(键存在,不关心值)。

2.Selector 在 K8s 对象中的应用

2.1 Service 关联 Pod
[root@master-1 ~]# cat service-nginx.yaml 
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:type: NodePort
# 基于标签选择器关联Podselector:app: nginx env: test # 选择所有含 app=nginx且env=test标签的 Pod
# 配置端口映射ports:# 指定Service服务本身的端口号- port: 8888# 后端Pod提供服务的端口号targetPort: 80[root@master-1 ~]# kubectl apply -f service-nginx.yaml#发现已经关联上pod啦
[root@master-1 ~]# kubectl get pods,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-78c796f476-84768   1/1     Running 0          15s 10.244.1.3   node-2   <none> <none>
pod/nginx-78c796f476-gcvwg   1/1     Running 0          15s 10.244.1.2   node-2   <none> <none>
pod/nginx-78c796f476-zbb9b   1/1     Running 0          15s 10.244.0.3   node-1   <none> <none>NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.0.0.1     <none> 443/TCP 7d3h <none>
service/nginx-service NodePort 10.0.0.83    <none> 8888:31957/TCP 6s app=nginx,env=test
[root@master-1 ~]# kubectl describe svc nginx-service
Name: nginx-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx,env=test
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.0.0.83
IPs: 10.0.0.83
Port: <unset> 8888/TCP
TargetPort: 80/TCP
NodePort: <unset> 31957/TCP
Endpoints: 10.244.0.3:80,10.244.1.2:80,10.244.1.3:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
2.2 Deployment 管理 Pod
[root@master-1 ~]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment 
metadata:name: nginx
spec:replicas: 3
#基于标签关联pod,会关联env=test或者env=prod的podselector:matchExpressions:- key: envvalues: - "test"- "prod"operator: Intemplate:metadata:#为pod设置了两个标签labels:app: nginxenv: testspec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresent[root@master-1 ~]# kubectl apply -f nginx.yaml#operator: In
# 定义key和value之间的关系,有以下几种关系:# In:# key的值,在vlaues列表中任意其一即可。# NotIn:# key的值,不能在values列表中。# Exists:# 只有有key就行,value任意。如果是Exists,则不允许定义values字段。# DoesNotExist:# 不能包含指定的key。其他的key和value任意。如果是DoesNotExist,则不允许定义values字段。

       可以看到使用deploy部署了三个pod

图片

2.3 通过标签选择器Node 调度(NodeSelector)

       将pod调度到指定标签的节点上

[root@master-1 ~]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment 
metadata:name: nginx
spec:replicas: 3#基于标签关联pod,会关联env=test或者env=prod的podselector:matchExpressions:- key: envvalues: - "test"- "prod"operator: Intemplate:metadata:#为pod设置了两个标签labels:app: nginxenv: testspec:# 基于节点的标签进行调度,将Pod调度到包含key为type,value为ssd的节点上。nodeSelector:app: testcontainers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresent[root@master-1 ~]# kubectl apply -f nginx.yaml

       发现结果将pod全部调度到含有app=test标签的node-2节点上了

图片

四、总结

Label 是 Kubernetes 多维度资源管理的基石,通过 标识 + 选择器 实现:

  • 资源分类(如按环境分组)

  • 动态调度(如定向部署到 SSD 节点)

  • 服务发现(如 Service 关联后端 Pod)

掌握 Label 的定义、操作及选择器使用,是高效管理 K8s 集群的关键技能。

http://www.lqws.cn/news/186247.html

相关文章:

  • Caliper 配置文件解析:config.yaml
  • 贝叶斯深度学习!华科大《Nat. Commun.》发表BNN重大突破!
  • 04 Deep learning神经网络编程基础 梯度下降 --吴恩达
  • 一个WebRTC 分辨率动态爬升问题记录与解决过程
  • Kubernetes指标实现有效的集群监控和优化
  • 【单片机期末】串行口循环缓冲区发送
  • 单片机内部结构基础知识 FLASH相关解读
  • Flask 核心概念速览:路由、请求、响应与蓝图
  • 深入理解二叉搜索树:原理到实践
  • LeetCode 热题 100 74. 搜索二维矩阵
  • 【Linux基础知识系列】第十四篇-系统监控与性能优化
  • 使用VSCode开发Django指南
  • npm install的原理
  • 自制喜悦字贴
  • 华为×小鹏战略合作:破局智能驾驶深水区的商业逻辑深度解析
  • Qt(part1)Qpushbutton,信号与槽,对象树,自定义信号与槽,lamda表达式。
  • 使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
  • QuaggaJS用法详解
  • vue生成二维码图片+文字说明
  • Vue 组件库发布实战(含 TypeScript 支持)
  • 课消管理软件,教培机构进入系统管理时代
  • 高温IC设计带来的挑战和问题
  • 深入理解 transforms.Normalize():PyTorch 图像预处理中的关键一步
  • Javascript 编程基础(5)面向对象 | 5.1、构造函数实例化对象
  • JavaScript 原型与原型链:深入理解 __proto__ 和 prototype 的由来与关系
  • 区块链技术相关
  • 李沐《动手学深度学习》d2l安装教程
  • JS面试常见问题——数据类型篇
  • Java并发编程面试题
  • 【Android】Android Studio项目代码异常错乱问题处理(2020.3版本)