Kubernetes基础(九)-标签管理

1 概述

Label(标签)是Kubernetes系统中一个比较重要的概念,给某个资源对象(Node、Pod、Service等)定义一个Label,就相当于给它打了一个标签,然后可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象,Kubernetes通过label对资源进行分区和管理。

1.1 特点

  • 一个Label是一个key=value的键值对,其中key与value由用户自己指定。Label可以被附加到各种资源对象上,例如Node、Pod、Service等。
  • 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上。
  • Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。

可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。

1.2 案例

下面是一个有 environment: production 和 app: nginx 标签的 Pod 配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: label-demo
  labels:		# 定义标签集合
    environment: production   # 使用键值对方式定义
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

2 Label Selector(标签选择器)

Label标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector(标签选择器),即:

  • Label用于给某个资源对象定义标签;
  • Label Selector用于查询和筛选拥有某些标签的资源对象;

当service的标签是app=nginx时户匹配两个pod。

当service的标签是app=nginx和env=dev时,只会匹配同时具有两个标签的pod。

2.1 标签选择器算法

API 目前支持两种类型的选择算符:

  • 基于等值
  • 基于集合

2.1.1 基于等值(Equality-based)

基于等值或基于不等值的需求允许按标签键和值进行过滤。 匹配对象必须满足所有指定的标签约束,尽管它们也可能具有其他标签。 可接受的运算符有 =、== 和 != 三种。 前两个表示相等(并且是同义词),而后者表示不相等。例如:

  • app = nginx:匹配所有具有标签app=nginx的资源对象;
  • environment != prod:匹配所有不具有标签environment = prod的资源对象,比如environment = dev、environment = qa等;

2.1.2 基于集合(Set-based)

基于集合的标签需求允许通过一组值来过滤键。 支持三种操作符:

  • in
  • notin
  • exists(只可以用在键标识符上)

例如:

  • release in(stable, beta):匹配所有具有标签release = stable或者release = beta的资源对象;
  • tier not in(backend):匹配所有不具有标签tier = backend的资源对象;

标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:app=nginx,environment!=prod、release in (stable, beta),app=nginx等等。

 2.1.3 案例

selector:
  matchLabels:        # 由 {key,value} 对组成的映射
    app: nginx
  matchExpressions:            # Pod 选择算符需求的列表
      # 可以使用的操作包括In、NotIn、Exists、DoesNotExist
    - { key: tier , operator: In , values: [frontend]} 
    - { key: environment, operator: NotIn, values: [dev]}

3 Label使用场景

一些常用的Label示例如下:

  • "release" : "stable", "release" : "canary"
  • "environment" : "dev", "environment" : "qa", "environment" : "production"
  • "tier" : "frontend", "tier" : "backend", "tier" : "cache"
  • "partition" : "customerA", "partition" : "customerB"
  • "track" : "daily", "track" : "weekly"

标签的 Key 对于给定对象必须是唯一的。

Label Selector在Kubernetes中的重要使用场景如下。

  • kube-controller进程通过在资源对象RC上定义的Label Selector来筛选要监控的Pod副本数量,使Pod副本数量始终符合预期设定的全自动控制流程。
  • kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
  • 通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,kube-scheduler进程可以实现Pod定向调度的特性。

4 pod标签操作

4.1 yaml文件定义标签 

以nginx Pod为例,Label被定义在其metadata中,如下图:

设置后就可以在在Service、RC等管理对象中通过Label Selector(标签选择器)设置需要关联Pod的Label,如下图:

4.2 查看标签

kubectl get xxx 命令默认不会列出任何标签,使用 --show-labels 选项来查看。例如:

$ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-748c667d99-6d5s9   1/1     Running   0          35m
 
$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-6d5s9   1/1     Running   0          35m   app=nginx,pod-template-hash=748c667d99
 
$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        7d8h
nginx        NodePort    10.103.144.31   <none>        80:32327/TCP   34m
 
$ kubectl get svc --show-labels
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE    LABELS
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        7d8h   component=apiserver,provider=kubernetes
nginx        NodePort    10.103.144.31   <none>        80:32327/TCP   35m    app=nginx

4.3 筛选标签

查看匹配标签条件的pod:

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-6d5s9   1/1     Running   0          41m   app=nginx,pod-template-hash=748c667d99
 
$ kubectl get pod -l app=nginx
NAME                     READY   STATUS    RESTARTS   AGE
nginx-748c667d99-6d5s9   1/1     Running   0          42m
 
$ kubectl get pod -l app=nginx1
No resources found in default namespace.

查看匹配标签key的pod:

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-6d5s9   1/1     Running   0          43m   app=nginx,pod-template-hash=748c667d99
 
$ kubectl get pod -L app       
NAME                     READY   STATUS    RESTARTS   AGE   APP
nginx-748c667d99-6d5s9   1/1     Running   0          43m   nginx
 
$ kubectl get pod -L pod-template-hash
NAME                     READY   STATUS    RESTARTS   AGE   POD-TEMPLATE-HASH
nginx-748c667d99-6d5s9   1/1     Running   0          44m   748c667d99

