K8s之标签、Node选择器与亲和性详解

这篇具有很好参考价值的文章主要介绍了K8s之标签、Node选择器与亲和性详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、标签

1、标签是什么?

  • 标签其实就是一对key/value,key的值必须唯一
  • 标签可以在创建一个对象的时候直接定义,也可以在后期随时修改,每一个对象可以拥有多个标签
  • 标签可以用来划分特定的对象(比如版本,服务类型等)
  • 创建标签后,方便我们对资源进行分组管理(通过标签查询资源,通过标签删除资源)
  • 在K8s中,绝大部分资源都可以打标签

2、给Pod打标签

创建一个名为 mypod 的Pod资源,并定义两个标签分别是:app: nginxenv: dev

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
    app: nginx
    env: dev
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

执行yaml文件:

kubectl apply -f pod.yaml

创建后给Pod添加version=1.0标签:

kubectl label pods mypod version=1.0

查看此Pod,标签内容:

kubectl get pod mypod --show-labels

K8s之标签、Node选择器与亲和性详解

3、给Node节点打标签

1、添加 env 标签 针对 k8s-node-1 节点

kubectl label nodes k8s-node-1 env=dev

2、查看标签

kubectl get nodes k8s-node-1 --show-labels

3、删除 env 标签 针对 k8s-node-1 节点

kubectl label nodes k8s-node-1 env-

4、查看标签资源

1、查看默认命名空间下所有Pod资源标签内容:

kubectl get pods --show-labels

2、查看kube-system命名空间下所有Pod资源标签内容:

kubectl get pods -n kube-system --show-labels

3、查看默认默认命名空间下,标签Key=app的Pod资源,不显示标签内容:

kubectl get pods -l app

4、查看默认默认命名空间下,标签Key=app的Pod资源,并显示标签内容:

kubectl get pods -L app

5、查看所有命名空间下,所有Pod资源的标签内容:

kubectl get pods --all-namespaces --show-labels

6、查看所有Node节点标签

kubectl get nodes --show-labels

二、Node选择器

Node选择器是指,我们在创建Pod资源时指定该Pod资源运行在那台Node节点上,默认schedule会根据资源随机调度到一个工作节点,但是我们可以通过nodeName、nodeSelector在指定运行到那台Node节点。

1、nodeName(指定Pod调度到指定Node节点)

指定Pod资源调度到指定的Node节点,如下文件指定该Pod运行在k8s-node-1 节点

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
    app: nginx
    env: dev
spec:
  nodeName: k8s-node-1  # 运行在k8s-node-1节点
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

执行资源文件:

kubectl apply -f pod.yaml

可以看到该Pod调度到 k8s-node-1 节点了:

kubectl get pods -o wide

K8s之标签、Node选择器与亲和性详解

2、nodeSelector(指定Pod调度到具有指定标签的Node节点)

指定Pod资源调度到具有哪些标签的节点上,需要注意 当使用nodeSelector 选择了多个标签,会调度到都满足此标签的节点上,并非满足其中一个标签!

如下配置将,该Pod资源调度到具有 name=work 的节点上

at pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
    app: nginx
    env: dev
spec:
  nodeSelector:
    name: work
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

我们查看Pod信息时会发现 当前Pod状态处于Pending 状态,就是带决策调度到那台节点上,因为我们并没有具有 name=work 的节点,下面我们给节点打标签

kubectl label nodes k8s-node-1 name=work

当我们再次查看时,Pod会处于Running状态,并调度到了指定节点。

kubectl get pods -o wide

三、亲和性

1、Node亲和性-nodeAffinity

K8S中的Node亲和性是指将Pod调度到特定的节点上的能力,通过使用Node亲和性,可以将Pod调度到具有特定硬件、软件或其他特定属性的节点上,以满足应用程序的需求。例如,可以将需要GPU支持的Pod调度到具有GPU的节点上,以获得更好的性能。

我们可以使用 explain 帮助命令查看:

kubectl explain pod.spec.affinity.nodeAffinity
  • prefered软亲和性:表示有节点尽量满足这个位置定义的亲和性,并不是一个必须的条件。

  • require硬亲和性:表示必须有节点满足这个配置定义的亲和性,这是个硬性条件。

