Kubernetes Label Selector

Kubernetes-BestPractices

Author:rab


目录

    • 前言
    • 一、Labels
      • 1.1 定义
      • 1.2 案例
        • 1.2.1 节点标签
        • 1.2.2 对象标签
    • 二、Selector
      • 2.1 Node Selector
      • 2.2 Service Selector
      • 2.3 Deployment Selector
      • 2.4 StatefulSet Selector
      • 2.5 DaemonSet Selector
      • 2.6 HorizontalPodAutoscaler Selector
      • 2.7 NetworkPolicy Selector
      • 2.8 Pod Affinity and Anti-Affinity Rules
    • 总结


前言

在 Kubernetes 中,Label 和 Selector 是用于标识和选择对象的两个关键概念,它们在定义和管理资源对象之间的关系和关联时非常有用。

一、Labels

1.1 定义

Label 是键值对(key-value),可以附加到 K8s 对象上,如 Pod、Service、Deployment 等,允许您自定义对象的属性,例如,您可以为一个 Pod 添加标签来指示其用途、环境或拥有者(如 app=web, environment=production, owner=ops)。Label 用于标识和分类对象,以及在不同的上下文中筛选和选择这些对象,但不会对对象的行为产生直接影响。

1.2 案例

1.2.1 节点标签

默认情况下,Scheduler 会将 Pod 调度到所有可用的 Work 节点,不过在某些情况下我们需要将 Pod 部署到指定的 Work 节点,比如将有大量磁盘 I/O 的 Pod 部署到有 SSD 的 work 节点上来保证其 I/O。

kubectl label node k8s-work2 disktype=ssd

如何查看节点的标签?

# 查看所有节点标签
kubectl get node --show-labels# 查看指定节点标签
kubectl get node k8s-work2 --show-labels

image-20231026143640117

那如何根据标签反查询其对应的资源呢?

kubectl get node -l disktype=ssd# 该命令就可以查出哪些节点具备disktype=ssd标签

image-20231026143852724

1.2.2 对象标签

我们除了给节点打标签,也可对 Pod、Service、Deployment 等对象进行标签,一般地,我们会在 yaml 文件直接指定对应资源的标签,当然你也可以通过命令的方式给对象添加标签。

1、命令行模式

kubectl label svc mynginx -n yournamespace env=canary version=v1# 将service资源mynginx打上两个标签,分别为env=canary标签和version=v1标签

2、Yaml 文件的方式

apiVersion: apps/v1
kind: Deployment
metadata:name: example-deployment
spec:selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latest

labels: 处进行标签定义,同样可定义多组标签,该案例的标签为app: my-app

如何查看节点的标签?

# 查看所有service标签
kubectl get svc -n yournamespace --show-labels# 查看指定service标签
kubectl get svc mynginx -n yournamespace --show-labels

那如何根据标签反查询其对应的资源呢?

# 查看所有名称空间下具有version=v1标签的资源
kubectl get svc --all-namespaces -l version=v1# 查看指定名称空间下具有version=v1标签的资源
kubectl get svc -n yournamespace -l version=v1

二、Selector

在 Kubernetes 中,Selectors(选择器)用于根据标签(Labels)来筛选和选择资源对象。Selectors 是用于定义关联性和依赖性,以及在不同对象之间建立关系的关键概念。

2.1 Node Selector

该选择器用于将 Pod 部署到你指定标签的主机节点上,具体 yml 配置如下。

apiVersion: apps/v1
kind: Deployment
metadata:name: nginxlabels:app: demo
spec:replicas: 4selector:matchLabels:app: demotemplate:metadata:labels:app: demospec:containers:- name: nginximage: nginx:1.20.0ports:- containerPort: 80nodeSelector:disktype: ssd

这样的话,我的 Nginx 服务就会部署在节点标签为disktype: ssd 的节点上。

2.2 Service Selector

在 Kubernetes 中,Service 资源通常使用 Selectors 来选择与其关联的 Pod。Service 允许您将请求路由到匹配特定标签的 Pod。例如,您可以创建一个 Service,并使用 Label Selector 来将它关联到特定的应用程序或版本,然后通过 Service 来访问这些 Pod。

apiVersion: apps/v1
kind: StatefulSet
metadata:name: nginxnamespace: myweb-2labels:app: stateful
spec:serviceName: myweb-2replicas: 5updateStrategy:type: RollingUpdateselector:matchLabels:app: demo-2template:metadata:labels:app: demo-2spec:containers:- name: nginximage: nginx:1.21.4ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-srvnamespace: myweb-2
spec:selector:app: demo-2ports:- protocol: TCPport: 80targetPort: 80nodePort: 30334type: NodePort