多个匹配条件之间使用逗号分开,多个条件之间是“and”关系。例如:

# 选择release为stable或者beta的pod
kubectl get pod -l 'release in (stable, beta)' --show-labels
 
# 选择release为stable或者beta但不包括env=test的pod
kubectl get pod -l env!=test,'release in (stable, beta)' --show-labels

4.4 添加标签

给名为nginx 的pod添加Label:environment=dev

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-6d5s9   1/1     Running   0          45m   app=nginx,pod-template-hash=748c667d99
 
$ kubectl label pod nginx-748c667d99-6d5s9 environment=dev
pod/nginx-748c667d99-6d5s9 labeled
$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-6d5s9   1/1     Running   0          46m   app=nginx,environment=dev,pod-template-hash=748c667d99

4.5 更新标签

把名为nginx 的pod修改Label 为 environment=test,且覆盖现有的value。

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-2trsf   1/1     Running   0          60s   app=nginx,environment=dev,pod-template-hash=748c667d99
 
#使用--overwrite覆盖
$ kubectl label pod nginx-748c667d99-2trsf environment=test --overwrite
pod/nginx-748c667d99-2trsf labeled
 
$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE     LABELS
nginx-748c667d99-2trsf   1/1     Running   0          2m12s   app=nginx,environment=test,pod-template-hash=748c667d99

如果更新的时候标签不存在怎么处理呢?答案是会创建一个新的标签。 

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-748c667d99-q2j2r   1/1     Running   0          44s   app=nginx,env=test,pod-template-hash=748c667d99
 
# 更新一个不存在的标签release=stable,那么k8s将会创建新的标签,自动添加上去
$ kubectl label pod nginx-748c667d99-q2j2r release=stable  --overwrite
pod/nginx-748c667d99-q2j2r labeled
 
$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE    LABELS
nginx-748c667d99-q2j2r   1/1     Running   0          105s   app=nginx,env=test,pod-template-hash=748c667d99,release=stable

4.5 删除标签

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE     LABELS
nginx-748c667d99-2trsf   1/1     Running   0          2m12s   app=nginx,environment=test,pod-template-hash=748c667d99
 
#标签名后面加个“-”就代表要删除该标签
$ kubectl label pod nginx-748c667d99-2trsf environment-    
pod/nginx-748c667d99-2trsf unlabeled
 
$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE    LABELS
nginx-748c667d99-2trsf   1/1     Running   0          5m6s   app=nginx,pod-template-hash=748c667d99

除了给Pod添加Label之外,Service、Node等对象也是可以添加标签的,例如某个应用需要运行在一个或者多个固定的节点上,就可以给Node节点添加特定的Label,这样k8s调度的时候,只会将Pod调度到具有特定Label的节点上。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/197750.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】类型转换 ⑤ ( 常量和非常量之间的类型转换 - 常量类型转换 const_cast | const 左数右指原则 | 代码示例 )

文章目录 一、const 关键字简介1、const 修饰普通数据2、const 修饰指针 ( 左数右指原则 | 指针常量 | 常量指针 ) 二、常量和非常量 之间的类型转换 - 常量类型转换 const_cast1、常量类型转换 const_cast2、常量不能直接修改3、修改常量值的方法4、特别注意 - 确保指针指向的…

vs2019 - MFC对话框程序的工程名称不支持下划线命名法

