pod 分配给特定的node节点

目的:在一般业务场景,有些pod需要运行在特定的物理节点上,可以通过kubernetes的nodeSelector、nodeName安排pod到指定的节点上运行。

# 采用nodeselect节点选择器的方法:
# 为 test-nodelete-2节点打上标签。
$ kubectl label nodes test-nodelete-2 disk=ssd
node/test-nodelete-2 labeled
$ kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
test-nodelete-1 Ready <none> 14d v1.20.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=ingress,kubernetes.io/arch=amd64,kubernetes.io/hostname=test-nodelete-1,kubernetes.io/os=linux
test-nodelete-2 Ready <none> 14d v1.20.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,ingress=ingress,kubernetes.io/arch=amd64,kubernetes.io/hostname=test-nodelete-2,kubernetes.io/os=linux
test-nodelete-3 Ready <none> 14d v1.20.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=ingress,kubernetes.io/arch=amd64,kubernetes.io/hostname=test-nodelete-3,kubernetes.io/os=linux $ cat > nodeschedule.yaml << EOF
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-select
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disk: ssd
EOF # 采用nodeName的方法:
# 如果不用节点选择器,直接用指定节点名,可以无视Taints,可以被调度。但会被NoExcute Taint影响, 如果节点存在NoExcute, 那将不能运行在该节点上。
$ cat > nodeName.yaml << EOF
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-app
spec:
nodeName: test-nodelete-2 # schedule pod to specific node
containers:
- name: nginx-web
image: nginx
imagePullPolicy: IfNotPresent
EOF

Taints(污点) and Tolerations(容忍)

目的:Taints 是允许node节点排斥一组pod。Tolerations 允许程序调度pod到具有污点的 node节点上。Tolerations 允许调度但不保证调度。taints和Tolerations一起工作,以确保 Pod 不会被调度到不合适的节点上。一个或多个taints应用于一个节点;这标志着该节点不接受任何不容忍污点的 pod。

NoSchedule: 设置为不调度到该节点

PreferNoSchedule: 设置为尽量不调度到该节点

NoExecute: 设置为不调度到该节点和驱逐原来该节点已有存量的pod

# 向节点添加污点
$ kubectl taint nodes node1 key1=value1:NoSchedule
# 解释:在 node1上设置一个污点。污点具有键key1、值value1和污点效果NoSchedule。node1这意味着除非具有匹配的容限,否则任何 pod 都无法调度到node1节点。 # 去除节点污点
$ kubectl taint nodes node1 key1=value1:NoSchedule- # 节点加上taints为NoSchedule,pod资源是不会调度到node1节点。
$ kubectl taint nodes node1 key1=value1:NoSchedule
$ cat > taints.yaml << EOF
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-taints
labels:
env: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
EOF # 为 pod 指定一个tolerations(容忍度)。以下两个容忍“匹配”由kubectl taint上面的行创建的污点(key1=value1:NoSchedule),因此具有容忍的 pod 都可以调度到node1节点。
$ cat > taints-and-tolerations.yaml << EOF
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-taints-tolerations
labels:
env: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "key1"
value: "value1"
operator: "Equal"
effect: "NoSchedule"
EOF # 当operator为Equal时,key和value都要匹配到上述taints指定的key1=value1,key和value都满足条件即可以容忍该污点,pod运行在node1节点上。
# 当operator为Exists时,key或value其中一个匹配到上述taints指定的key1=value1,满足条件即可以容忍该污点,pod运行在node1节点上。
tolerations:
- key: "key1"
value: "value1"
operator: "Equal"
effect: "NoSchedule" # 如果NoExecute被添加到一个节点,那么任何不容忍该 taint 的 pod 将立即被驱逐,而容忍该 taint 的 pod 将永远不会被驱逐。NoExecute效果的容忍可以指定一个可选`tolerationSeconds`字段,该字段指示在添加污点后 pod 将保持绑定到节点的时间。
$ kubectl taint nodes node1 execute=yes:NoExecute
- key: "execute"
value: "yes"
effect: "NoExecute"
# tolerationSeconds: 3600

Node Affinity

nodeSelector是将 Pod 约束到具有特定标签的节点的最简单方法。Affinity 和 anti-affinity 扩展了您可以定义的约束类型。如果同时指定nodeSelector和nodeAffinity,则必须同时满足两者才能将 Pod 调度到节点上。.

  • 亲和/反亲和语言更具表现力。nodeSelector仅选择具有所有指定标签的节点。Affinity/anti-affinity 让您可以更好地控制选择逻辑。
  • 您可以指示一条规则是soft或preferred,这样即使找不到匹配的节点,调度程序仍然会调度 Pod。
  • 您可以使用在该节点上运行的其他 Pod 上的标签来约束 Pod,而不仅仅是节点标签,这允许您定义哪些 Pod 可以在一个节点上共存的规则。