看 yml 文件最后的 Service 部分 spec.selector 中,app: demo-2 就是指与 Service 关联的 Pod 资源,只要是在该名称空间中具备 app: demo-2 标签的 Pod 都归这个 Service “管理”

2.3 Deployment Selector

在 ReplicaSet 和 Deployment 配置中,Selector 用于确定这些控制器将管理哪些 Pod。当创建 ReplicaSet 或 Deployment 时,您可以指定它们的 Selector,以确保它们管理具有特定标签的 Pod。

apiVersion: v1
kind: Namespace
metadata:name: myweblabels:name: ops
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: myweblabels:app: webdemo
spec:replicas: 3selector:matchLabels:app: demotemplate:metadata:labels:app: demospec:containers:- name: nginximage: nginx:1.21.4ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-srvnamespace: myweb
spec:selector:app: demoports:- protocol: TCPport: 80targetPort: 80nodePort: 30333type: NodePort

看 yml 文件中间的 Deployment 部分 spec.selector.matchLabels 中,app: demo 就是指与 Deployment 关联的 Pod 资源,这些 Pod 都归这个 Deployment “管理”

2.4 StatefulSet Selector

StatefulSet Selector 与 Deployment Selector 类似(这里不再案例演示),它也是使用 Selector 来选择要管理的 Pod。不同之处在于,StatefulSet 管理有状态应用,通常需要将每个 Pod 命名并标记为特定的次序(自动命令)。

2.5 DaemonSet Selector

同样与 Deployment Selector 类似(这里不再案例演示),在 DaemonSet 中,Selector 用于选择在每个节点上运行的 Pod。您可以使用 Label Selector 来确定在哪些节点上运行 DaemonSet 的 Pod。

2.6 HorizontalPodAutoscaler Selector

HorizontalPodAutoscaler(HPA)用于自动缩放 Pod 副本数量,它使用 Label Selector 来选择要自动扩展的 Pod,以根据 CPU 使用率或其他指标来满足应用程序的性能需求。

比如,有一个 Deployment 用于运行应用程序。您希望根据 CPU 使用率来自动扩展 Pod 的数量。在 Deployment 的配置中,您可以使用 Selector 来选择这些 Pod。

apiVersion: apps/v1
kind: Deployment
metadata:name: my-app-deployment
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-app-containerimage: my-app:latest

接下来,您可以创建一个 HorizontalPodAutoscaler 资源来配置自动扩展。

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:name: my-app-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: my-app-deploymentminReplicas: 2maxReplicas: 5metrics:- type: Resourceresource:name: cputargetAverageUtilization: 50

字段说明:

  • scaleTargetRef 字段,以确定要自动扩展的目标 Deployment。
  • minReplicasmaxReplicas 字段,以确定 Pod 副本数量的范围。
  • metrics 字段,以配置要监视的指标。在这里,我们配置了 CPU 使用率,并设置目标平均利用率为 50%。

在这个示例中,HPA 的 Selector 是由 scaleTargetRef 中的目标 Deployment 决定的,因为它会选择要自动扩展的 Pod 副本。要自动扩展其他类型的资源(比如 statefulset 资源),可根据需要调整 scaleTargetRef 的配置即可。

2.7 NetworkPolicy Selector

在 NetworkPolicy 中,Selector 用于定义网络策略,以允许或拒绝特定标签的 Pod 之间的通信,这有助于实施网络安全策略。以下是一个简单的 NetworkPolicy 示例,演示如何使用 Selector 来控制流量:

环境:有两个应用程序,一个是 frontend 应用程序,另一个是 backend 应用程序,你希望 frontend 可以访问 backend,但不希望 frontend 能够与其他应用程序通信。

  • backend 程序

    apiVersion: apps/v1
    kind: Deployment
    metadata:name: backend-app
    spec:selector:matchLabels:app: backendtemplate:metadata:labels:app: backendspec:containers:- name: backend-containerimage: backend-image:latest
    
  • frontend 程序

    apiVersion: apps/v1
    kind: Deployment
    metadata:name: frontend-app
    spec:selector:matchLabels:app: frontendtemplate:metadata:labels:app: frontendspec:containers:- name: frontend-containerimage: frontend-image:latest
    
  • 创建 NetworkPolicy(实现流量控制)

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:name: allow-frontend-to-backend
    spec:podSelector:matchLabels:app: frontendpolicyTypes:- Ingressingress:- from:- podSelector:matchLabels:app: backend
    

    在上述示例中,我们创建了一个名为 allow-frontend-to-backend 的 NetworkPolicy。此 NetworkPolicy 允许 frontend Pod 访问具有 Label app: backendbackend Pod。

    这个 NetworkPolicy 将确保只有 frontend Pod 可以与 backend Pod 通信,而其他 Pod 不允许与它们通信。

