10、Kubernetes核心技术 - Label标签

news2024/12/23 8:16:16

目录

一、概述

二、Label Selector(标签选择器)

1)、基于等值(Equality-based)

2)、基于集合(Set-based)

三、Label相关操作

(1)、yaml文件定义标签

(2)、查看标签

(3)、筛选标签

(4)、添加标签

(5)、更新标签

(6)、删除标签

三、Label使用场景


一、概述

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

Label的特点:

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

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

示例如下:这是一个有 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

二、Label Selector(标签选择器)

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

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

API 目前支持两种类型的选择算符:基于等值的基于集合的

1)、基于等值(Equality-based)

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

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

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等等。

复杂查询下Selector的示例:

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

三、Label相关操作

(1)、yaml文件定义标签

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

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

(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

(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)、添加标签

给名为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

(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

(6)、删除标签

$ 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的节点上。

三、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定向调度的特性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity VideoPlayer 指定位置开始播放

如果 source是 videoclip&#xff08;以下两种方式都可以&#xff09;&#xff1a; _videoPlayer.Play();Debug.Log("time: " _videoPlayer.clip.length);_videoPlayer.time 10; [SerializeField] VideoPlayer videoPlayer;public void SetClipWithTime(VideoClip…

iTOP-i.MX6ULL开发板修改 samba 配置文件

sudo vi /etc/samba/smb.conf 添加如下内容&#xff1a; 这些信息都是 samba 的说明和设置&#xff0c;把这些复制上&#xff0c;格式要设置对&#xff0c;使用 Tab 键缩进&#xff0c;然后把注释删 除&#xff0c;不然可能会出错。 [ubuntu_samba] comment arm ubuntu sa…

HashMap、LinkedHashMap和TreeMap:你真的了解它们吗?

亲爱的小伙伴们&#xff0c;大家好呀&#xff01;我是小米&#xff0c;一个热衷于技术分享的90后程序员。今天我要和大家聊聊一个在面试中经常会被问到的话题&#xff1a;HashMap、LinkedHashMap、TreeMap的区别。这可是一个非常重要的知识点&#xff0c;不仅在面试中会被频繁提…

linux运维(二)内存占用分析

一、centos内存高&#xff0c;查看占用内存, top命令详解 1.1: free 命令是 free 单位K free -m 单位M free -h 单位Gfree最常规的查看内存占用情况的命令 1.2: 参数说明 total 总物理内存 used 已经使用的内存 free 没有使用的内存 shared 多进程共享内存 buff/cache 读写…

IP应用场景查询API:深入了解网络用户行为的利器

前言 随着数字时代的不断发展&#xff0c;互联网已经成为人们生活的重要组成部分。而随着越来越多的业务和社交活动迁移到在线平台上&#xff0c;了解和理解网络用户行为变得至关重要。为了满足这个需求&#xff0c;IP 应用场景查询 API 崭露头角&#xff0c;成为深入了解网络…

通讯软件017——分分钟学会Kepware OPC UA Server配置

本文介绍如何配置Kepware OPC UA Server&#xff0c;通过本文可以对OPC UA的基本概念有所了解&#xff0c;掌握OPC UA的本质。更多通信资源请登录网信智汇(wangxinzhihui.com)。 1. 创建OPC UA Server 点击“OPC UA Configuration”&#xff0c;弹出配置界面。 点击“添加”&a…

云计算时代的采集利器

大家好&#xff01;在今天的知识分享中&#xff0c;我们将探讨一个在云计算环境中的爬虫应用利器——独享IP。如果你是一名爬虫程序员&#xff0c;或者对数据采集和网络爬虫有浓厚的兴趣&#xff0c;那么这篇文章将向你展示独享IP在云计算环境下的应用价值。 1. 什么是独享IP&…

学生宿舍护眼台灯怎么样选择?适合宿舍使用的五款台灯

众所周知&#xff0c;咱们的学生是作为近视基数最大的群体&#xff0c;平时压力大导致用眼都很频繁&#xff0c;所以有些学生从小就带上了眼睛&#xff0c;大街上更是随处可见戴着近视眼镜的学生&#xff0c;这对于孩子未来的发展很不利&#xff0c;所以众多家长朋友们也都开始…

这可能是最全面的Python入门手册了!

无论是学习任何一门语言&#xff0c;基础知识一定要扎实&#xff0c;基础功非常的重要&#xff0c;找到一个合适的学习方法和资料会让你少走很多弯路&#xff0c; 你的进步速度也会快很多&#xff0c;无论我们学习的目的是什么&#xff0c;不得不说Python真的是一门值得付出时间…

Java8实战-总结22

Java8实战-总结22 使用流数值流原始类型流特化数值范围数值流应用&#xff1a;勾股数 使用流 数值流 可以使用reduce方法计算流中元素的总和。例如&#xff0c;可以像下面这样计算菜单的热量&#xff1a; int calories menu.stream().map(Dish::getcalories).reduce(0, Int…

LeetCode 刷题记录——从零开始记录自己一些不会的

1. 最多可以摧毁的敌人城堡数目 题意 思路 两层循环&#xff0c;太low了 用一个变量记录前一个位置 代码 class Solution { public:int captureForts(vector<int>& forts) {int ans 0, pre -1;for (int i 0; i < forts.size(); i) {if (forts[i] 1 || forts…

如何解决ArcGIS中数据显示乱码问题?

你是否遇到过在ArcGIS中打开文件的时候&#xff0c;却显示乱码的问题呢&#xff1f; 其根本原因是字符编码造成的&#xff0c;这里就来分享一下如何解决在ArcGIS中导入数据后显示乱码的方法。 数据显示乱码 我们这里以一份“移动基站”数据为例&#xff0c;将它直接拖放到Arc…

webserver 同步 I/O 模拟 Proactor 模式的工作流程

一、服务器编程基本框架 虽然服务器程序种类繁多&#xff0c;但其基本框架都一样&#xff0c;不同之处在于逻辑处理。 二、两种高效的事件处理模式 服务器程序通常需要处理三类事件&#xff1a;I/O 事件、信号及定时事件。 有两种高效的事件处理模式&#xff1a;Reactor 和 Pro…

视频监控汇聚平台EasyNVR安防视频平台如何利用视频监控与AI智能识别技术,实现铁塔基站机房的无人值守方案

安防监控EasyNVR可视化视频汇聚管理系统已在全国多地落地部署&#xff0c;视频集中存储EasyNVR平台可提供多协议&#xff08;RTSP/RTMP/GB28181/海康Ehome/大华/海康SDK等&#xff09;的设备视频接入、采集、处理、分发、AI智能检测等服务。平台可以有效解决通信铁塔各基站机房…

redhat7.6安装weblogic12c

目录 一、环境准备 二、使用root创建用户和组 三、创建部署目录 四、上传安装包 五、创建 oraInst.loc 文件 六、创建wls.rsp 响应文件 七、进行安装 八、使用 wlst.sh 离线模式创建一个域 九、启动服务 十、浏览器访问 一、环境准备 REDHAT版本&#xff1a;Redhat…

TheRouter 框架原理

TheRouter 框架入口方法 通过InnerTheRouterContentProvider 注册在AndroidManifest.xml中&#xff0c;在应用启动时初始化 <application><providerandroid:name"com.therouter.InnerTheRouterContentProvider"android:authorities"${applicationId}.…

基于SSM的医院门诊预约挂号系统的设计与

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着医院管理的日益复…

【2023最新版】DataGrip安装及使用教程

目录 一、Jetbrains学生认证 二、DataGrip下载及安装 1. 使用Jetbrains toolbox a. 安装Jetbrains toolbox b. 安装DataGrip 2. 直接安装 a. 官网下载 b. 安装 三、DataGrip的使用 1. 配置默认设置 2. 安装插件 一、Jetbrains学生认证 JetBrains学生认证是JetBrain…

LeetCode 1004.最大连续1的个数

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 硬往题目介绍上边去想的话其实非常困难&#xff0c;如果换种方式思考就会简单许多。 若我们将思想转化为&#xff0c;找出最长的子串(里面含有的0的数量最大为k)&#xff0c;然后返…

WebDAV之π-Disk派盘 + 天天

天天是一款非常简单实用的每日打卡助手,旨在帮助用户制定和跟踪每日或每周的打卡任务,同时提供了自由的选择空间以适应用户的不同需求和偏好。 以下是天天应用的一些主要特性和功能: 1. 优美简洁的用户界面:没有广告,无需网络,可以离线使用,应用大小极小,仅需不到1MB的…