1、定义Node硬亲和性 示例如下:

cat pod-require-affinity.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-nginx
  namespace: default
  labels:
    app: nginx
    env: dev
spec:
  affinity:
    nodeAffinity:                                     # 定义Node亲和性
      requiredDuringSchedulingIgnoredDuringExecution: # 定义硬亲和性
        nodeSelectorTerms:                           
        - matchExpressions:                 # 根据标签选择Node
          - key: env                        # 定义标签key 
            operator: In                    # IN:等于
            values:                         # 定义标签values(或者关系)
            - dev                           # 调度到具有env=dev 或者 env=test 的标签Node节点
            - test
        
  containers:
  - name: nginx-1
    image: nginx
    imagePullPolicy: IfNotPresent
    ports: 
    - containerPort: 80 

执行后并不会创建Pod,因为没有满足标签的Node节点:

kubectl apply -f pod-require-affinity.yaml	

打标签,env=test 后则会调度到此Node节点上

kubectl label node k8s-master  env=test
kubectl get pods

2、定义Node软亲和性 示例如下:

cat pod-prefered-affinity.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-nginx-prefered
  namespace: default
  labels:
    env: uat
    app: nginx
spec:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:   # 软亲和性
      - preference:
          matchExpressions:                           # 根据标签选择Node
          - key: zone                  
            operator: In
            values:
            - foo
            - bar
        weight: 10                                    # 权重值

  containers:
  - name: pod-nginx-prefered
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

执行后 会看到创建的Pod资源,即使没有满足标签的Node节点,也会找一台Node创建Pod资源

kubectl apply -f pod-prefered-affinity.yaml
kubectl get pods

2、Pod亲和性-podAffinity

Pod亲和性是指将一组Pod调度到同一台物理主机或逻辑分区中的能力。这种亲和性可以用于确保相关的Pod在同一台主机上运行,以便它们可以更快地进行通信,或者为了提高可靠性,以便它们可以共享相同的存储或网络资源。

我们可以使用 explain 帮助命令查看:

kubectl explain pod.spec.affinity.podAffinity
  • prefered软亲和性:表示有节点尽量满足这个位置定义的亲和性,并不是一个必须的条件。

  • require硬亲和性:表示必须有节点满足这个配置定义的亲和性,这是个硬性条件。

1、定义两个Pod,第二个Pod调度到第一个Pod所在节点上。

第一个Pod资源清单如下:

cat pod-podaffinity-1.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-affinity-1
  namespace: default
  labels:
    app: nginx
    env: uat

spec:
  containers:
  - name: nginx
    image: nginx

第二个Pod资源清单如下:

cat pod-podaffinity-2.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-affinity-2
  namespace: default
  labels:
    app: nginx
    env: uat
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:  # 硬亲和性
      - labelSelector: 
          matchExpressions:
          - key: app             # 定义 Pod的key
            operator: In         # In = =
            values: 
            - nginx              # 定义Pod的value,意思指调度到具有app=nginx标签的Pod所在节点
        topologyKey: kubernetes.io/hostname # 定义Node节点key,用于匹配节点判断是否在同一台服务器

  containers:
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ["sh","-c","sleep 3600"]

按照顺序执行,第二个Pod会调度到第一个Pod所在Node节点上。

kubectl apply -f pod-podaffinity-1.yaml
kubectl apply -f pod-podaffinity-2.yaml

3、Pod反亲和性-podAntiAffinity

和上面Pod亲和性相反,两组Pod不会调度到同一台物理服务器上。

1、定义两个Pod,第二个Pod,禁止调度到第一个Pod所在节点。

第一个Pod资源清单:

cat pod-1.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  namespace: default
  labels:
    app: nginx
    env: uat

spec:
  containers:
  - name: nginx
    image: nginx

第二个Pod资源清单:

cat pod-2.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  namespace: default

spec:
  affinity:
    podAntiAffinity:   # Pod反亲和性
      requiredDuringSchedulingIgnoredDuringExecution:
      - topologyKey: kubernetes.io/hostname
        labelSelector: # 标签匹配 app=nginx
          matchExpressions:
          - key: app
            operator: In
            values: 
            - nginx
  containers:
  - name: nginx
    image: nginx