2.8 Pod Affinity and Anti-Affinity Rules

在 Kubernetes 中,Pod 亲和性(Affinity)和反亲和性(Anti-Affinity)规则用于定义在节点调度中如何将 Pod 定位到节点的策略。这些规则可以用来优化节点的选择,以满足性能、可用性或其他需求。

比如我们有一个分布式应用程序,其中有两种类型的服务:frontend(前端)backend(后端)。我们希望将 frontendbackend Pod 部署到不同的节点上,以确保可用性。此时我们就可以使用 Pod 反亲和性规则。

  • 创建 Pod 资源并打标签

    下面示例中,frontend Pod 和 backend Pod 都分配了不同的标签。

    apiVersion: v1
    kind: Pod
    metadata:name: frontend-podlabels:app: frontend
    spec:containers:- name: frontend-containerimage: my-frontend-image:latest
    ---
    apiVersion: v1
    kind: Pod
    metadata:name: backend-podlabels:app: backend
    spec:containers:- name: backend-containerimage: my-backend-image:latest
    
  • 建一个 Pod Anti-Affinity 规则

    以确保 frontendbackend Pods 不会被调度到同一节点上。

    apiVersion: apps/v1
    kind: Deployment
    metadata:name: my-app-deployment
    spec:replicas: 3selector:matchLabels:app: frontendtemplate:metadata:labels:app: frontendspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- frontendtopologyKey: kubernetes.io/hostnamecontainers:- name: frontend-containerimage: my-frontend-image:latest
    

    简单的字段解释:

    affinity:定义 Pod 亲和性(Affinity)规则,控制 Pod 如何被调度到节点上。

    podAntiAffinity:定义反亲和性规则,确保 Pod 不会与其他具有相同标签的 Pod 被调度到相同的节点上。

    requiredDuringSchedulingIgnoredDuringExecution:指定规则要求在调度时强制执行。

    labelSelector:定义要匹配的标签选择器。

    matchExpressions:包含一组标签匹配条件。

    key: app:标签的键是 “app”。

    operator: In:使用 “In” 操作符,表示匹配标签值在给定的值列表中。

    values: [frontend]:匹配的值是 “frontend”。

    topologyKey: kubernetes.io/hostname:指定用于节点的拓扑域选择器,这里使用节点主机名作为拓扑域的选择器。

总结

1、Labels

  • 标识应用程序和组件:Labels 可以用于标识和区分不同的应用程序和组件。

    通过为 Pods、Services、Deployments 等资源对象添加适当的 Labels,就可以清晰地了解哪些资源属于哪个应用程序或服务。

  • 环境划分:Labels 可用于将资源对象分组到不同的环境中,例如开发、测试和生产环境。

    这使得可以在不同环境中管理和部署相同的应用程序,同时确保资源的分离和隔离。

  • 版本管理:Labels 可以用于标识不同版本的应用程序或服务。

    这对于在不同版本之间进行滚动升级或回滚非常有用。

  • 拥有者和应用层次结构:Labels 可以用于跟踪资源对象的拥有者,并创建应用层次结构。

    例如,可以使用 Labels 标识哪个 Deployment 管理了哪个 ReplicaSet,ReplicaSet 管理了哪些 Pods。

  • 查询和筛选:Labels 可以用于执行查询和筛选操作,以查找符合特定标准的资源对象。

    这对于执行操作、监控或调试非常有用。

