22-k8s中pod的调度-亲和性affinity

2024-02-20 13:12

本文主要是介绍22-k8s中pod的调度-亲和性affinity,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一·、概述

        在k8s当中,“亲和性”分为三种,节点亲和性、pod亲和性、pod反亲和性;

亲和性分类名称解释说明
nodeAffinity节点亲和性通过【节点】标签匹配,用于控制pod调度到哪些node节点上,以及不能调度到哪些node节点上;(主角node节点)
podAffinitypod亲和性通过【节点+pod】标签匹配,可以和哪些pod部署在同一个节点上(拓扑域);(主角是pod)
podAntiAffinitypod反亲和性通过【节点+pod】标签匹配,与pod亲和性相反,就是和那些pod不在一个节点上(拓扑域);

二、nodeAffinity-节点亲和性

1,给k8s节点创建标签

[root@k8s231 ~]# kubectl label nodes k8s231 k8s=xinjizhiwa-01
node/k8s231 labeled
[root@k8s231 ~]# kubectl label nodes k8s232 k8s=xinjizhiwa-02
node/k8s232 labeled
[root@k8s231 ~]# kubectl label nodes k8s233 k8s=xinjizhiwa-03
node/k8s233 labeled

查看标签

[root@k8s231 dns]# kubectl get nodes --show-labels

2,编辑资源清单设置节点亲和性

[root@k8s231 nodeaffinity]# cat nodeaffinity.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm-affinity
spec: 
  replicas: 20
  selector: 
    matchLabels:
      k8s: xinjizhiwa
  template:
    metadata:
      name: pod-affinity 
      labels:
        k8s: xinjizhiwa
    spec:
      #声明亲和性
      affinity:
        #声明亲和性类型
        nodeAffinity:
          #硬限制,必须满足的条件有哪些?(不满足下面的条件,亲和性就设置失败)
          requiredDuringSchedulingIgnoredDuringExecution:
            #设置节点选择器列表:
            nodeSelectorTerms:
            #声明基于节点的标签进行关联
            - matchExpressions:
              - key: k8s
                values: 
                - xinjizhiwa-03
                - xinjizhiwa-02
                #设置key和value的关系;
                #--In:key==value(必须写value)
                #--NotIn:key !=value(必须写value)
                operator: In
          #软限制,不一定满足,但会优先满足,相当于一高了调度的优先级;
          preferredDuringSchedulingIgnoredDuringExecution:
          #配置权重
          - weight: 10
            #偏向性
            preference:
              #基于节点的标签进行关联
              matchExpressions:
              #节点的标签名称
              - key: k8s
                values:
                - xinjizhiwa-03
                #关联关系,表示key和values的关系
                #In:表示包含关系(value必须写)
                #NotIn:表示不包含(value必须写)
                #Exists: 表示存在关系(不能写value)
                #DoesNotExist:不存在(不能写value)
                #Gt:大于(value必须是一个单一的元素,且值将被解释称一个整数)
                #Lt:小于(value必须是一个单一的元素,且值将被解释称一个整数)
                operator: In
      containers:
      - name: c1
        image: nginx:1.20.1-alpine
        ports:
        - containerPort: 80

3,创建资源

[root@k8s231 nodeaffinity]# kubectl apply -f nodeaffinity.yaml

4,查看pod所在节点,验证亲和性

三、podAffinity-pod的亲和性

        基于“节点标签”进行设置,第一个pod副本创建在了哪个节点上,那么其余副本也会创建在这个节点上;

        拓扑域:节点机器的标签的key和value都相等的机器,就是同一个拓扑域;

1,编辑资源清单设置pod亲和性