文章目录 vs2019 - MFC对话框程序的工程名称不支持下划线命名法概述笔记备注END vs2019 - MFC对话框程序的工程名称不支持下划线命名法 概述 正在写账单分析程序, 用MFC 对话框. 因为比较习惯下划线命名法, 就在向导中给工程名称起了一个my_test这样的名称(下划线命名法, 小…

SpringBoot自动配置注入Bean工具autoconfigure

依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency> yml配置 student:red: com.ma.config.MinIOConfigProperties spring.factories org.springframework.…

LeetCode Hot100 42.接雨水

题目&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 方法一&#xff08;相向双指针&#xff09;&#xff1a;竖着计算面积 代码&#xff1a; class Solution {public int trap(int[] he…

Taro3+Vue3重构Mpvue小程序项目踩坑记

1、Taro小程序编译时报错&#xff1b; 原因:页面中存在小程序识别不了的标签&#xff1b;如div解决方法&#xff1a; 将div标签替换成小程序可识别的标签&#xff1b; 安装Taro中提供的插件:tarojs/plugin-html, 使其可被识别&#xff1b; 插件安装教程参考Taro官网&#xff1…

Flink Flink中的合流

一、Flink中的基本合流操作 在实际应用中&#xff0c;我们经常会遇到来源不同的多条流&#xff0c;需要将它们的数据进行联合处理。所以 Flink 中合流的操作会更加普遍&#xff0c;对应的 API 也更加丰富。 二、联合&#xff08;Union&#xff09; 最简单的合流操作&#xf…

「我在淘天做技术」迈步从头越 - 阿里妈妈广告智能决策技术的演进之路

作者&#xff1a;妙临、霁光、玺羽 一、前言 在线广告对于大多数同学来说是一个既熟悉又陌生的技术领域。「搜广推」、「搜推广」等各种组合耳熟能详&#xff0c;但广告和搜索推荐有本质区别&#xff1a;广告解决的是“媒体-广告平台-广告主”等多方优化问题&#xff0c;其中媒…

手机便签app哪个比较好用?

手机便签类软件的种类是比较多的&#xff0c;不管是安卓手机品牌还是苹果手机品牌的手机&#xff0c;在手机的应用商店中搜索“便签”&#xff0c;大家会找到很多便签类软件。那么&#xff0c;手机便签APP哪个比较好用呢&#xff1f; 在选择手机便签APP时&#xff0c;大家比较…

详解原生Spring中的控制反转和依赖注入-构造注入和Set注入

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

Java变量理解

成员变量VS局部变量的区别 语法形式&#xff1a;从语法形式上看&#xff0c;成员变量是属于类的&#xff0c;而局部变量是在代码块或方法中定义的变量或是方法的参数&#xff1b;成员变量可以被 public,private,static 等修饰符所修饰&#xff0c;而局部变量不能被访问控制修饰…

如何高效批量生成条形码?

条形码作为商品、库存和信息管理的基础工具&#xff0c;扮演着至关重要的角色。为了满足用户对于高效、专业、多样化的条形码生成需求&#xff0c;我们推出了一款专业高效的在线条形码生成工具。 网址&#xff1a;https://www.1txm.com/ 多样化条形码支持 易条形支持多种常见…

【算法萌新闯力扣】:旋转链表

力扣题目&#xff1a;旋转链表 开篇 今天是备战蓝桥杯的第25天和算法村开营第3天&#xff01;经过这3天的学习&#xff0c;感觉自己对链表的掌握程度大大地提升&#xff0c;尤其是在帮村里的同学讨论相关问题时。本篇文章&#xff0c;给大家带来一道旋转链表的题目&#xff0c…

leetcode:用队列实现栈(后进先出)

题目描述 题目链接&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 题目分析 我们先把之前写的队列实现代码搬过来 用队列实现栈最主要的是实现栈后进先出的特点&#xff0c;而队列的特点是先进先出&#xff0c;那么我们可以用两个队列来实现 一个队…

PTA-6-48 使用面向对象的思想编写程序描述动物

题目&#xff1a; 使用面向对象的思想编写程序描述动物&#xff0c;说明&#xff1a; &#xff08;1) 分析兔子和青蛙的共性&#xff0c;定义抽象的动物类&#xff0c;拥有一些动物共有的属性&#xff1a;名字、颜色、类别&#xff08;哺乳类、非哺乳类&#xff09;&#xff0c…

Redis 事件轮询

1 Redis 为什么快 数据存在内存中, 直接操作内存中的数据单线程处理业务请求避免了多线的上下文切换, 锁竞争等弊端使用 IO 多路复用支撑更高的网络请求使用事件驱动模型, 通过事件通知模式, 减少不必要的等待… 这些都是 Redis 快的原因。 但是这些到了代码层面是如何实现的呢…

出纳常用的月报表,熬夜做了这8份直接用!

做出纳&#xff0c;公司财务的日报表是必不可少的&#xff0c;收支了多少&#xff0c;支出了多少&#xff0c;这些都是要记录下来的&#xff01; 一份出纳日报表通常包含以下内容&#xff1a; 1. 日期&#xff1a;报告涵盖的具体日期&#xff0c;标明是哪一天的财务数据。 2. 收…

【论文阅读】An Experimental Survey of Missing Data Imputation Algorithms

论文地址&#xff1a;An Experimental Survey of Missing Data Imputation Algorithms | IEEE Journals & Magazine | IEEE Xplore 处理缺失数据最简单的方法就是是丢弃缺失值的样本&#xff0c;但这会使得数据更加不完整并且导致偏差或影响结果的代表性。因此&#xff0c;…

bash编程 数组和for循环的应用

bash编程 数组和for循环的应用 1、问题背景2、bash 定义数组3、for循环遍历输出数组所有元素4、编写bash脚本输出每个端口是否在监听状态 1、问题背景 linux服务器开机后&#xff0c;需要检查一组端口是否在监听&#xff0c;以便判断这些端口对应的服务是否在运行。可以考虑使…

别再让假的fiddler教程毒害你了,来看这套最全最新的fiddler全工具讲解

fiddler界面工具栏介绍 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; &#xff08;1&#xff09;WinConfig&#xff1a;windows 使用了一种叫做“AppContainer”的隔离技术&#xff0c;使得一些流量无法正常捕获&#xff0c;在 fiddler中点击 WinConfig…

轻巧高效的剃须好工具,DOCO黑刃电动剃须刀上手

剃须刀大家都用过&#xff0c;我比较喜欢电动剃须刀&#xff0c;尤其是多刀头的悬浮剃须刀&#xff0c;感觉用起来很方便&#xff0c;剃须效率也很高。最近我在用一款DOCO小蔻的黑刃电动剃须刀&#xff0c;这款剃须刀轻巧易用&#xff0c;而且性价比超高。 相比于同类产品&…