2、Selector

  • Service 选择器:在创建 Kubernetes Service 时,可以使用 Selector 来选择要将流量路由到哪些 Pod。

    可以将 Service 关联到具有特定标签的 Pod,以提供负载均衡和服务发现。

  • Deployment 和 ReplicaSet 选择器:可以使用 Selector 来确定要由这些控制器管理的 Pod。

    可以轻松地将控制器与具有特定标签的 Pod 关联。

  • StatefulSet 选择器:StatefulSet 用于管理有状态的应用程序,如数据库。

    可以使用 Selector 来选择 StatefulSet 管理的 Pod,以确保它们符合特定的标签要求。

  • NetworkPolicy 选择器:在创建 NetworkPolicy 时,可以使用 Selector 来定义允许或拒绝哪些 Pod 之间的网络通信。

    这有助于实施网络安全策略。

  • Pod 亲和性和反亲和性规则:Pod 亲和性和反亲和性规则允许我们根据标签选择器定义 Pod 如何调度到节点上。

    通过定义规则,确保具有特定标签的 Pod 不会调度到同一节点上,以提高可用性和可靠性。

  • DaemonSet 选择器:在创建 DaemonSet 时,可以使用 Selector 来选择在哪些节点上运行 DaemonSet 的 Pod。

    这对于在特定节点上运行系统级任务非常有用。

  • Horizontal Pod Autoscaler (HPA) 选择器:HPA 使用 Selector 来选择目标 Deployment 或 ReplicaSet 中的 Pod,并基于 CPU 使用率等指标来自动扩展或缩小 Pod 副本数量。

  • 自定义控制器选择器:如果您创建自定义控制器,可以使用 Selector 来选择您的控制器要管理的资源对象,以及如何将它们与您的控制器相关联。

—END

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

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

相关文章

POJ 1201 Intervals 线段树

一、题目大意 给我们一些闭区间[ai , bi]&#xff0c;其中 1 < ai < bi < 50000&#xff0c;让我们求出一个集合&#xff0c;使得这个集合与 区间 [ai , bi]有 ci个共同元素&#xff0c;对于所有的 1<i <n个区间而言。 二、解题思路 根据题目范围&#xff0c…

SAP从入门到放弃系列之QM动态修改(Dynamic Modification)

目录 一、 概念二、系统操作 一、 概念 结合样本确定&#xff0c;动态修改也发挥着重要作用。根据先前检验的结果&#xff0c;动态修改会自动减少或增加 样本的大小。设置一定的规则&#xff0c;可以减少或增加检验中涉及的工作&#xff0c;也可节约检验成本。但是注意这种情况…

工业相机常见的工作模式、触发方式

参考&#xff1a;机器视觉——工业相机的触发应用(1) - 知乎 工业相机常见的工作模式一般分为&#xff1a; 触发模式连续模式同步模式授时同步模式 触发模式&#xff1a;相机收到外部的触发命令后&#xff0c;开始按照约定时长进行曝光&#xff0c;曝光结束后输出一帧图像。…

傅立叶级数的意义--傅立叶级数是怎么来的

写这篇文章的起因是14年有道题目&#xff1a; 本题实质上是考察傅立叶级数的意义&#xff0c;因此要求扩大为不能只拘泥于傅里叶级数的计算相关问题&#xff0c;故作此篇。 一、课本上的内容 傅立叶级数&#xff1a; 设函数 f ( x ) f(x) f(x)是周期为 2 l 2l 2l的周期函数&…

应用案例|基于三维机器视觉的机器人引导电动汽车充电头自动插拔应用方案

Part.1 项目背景 人类对减少温室气体排放、提高能源效率以及减少对化石燃料的依赖&#xff0c;加速了电动汽车的普及&#xff0c;然而&#xff0c;电动汽车的充电依然面临一些挑战。传统的电动汽车充电通常需要人工干预&#xff0c;插入和拔出充电头&#xff0c;这不仅可能导致…

计算机中了faust勒索病毒怎么办,faust勒索病毒解密,数据恢复

近年来网络技术得到了飞速发展&#xff0c;为人们的企业生产生活提供了极大便利&#xff0c;但随之而来的网络安全威胁也不断增加&#xff0c;近期&#xff0c;云天数据恢复中心收到了很多企业的求助&#xff0c;企业的计算机服务器遭到了faust勒索病毒攻击&#xff0c;导致企业…

Vue3.0插槽

用法&#xff1a; 父组件App.vue <template><div><!--将html代码插入到子组件中带默认名称的插槽中--><AChild><!--这段html会插入到AChild组件中<slot></slot>插槽中--><!-- 注意&#xff1a;写在父组件中的html代码只能在父组…

ubuntu 18.04 编译安装flexpart 10.4(2023年) —— 筑梦之路

2023年10月29日 环境说明 操作系统版本&#xff1a;ubuntu 18.04 python版本&#xff1a;3.6.9 gcc版本&#xff1a;7.5.0 编译安装路径&#xff1a;/usr/local cmake: 3.10.2 所需要的源码包我已经打包放到我的资源。 2021年1月份已经写过一篇Ubuntu 编译安装的帖子F…

电子器件 二极管