[root@k8s231 nodeaffinity]# cat podaffinity.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm-affinity
spec: 
  replicas: 20
  selector: 
    matchLabels:
      k8s: xinjizhiwa
  template:
    metadata:
      name: pod-affinity 
      labels:
        k8s: xinjizhiwa
    spec:
      #声明亲和性
      affinity:
        #声明亲和性类型
        podAffinity:
          #硬限制,必须满足的条件有哪些?(不满足下面的条件,亲和性就设置失败)
          requiredDuringSchedulingIgnoredDuringExecution:
          #设置拓扑域,指定【节点的标签名】
          #【节点key】就是说,设置了拓扑域,pod就会往这个标签的节点进行创建

          #只要满足key是k8s的节点的标签,那么就是同一个拓扑域
          - topologyKey: k8s
            #【pod标签】确定pod的标签,用于二次确认,选中了拓扑域(节点标签的key),再次选中pod标签才能确认调度到哪个节点;
            labelSelector:
              matchExpressions: 

              #意思是说,只要key的值是k8s的pod创建在了哪个节点,“我”就跟随他。也创建在这个节点上;
              - key: k8s
                #如果pod标签,出现了key值相同,value值不同的情况下,就不见设置Exists存在的关系了
                #建议设置:In的方式进行匹配,当然此时Value就不能设置了;
                operator: Exists
      containers:
      - name: c1
        image: nginx:1.20.1-alpine
        ports:
        - containerPort: 80

2,创建资源

[root@k8s231 nodeaffinity]# kubectl apply -f podaffinity.yaml

3,查看pod所在节点

[root@k8s231 nodeaffinity]# kubectl get pods -o wide

四、podAntAffinity-pod的反亲和性

        pod的亲和性:符合拓扑域的范围,指定标签的pod创建在哪里,其他pod就创建在哪里;

        pod的反亲和性:与之相反,符合拓扑域的范围,指定标签的pod创建在哪里,其他pod就不能创建在哪里;

1,编辑资源清单设置pod的反亲和性

[root@k8s231 nodeaffinity]# cat podantaffinity.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm-affinity
spec: 
  replicas: 4
  selector: 
    matchLabels:
      k8s: xinjizhiwa
  template:
    metadata:
      name: pod-affinity 
      labels:
        k8s: xinjizhiwa
    spec:
      #声明亲和性
      affinity:
        #声明亲和性类型
        podAntiAffinity:
          #硬限制,必须满足的条件有哪些?(不满足下面的条件,亲和性就设置失败)
          requiredDuringSchedulingIgnoredDuringExecution:
          #设置拓扑域,指定【节点的标签名】
          #【节点key】就是说,设置了拓扑域,pod就会往这个标签的节点进行创建
          - topologyKey: k8s
            #【pod标签】确定pod的标签,用于二次确认,选中了拓扑域(节点标签的key),再次选中pod标签才能确认调度到哪个节点;
            labelSelector:
              matchExpressions: 
              - key: k8s
                #如果pod标签,出现了key值相同,value值不同的情况下,就不见设置Exists存在的关系了
                #建议设置:In的方式进行匹配,当然此时Value就不能设置了;
                operator: Exists
      containers:
      - name: c1
        image: nginx:1.20.1-alpine
        ports:
        - containerPort: 80
 

2,创建资源

[root@k8s231 nodeaffinity]# kubectl apply -f podantaffinity.yaml

3,查看pod

结论:

1,由于第一pod创建在了k8s232中,所以第二个pod就无法再k8s232中创建;

2,第二个pod就再k8s233中创建了;

3,由于我们是4个副本,k8s231还设置了污点,无法创建pod;

4,所以,我们4个副本,最后只能创建成功2个,剩下两个pending;

至此,亲和性,学习完毕

这篇关于22-k8s中pod的调度-亲和性affinity的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/728318

相关文章

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

90、k8s之secret+configMap

一、secret配置管理 配置管理: 加密配置:保存密码,token,其他敏感信息的k8s资源 应用配置:我们需要定制化的给应用进行配置,我们需要把定制好的配置文件同步到pod当中容器 1.1、加密配置: secret: [root@master01 ~]# kubectl get secrets ##查看加密配置[root@master01 ~]# kubectl get se

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p

云原生之高性能web服务器学习(持续更新中)

高性能web服务器 1 Web服务器的基础介绍1.1 Web服务介绍1.1.1 Apache介绍1.1.2 Nginx-高性能的 Web 服务端 2 Nginx架构与安装2.1 Nginx概述2.1.1 Nginx 功能介绍2.1.2 基础特性2.1.3 Web 服务相关的功能 2.2 Nginx 架构和进程2.2.1 架构2.2.2 Ngnix进程结构 2.3 Nginx 模块介绍2.4

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

用Cri-O,Sealos CLI,Kubeadm方式部署K8s高可用集群

3.6 Cri-O方式部署K8s集群 注意:基于Kubernetes基础环境 3.6.1 所有节点安装配置cri-o [root@k8s-all ~]# VERSION=1.28[root@k8s-all ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensu