首页 > 其他分享 >Kubernetes亲和性学习笔记

Kubernetes亲和性学习笔记

时间:2023-07-20 09:04:37浏览次数:38  
标签:name Kubernetes -- 亲和性 笔记 nginx pod 节点

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本文是欣宸在学习Kubernetes调度器的过程中,对亲和性相关知识点的整理和总结,这是一篇笔记性质的博客

kubernetes默认调度器的调度过程:

  • 调度过程如下:
  1. 预选(Predicates)
  2. 优选(Priorities)
  3. 选定(Select)

亲和性一览

  • 这里将亲和性先分类,便于理解
graph LR A(亲和性)-->B1(节点亲和性); A-->B2(Pod亲和性); B1-->C1(硬亲和性-required); B1-->C2(软亲和性-preferred); B2-->C3(硬亲和性-required); B2-->C4(软亲和性-preferred); B2-->C5(反亲和性);

节点亲和性和pod亲和性的区别

  • 举个例子,假设给小明分配班级(小明是pod,班级是节点)
  1. 节点亲和性:直接告诉小明,你去一年级

  2. pod亲和性:从小朋友中找出和小明同年的,找到了小张,发现小张是一年级的,于是让小明去一年级

节点亲和性:硬亲和性

  • requiredDuringSchedulinglgnoredDuringExecution:用于定义节点硬亲和性

  • nodeSelectorTerm:节点选择器,可以有多个,之间的关系是逻辑或,即一个nodeSelectorTerm满足即可

  • matchExpressions:匹配规则定义,多个之间的关系是逻辑与,即同一个nodeSelectorTerm下所有matchExpressions定义的规则都匹配,才算匹配成功

  • 示例:

apiVersion: v1
kind: Pod
metadata:
  name: with-required-nodeaffinity
spec:
  affinity:
    nodeAffinity: 
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - {key: zone, operator: In, values: ["foo"]}
  containers:
  - name: nginx
    image: nginx
  • 功能与nodeSelector类似,用的是匹配表达式,可以被理解为新一代节点选择器
  • 不满足硬亲和性条件时,pod为Pending状态
  • 在预选阶段,节点硬亲和性被用于预选策略MatchNodeSelector

节点亲和性:软亲和性

  • 特点:条件不满足时也能被调度

  • 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy-with-node-affinity
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 60
            preference:
              matchExpressions:
              - {key: zone, operator: In, values: ["foo"]}
          - weight: 30
            preference:
              matchExpressions:
              - {key: ssd, operator: Exists, values: []}
      containers:
      - name: nginx
        image: nginx
  • 集群中的节点,由于标签不同,导致的优先级结果如下:

image-20220228154031823

  • 在优选阶段,节点软亲和性被用于优选函数NodeAffinityPriority

  • 注意:NodeAffinityPriority并非决定性因素,因为优选阶段还会调用其他优选函数,例如SelectorSpreadPriority(将pod分散到不同节点以分散节点故障导致的风险)

  • pod副本数增加时,分布的比率会参考节点亲和性的权重

Pod亲和性(podAffinity)

  • 如果需求是:新增的pod要和已经存在pod(假设是A)在同一node上,此时用节点亲和性是无法完成的,因为A可能和节点没啥关系(可能是随机调度的),此时只能用pod亲和性来实现

  • pod亲和性:一个pod与已经存在的某个pod的亲和关系,需要通过举例来说明

  1. 创建一个deployment,这个pod有标签app=tomcat
kubectl run tomcat -l app=tomcat --image tomcat:alpine
  1. 创建pod,需求是和前面的pod在一起,使用pod亲和性来实现:
apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity-1
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - {key: app, operator: In, values: ["tomcat"]}
        topologyKey: kubernetes.io/hostname
  containers:
  - name: nginx
    image: nginx
  1. 调度逻辑:
graph TD A[1. 用matchExpressions的规则app=tomcat搜索] -->B(2. 找到tomcat的pod,也就确定了该pod的节点,假设是A节点) B --> C(3. topologyKey是kubernetes.io/hostname,所以去找A节点kubernetes.io/hostname标签的值,假设是xxx) C --> D(4. 将新的pod调度到kubernetes.io/hostname=xxx的节点)
  1. 表面上看,最终只是根据hostname去调度的,但如果topologyKey的值是多个节点所拥有的,就更有通用性了,如下图,topologyKey等于filure-domain.beta.kubernetes.io/zone:

image-20220228163933279

  • 硬亲和:requiredDuringSchedulingIgnoredDuringExecution
  • 软亲和:preferredDuringSchedulingIgnoredDuringExecution

