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. XCTF练习题---WEB---disabled_button

    XCTF练习题---WEB---disabled_button flag:cyberpeace{74bcfce0746d18dd8d560e0f0529a8cf} 解题步骤: 1.观察题目,打开场景 ...

  2. SICP 2.2: 层次性数据和闭包性质(Python实现)

    绪论 序对可以为我们提供用于构造复合数据的基本"粘接剂",鉴于Python中tuple中元素不可变的性质,我们通过list来实现序对,如[1, 2].Python的PyListOb ...

  3. 万字长文深度剖析 RocketMQ 设计原理

    幸福的烦恼 张大胖最近是又喜又忧,喜的是业务量发展猛增,忧的是由于业务量猛增,一些原来不是问题的问题变成了大问题,比如说新会员注册吧,原来注册成功只要发个短信就行了,但随着业务的发展,现在注册成功也需 ...

  4. ucontext的简单介绍

    简介 结构体 函数 getcontext setcontext makecontext swapcontext 简介 ucontext.h是GNU C库的一个头文件,主要用于用户态下的上下文切换.需要 ...

  5. 796. Rotate String - LeetCode

    Question 796. Rotate String Solution 题目大意:两个字符串匹配 思路:Brute Force Java实现: public boolean rotateString ...

  6. ASP.NET MVC 处理管线模型

    MVC管道整体处理模型 1.在ASP.NET MVC处理管线中的第一站就是路由模块.当请求到达路由模块后,MVC框架就会根据Route Table中配置的路由模板来匹配当前请求以获得对应的contro ...

  7. ClickHouse(01)什么是ClickHouse,ClickHouse适用于什么场景

    ClickHouse的由来 ClickHouse是什么数据库?ClickHouse速度有多快?应用场景是怎么样的?ClickHouse是关系型数据库吗?ClickHouse目前是很火爆的一款面向OLA ...

  8. Spring bean到底是如何创建的?(上)

    前言 众所周知,spring对于java程序员来说是一个及其重要的后端框架,几乎所有的公司都会使用的框架,而且深受广大面试官的青睐.所以本文就以常见的一个面试题"spring bean的生命 ...

  9. DYOJ 【20220317模拟赛】瞬间移动 题解

    瞬间移动 题意 三维空间中从 \((0,0,0)\) 开始,每次移动 1,问刚好走 \(N\) 次能到 \((X,Y,Z)\) 的方案数 \(N\le10^7\),答案模 \(998244353\) ...

  10. 线程安全性-原子性之Atomic包

    先了解什么是线程安全性:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称为这个类是线程 ...