节点亲和性(Node Affinity)在概念上类似于nodeSelector,允许您根据节点标签限制您的 Pod 可以调度的节点。有两种类型的节点亲和性:

  • requiredDuringSchedulingIgnoredDuringExecution:除非满足规则,否则调度程序无法调度 Pod。此函数类似于nodeSelector,但具有更具表现力的语法。
  • preferredDuringSchedulingIgnoredDuringExecution: 调度器尝试寻找符合规则的节点。如果匹配的节点不可用,调度程序仍会继续调度 Pod运行。

    # 注意:上述类型中,IgnoredDuringExecution表示如果 Kubernetes 调度 Pod 后节点标签发生变化,则 Pod 继续运行.
$  cat > nodeAffinity.yaml << EOF
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-nodeaffinity
labels:
env: nodeaffinity
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "test-nodelete-3"
operator: In
values:
- "yes"
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: "disk"
operator: In
values:
- "ssd"
tolerations:
- key: "active"
operator: "Exists"
effect: "NoSchedule"
EOF # requiredDuringSchedulingIgnoredDuringExecution规则解释:
# 该node节点必须具有带有键的标签为test-nodelete-3,并且该标签的值必须是:yes # preferredDuringSchedulingIgnoredDuringExecution规则解释:
# 调度器尝试寻找带有键为disk,值为ssd的node节点。如果匹配的节点不可用,调度程序仍会继续调度 Pod运行。 # tolerations(容忍)规则解释:
# 容忍程序调度pod到具有污点(taints)node节点上, 污点键为active的node。 # operator字段指定 Kubernetes 在解释规则时使用的逻辑运算符。您可以使用In、NotIn、Exists、DoesNotExist和 Gt、Lt。NotIn和DoesNotExist允许您定义节点反亲和行为。

pod 亲和性(affinity)和pod反亲和性(antiaffinity)

pod 亲和性和反亲和性根据节点上已经运行的 Pod 的标签, 而不是根据node节点标签来限制 pod调度到节点上。

注意:Pod 亲和性和反亲和性需要大量资源处理调度,这会在大型集群中的减慢调度速度。不建议在超过数百个节点的集群中使用它。

$ cat > pod-affinity.yaml << EOF
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-pod-affinity
spec:
replicas: 3
selector:
matchLabels:
podaffinity: app
template:
metadata:
labels:
podaffinity: app
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "env"
operator: In
values:
- "nginx"
topologyKey: "kubernetes.io/hostname"
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- "web"
topologyKey: "kubernetes.io/hostname"
tolerations:
- key: "active"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: nginx
image: nginx
ports:
- containerPort: 8088
EOF # requiredDuringSchedulingIgnoredDuringExecution 亲和性规则解释:
# 当一个或多个node节点上的Pod 具有env=nginx标签, 且pod都位于同一区域或同一类服务器时,调度程序才能将 Pod 调度到节点上 。更准确地说,调度程序必须将 Pod 放置在具有 topologyKey="kubernetes.io/hostname"标签的node节点上,且该区域node节点有一个或多个node节点 的Pod 具有env=nginx标签。 # preferredDuringSchedulingIgnoredDuringExecution 反亲和性解释:
# 表示调度程序应尽量避免将 Pod 调度到一个或多个node节点上的Pod具有app=web标签的node节点上,更准确地说,具有topologyKey="kubernetes.io/hostname"标签的node节点上,调度程序必免将pod运行在该区域node节点的pod具有app=web标签的节点上。 # tolerations(容忍)规则解释:
# 容忍程序调度pod到具有污点(taints)node节点上, 污点键为active的node。 # Pod亲和性(podAffinity)规则告诉调度程序将每个副本放置在具有app=web标签的 Pod 的节点上。Pod 反亲和性(podAntiAffinity)规则告诉调度器避免调度到具有env=nginx标签的 Pod 的节点上。
$ cat > nginx-pod-affinity.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-web
spec:
selector:
matchLabels:
app: store
replicas: 3
template:
metadata:
labels:
app: store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: "kubernetes.io/hostname"
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: env
operator: In
values:
- nginx
topologyKey: "kubernetes.io/hostname"
containers:
- name: nginx-server
image: nginx
EOF

参考文献

kubernetes官方文档