二极管主要是利用其单向导电性&#xff0c;通常用于整流、检波、限幅、元件保护等&#xff0c;在数字电路中常作为开关元件。 一、常用二极管类型 高频二极管 1N4148 等 肖特基二极管 SS14 SS34 SS54 等 快恢复二极管&#xff08;FRD&#xff09; 可以用快恢复二极管代替肖特…

YUV的红蓝颠倒(反色)的原因及解决

原因 UV排列反了。 比如说&#xff0c;NV21和YUV420SP的Y排列相同&#xff0c;UV则相反。给你YUV420SP&#xff0c;你当作NV21保存JPG&#xff0c;就会发生红蓝拿起。 解决办法 就是把UV互换一下。具体代码&#xff1a; NV21转YUV420SP的代码_nv21转yuv420格式-CSDN博客 …

【机器学习可解释性】4.SHAP 值

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP 值5.SHAP 值 高级使用 正文 理解各自特征的预测结果&#xff1f; 介绍 您已经看到(并使用)了从机器学习模型中提取一般解释技术。但是&#xff0c;如果你想要打破模型对单个预测的工作原理? SHAP 值…

C++模板编程和标准模板库(STL)

1、C模板编程 1&#xff09;函数模板 #include <iostream> using namespace std;// 声明一个泛型类型T&#xff0c;参数化数据类型 template <typename T> // 定义一个函数模板 T man(T a, T b) {return (a>b?a:b); }int main() {// 使用的时候没有指定参数类…

开源3D激光(视觉)SLAM算法汇总(持续更新)

原文连接 目录 一、Cartographer 二、hdl_graph_slam 三、LOAM 四、LeGO-LOAM 五、LIO-SAM 六、S-LOAM 七、M-LOAM 八、livox-loam 九、Livox-Mapping 十、LIO-Livox 十一、FAST-LIO2 十二、LVI-SAM 十三、FAST-Livo 十四、R3LIVE 十五、ImMesh 十六、Point-LIO 一、Cartograph…

canvas基础3 -- 交互

点击交互 使用 isPointInPath(x, y) 判断鼠标点击位置在不在图形内 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

拿到 phpMyAdmin 如何获取权限

文章目录 拿到 phpMyAdmin 如何获取权限1. outfile 写一句话木马2. general_log_file 写一句话木马 拿到 phpMyAdmin 如何获取权限 1. outfile 写一句话木马 尝试使用SQL注入写文件的方式&#xff0c;执行 outfile 语句写入一句话木马。 select "<?php eval($_REQU…

电商独立站前端、后端、接口协议和电商API接口请求方式

前端是做什么的&#xff1f;后端是做什么的&#xff1f;哪些事情&#xff0c;是前端做的&#xff1f;哪些事情&#xff0c;是后端做的&#xff1f;前后端一体是什么意思&#xff1f;接口、接口协议、接口请求方式…… 1、前端所写的程序&#xff0c;主要运行在客户端&#xff…

postgresql14管理(六)-备份与恢复

定义 备份&#xff08;backup&#xff09;&#xff1a;通过物理复制或逻辑导出的方式&#xff0c;将数据库的文件或结构和数据拷贝到其他位置进行存储&#xff1b; 还原&#xff08;restore&#xff09;&#xff1a;是一种不完全的恢复。使用备份文件将数据库恢复到备份时的状…

项目|金额场景计算BigDecimal使用简记

前言 在实际项目开发中&#xff0c;我们经常会遇到一些金额计算&#xff0c;分摊等问题&#xff0c;通常我们都使用java.math.BigDecimal 来完成各种计算&#xff0c;避免使用浮点数float,double来计算金额&#xff0c;以免丢失精度&#xff0c;以下是博主部分使用场景和使用Bi…

[Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷

一.Docker 部署 Nginx 以及端口映射 Docker 部署 Nginx,首先需要下载nginx镜像,然后启动这个镜像,就运行了一个nginx的容器了 1.下载 nginx 镜像并启动容器 #查看是否存在nginx镜像:发现没有nginx镜像 [rootlocalhost zph]# docker images | grep nginx#下载nginx镜像 [rootl…

【Spring】IOC容器与Bean的常用属性配置

文章目录 1.前言2.IOC容器2.1 BeanFactory 容器2.2 ApplicationContext 容器 3.Bean的常用属性配置4. 总结 1.前言 在之前的文章-IOC的快速入门中讲过Bean这个概念. 本来就来介绍容器与Bean的常用属性配置 在Spring框架中&#xff0c;Bean指的是被Spring加载生成出来的对象。 …