执行文件,两个Pod不会调度到同一个节点文章来源地址https://www.toymoban.com/news/detail-465863.html

kubectl apply -f pod-1.yaml
kubectl apply -f pod-2.yaml

到了这里,关于K8s之标签、Node选择器与亲和性详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s~节点的亲和性

    在Kubernetes中,你可以使用节点亲和性(Node Affinity)来控制Pod部署在哪些节点上。通过配置节点亲和性,你可以指定一些规则,以确保多个服务不会被调度到同一个节点上。 requiredDuringSchedulingIgnoredDuringExecution:通过 requiredDuringSchedulingIgnoredDuringExecution ,可以定义在调度期间必

    2024年02月13日
    浏览(42)
  • k8s之亲和性、污点

    目录 亲和性 键值运算关系 硬策略 软策略 Pod亲和性与反亲和性 污点(Taint) 和 容忍(Tolerations) 污点(Taint)  容忍(Tolerations) 维护操作 故障排除步骤 官方介绍:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/ (1)节点亲和性 pod.spec.nodeAffinity ●preferredDuringSchedulingIgnore

    2024年02月06日
    浏览(39)
  • 22-k8s中pod的调度-亲和性affinity

            在k8s当中,“亲和性”分为三种,节点亲和性、pod亲和性、pod反亲和性; 亲和性分类 名称 解释说明 nodeAffinity 节点亲和性 通过【节点】标签匹配,用于控制pod调度到哪些node节点上,以及不能调度到哪些node节点上;(主角node节点) podAffinity pod亲和性 通过【节点+

    2024年02月20日
    浏览(50)
  • K8s Pod亲和性、污点、容忍度、生命周期与健康探测详解(下)

    🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 五、健康探测 1、健康探测的概念 2、Pod启动探测(Startup Probe) 3、Pod存活探测(Liveness Probe) 4、Pod就绪探测(Readiness Probe) 5、Pod健康探测在故障转移与

    2024年04月08日
    浏览(50)
  • pod的亲和性和反亲和性

    调度策略:       匹配标签        操作符              拓扑域   调度目标 node的亲和性    主机标签  In Notin exists doesexists Gt Lt  不支持   指定主机 pod的亲和性     pod的标签 In Notin exists doesexists      支持   pod和指定标签的pod部署在同一拓扑域 pod的反亲

    2024年01月23日
    浏览(44)
  • Kubernetes亲和性学习笔记

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本文是欣宸在学习Kubernetes调度器的过程中,对亲和性相关知识点的整理和总结,这是一篇笔记性质的博客 调度过程如下: 预选(Predicates) 优选(Priorities) 选定(Select) 这里将亲和性先分类,便

    2024年02月17日
    浏览(37)
  • k8s 标签和选择器

    标签 标签是附体在k8s 资源对象的一组键值对,其存在的意义是按照用户的意图来组织资源,同时不对资源的核心逻辑产生影响。 标签名: ○ 标签名部分是必须的。 ○ 不能多余 63 个字符。 ○ 必须由字母、数字开始和结尾。 ○ 可以包含字母、数字、减号(-)、下划线(

    2024年02月08日
    浏览(36)
  • k8s如何给node添加标签

    k8s集群如果由大量节点组成,可将节点打上对应的标签,然后通过标签进行筛选及查看,更好的进行资源对象的相关选择与匹配 [root@master01 ~]# kubectl label node worker02 region=guanzhou node/worker02 labeled [root@master01 ~]# kubectl get nodes -L region NAME       STATUS   ROLES                  AGE  

    2024年02月07日
    浏览(33)
  • k8s标签选择器使用详解

    目录 一、标签选择器来源 二、什么是标签选择器 2.1 标签选择器概述 2.2 标签选择器概述属性

    2023年04月08日
    浏览(31)
  • K8s的亲和、反亲和、污点、容忍

    亲和性的原理其实很简单,主要利用label标签结合nodeSelector选择器来实现 从pod出发,可以分成亲和性和反亲和性,分别对应podAffinity和podAntiAffinity。 从node出发,也可以分成亲和性和反亲和性,分别对应nodeAffinity和nodeAntiAffinity。 从操作指令来讲,可以有ln、Notln、Exists、DoesN

    2024年04月27日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包