kubernetes 调度的更多相关文章

  1. # kubernetes调度之nodeName与NodeSelector

    系列目录 Kubernetes的调度有简单,有复杂,指定NodeName和使用NodeSelector调度是最简单的,可以将Pod调度到期望的节点上. 本文主要介绍kubernetes调度框架中的No ...

  2. kubernetes调度之pod优先级和资源抢占

    系列目录 Pod可以拥有优先级.优先意味着相对于其它pod某个pod更为重要.如果重要的pod不能被调度,则kubernetes调度器会优先于(驱离)低优先级的pod来让处于pending状态的高优先 ...

  3. 【有容云干货-容器系列】Kubernetes调度核心解密:从Google Borg说起

    在之前“容器生态圈脑图大放送”文章中我们根据容器生态圈脑图,从下至上从左至右,依次介绍了容器生态圈中8个组件,其中也提到Kubernetes ,是一个以 Google Borg 为原型的开源项目.可实 ...

  4. 从零开始入门 K8s | Kubernetes 调度和资源管理

    作者 | 子誉  蚂蚁金服高级技术专家 关注"阿里巴巴云原生"公众号,回复关键词"入门",即可下载从零入门 K8s 系列文章 PPT. Kubernetes 调 ...

  5. Kubernetes 调度器实现初探

    Kubernetes 调度器 Kubernetes 是一个基于容器的分布式调度器,实现了自己的调度模块.在Kubernetes集群中,调度器作为一个独立模块通过pod运行.从几个方面介绍Kuberne ...

  6. 第18 章 : Kubernetes 调度和资源管理

    Kubernetes 调度和资源管理 这节课主要讲三部分的内容: Kubernetes 的调度过程: Kubernetes 的基础调度能力(资源调度.关系调度): Kubernetes 高级调度能力( ...

  7. 彻底搞懂kubernetes调度框架与插件

    调度框架 [1] 本文基于 kubernetes 1.24 进行分析 调度框架(Scheduling Framework)是Kubernetes 的调度器 kube-scheduler 设计的的可插拔 ...

  8. 巧用Prometheus来扩展kubernetes调度器

    Overview 本文将深入讲解 如何扩展 Kubernetes scheduler 中各个扩展点如何使用,与扩展scheduler的原理,这些是作为扩展 scheduler 的所需的知识点.最后会完 ...

  9. kubernetes 调度器

    调度器 kube-scheduler 是 kubernetes 的核心组件之一,主要负责整个集群资源的调度功能,根据特定的调度算法和策略,将 Pod 调度到最优的工作节点上面去,从而更加合理.更加充分 ...

随机推荐

  1. crontab和cron表达式详解

    引言 我们在定时任务中经常能接触到cron表达式,但是在写cron表达式的时候我们会遇到各种各样版本的cron表达式,比如我遇到过5位.6位甚至7位的cron表达式,导致我一度搞混这些表达式.更严重的 ...

  2. 玩转ASP.NET 6.0框架-序言

    ASP.NET Core是微软提供的强大的web框架,它有很多潜在的强大而有用的功能. 本专栏的目标是帮助您把框架的隐藏能力最大限度地发挥出来,让您能够按需定制ASP NET Core框架.本专栏提供 ...

  3. 219. Contains Duplicate II - LeetCode

    Question 219. Contains Duplicate II Solution 题目大意:数组中两个相同元素的坐标之差小于给定的k,返回true,否则返回false 思路:用一个map记录每 ...

  4. 141_Power Query之获取钉钉审批流自动刷新Power BI报告

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 钉钉办公给很多企业带来了很多方便,比如审批流线上化,通用化.线上化填写后,数据自动获取又是一个硬伤了,虽然数据可 ...

  5. Android Studio中一套代码多版本打包

    一套代码达到以下效果: 打包不同applicationId能同时安装在同一手机上 不同logo,app名称, 不同第三方SDK接入配置(例如微信分享appid,激光推送appkey) 能区分debug ...

  6. Es6语法+v-on参数相关+vue虚拟dom

    Es6的语法 Es5:if和for 都没有块级作用域,函数function有作用域. Es6:加入let使得if和for有作用域 .建议: 在Es6中优先使用const,只有需要改变某一个标识符的时候 ...

  7. Django-Model随笔

    Django数据库之Model 常用命令 生成迁移文件 python manage.py makemigrations 实行数据库迁移 python manage.py migrate 数据库表结构反 ...

  8. Ceph集群搭建记录

    环境准备 基础环境 node00 192.168.247.144 node00 node01 192.168.247.135 node01 node02 192.168.247.143 node02 ...

  9. Java 进阶路线图

    前言 个人的从事Java开发行业已经也有一段时间,提升自己的Java水平,特整理下学习路线图,以备日后使用. 路线图资料收集 图片打不开,建议使用复制链接打开:或者私信告诉我. Java架构师学习路线 ...

  10. 深入C++04:模板编程

    模板编程 函数模板 模板意义:对类型也进行参数化: 函数模板:是不编译的,因为类型不知道 模板的实例化:函数调用点进行实例化,生成模板函数 模板函数:这才是要被编译器所编译的 函数模板.模板的特例化. ...