Pod反亲和(podAntiAffinity)

  • 与亲和性相反,将当前pod调度到满足匹配条件之外的节点上
  • 适用场景:
  1. 分散同一类应用
  2. 将不同安全级别的pod调度至不同节点
  • 示例如下,匹配表达式和自身标签一致,作用是分散同一类应用,让相同pod不要调度到同一个节点:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-with-pod-anti-affinity
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      name: myapp
      labels:
        app: myapp
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - {key: app, operator: In, values: ["myapp"]}
            topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: nginx
  • 如果集群中只有三个节点,那么执行上述yaml的结果就是最多创建三个pod,另一个始终处于pending状态

参考

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

标签:name,Kubernetes,--,亲和性,笔记,nginx,pod,节点
From: https://www.cnblogs.com/bolingcavalry/p/17567286.html

相关文章

  • git学习笔记——pull时与本地修改有冲突无法拉取
    在本地仓库的项目中修改代码后,若团队其他人也修改了代码,此时pull同步极有可能冲突失败强制使用远程仓库的修改覆盖本地修改#首先先远程下载最新的版本,但不合并先gitfetch--all#然后用刚刚下载的版本内容覆盖本地的内容gitreset--hardorigin/master......
  • JavaScript学习笔记01(包含ES6语法)
    Js简介什么是Js?Js最初被创建的目的是“使网页更生动”。Js写出来的程序被称为脚本,Js是一门脚本语言。被直接写在网页的HTML中,在页面加载的时候自动执行脚本被以纯文本的形式提供和执行,不需要特殊的准备或编译即可运行(JINcompiler)Js不仅可以在浏览器中执行,也可以......
  • 「学习笔记」自动机家族
    OI中所说的「自动机」一般都指「确定有限状态自动机」。一个确定有限状态自动机(DFA)由以下五部分构成:字符集(\(\Sigma\)),该自动机只能输入这些字符。状态集合(\(Q\))。如果把一个DFA看成一张有向图,那么DFA中的状态就相当于图上的顶点。起始状态(\(start\)),\(start\inQ\),是一......
  • K210笔记
    MaixPy文档K210学习笔记@嘉楠官网todo......
  • 「学习笔记」FHQ-treap
    FHQ-treap,即无旋treap,又称分裂合并treap,支持维护序列,可持久化等特性。FHQ-treap有两个核心操作,分裂与合并。通过这两个操作,在很多情况下可以比旋转treap等方便的实现一些操作。FHQ-treap与其他的平衡树相比,他最明显的优点是:它好写!!!,想象一下,在考场上,你用较短的时间写出FH......
  • python笔记:第十一章正则表达式
    1.模块re以一定规则,快速检索文本,或是实现一些替换操作默认下,区分大小写2.常见的匹配字符表字符描述\d代表任意数字,就是阿拉伯数字0-9这些\D代表非数字的字符。与\d完全相反\w代表字母,数字,下划线。也就是a-z、A-Z、0-9、_\W跟\w相反,代表不是字母......
  • StarRocks Segment源码阅读笔记--Page的组成
    Page由4部分组成PageBody,PageFooter,FooterSize(4),CheckSum(4)PageBody是由page类型决定的,可能是压缩的。PageFooter是经过序列化的PageFooterPB。它包含page_type、未压缩的body大小和其他通用的元数据。如果PageBody的大小和未压缩的body大小一致,则表示这个page是未压缩的。F......
  • 特征平台笔记
    AI从2012年开始快速发展,在人脸识别、广告、个性化推荐等领域大规模商用后,陆续出现了一些通用的平台来加速模型训练和模型部署流程,例如:AWSSageMaker :通过完全托管的基础设施、工具和工作流程为任何用例构建、训练和部署机器学习(ML)模型Google VertexAI :使用全代管式机......
  • XOps笔记
     当前是 Ops盛行的时代,在互联网圈内的你一定经常都会听到这些名词,DevOps、DevSecOps、GitOps、NetOps、ItOps、Aiops、DataOps、MLOps、NoOps;无论是什么Ops,它的目标都是利用DevOps的最佳实践去实现效率和规模经济,并确保可靠性、可重用性和可重复性,同时减少技术和流程的重复,从......
  • 主席树学习笔记
    Tip:建议完成LuoguP3919后阅读。目录模板:静态区间\(k\)小值模板:动态区间\(k\)小值BZOJ3207:花神的嘲讽计划疯狂的颜色序列SPOJ10628:CountonatreeLuoguP3302森林模板题:静态区间\(k\)小值思路引导首先我们想一想,如何用线段树求数列\(k\)小值。我们可以建......