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

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.xdnf.cn/news/12673.html

相关文章:

  • 山东大学算法设计与分析复习笔记
  • 多模态+空间智能:考拉悠然以AI+智慧灯杆,点亮城市治理新方式
  • C#实现Stdio通信方式的MCP Server
  • 高级网络工具包用户操作指南
  • Linux 中替换文件中的某个字符串
  • 如何调控gpu训练参数
  • 优选算法第十二讲:队列 + 宽搜 优先级队列
  • 深度学习在RNA分子动力学中的特征提取与应用指南
  • 每日互动方毅:数据要素价值在于流转,用好AI的前提是用好数据 | 爱分析访谈
  • [蓝桥杯]版本分支
  • AI 模型分类全解:特性与选择指南
  • 鸿蒙开发:loading动画的几种实现方式
  • 欧拉定理和费马定理
  • 人工智能会导致人类毁灭吗
  • 所有的Linux桌面环境
  • 从微积分到集合论(1630-1910)(历史简介)——第4章——现代积分理论的起源(Thomas Hawkins)
  • 13.MySQL用户管理
  • 【C/C++】不同防止头文件重复包含的措施
  • 【同数增位累加2+22+222+2222】2022-4-15
  • 广目软件GM DC Monitor
  • 驱控边界在哪里?知名舵机品牌伟创动力CNTE2025展带来答案
  • c# List<string>.Add(s) 报错:UnsupportedOperationException
  • antd-vue - - - - - table实现滚动加载数据
  • 什么是上下文切换?代价在哪里?
  • C++ if语句完全指南:从基础到工程实践
  • API是什么意思?如何实现开放API?
  • 开源语义分割工具箱mmsegmentation基于Lovedata数据集训练模型
  • 你如何确保监控系统的可用性?
  • python算法-移动零盛最多的水--Day021
  • WinCC学习系列-变量模拟器(WinCC TAG Simulator )