k8s 资源调度(nodeSelector、nodeAffinity、taint&tolrations、nodeName)

[root@master ~]# kubectl label nodes node2 app=nginx

node/node2 labeled

[root@master ~]# kubectl get nodes node2 --show-labels

NAME STATUS ROLES AGE VERSION LABELS

node2 Ready 5d4h v1.20.0 app=nginx,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux

[root@master ~]# cat jj.yml

apiVersion: v1

kind: Pod

metadata:

name: nginx

namespace: default

spec:

containers:

  • name: nginx

image: nginx

imagePullPolicy: IfNotPresent

nodeSelector:

app: nginx

[root@master ~]# kubectl apply -f jj.yml

pod/nginx created

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

nginx 1/1 Running 0 13s 10.244.2.48 node2

调度失败案例

//取消标签

[root@master ~]# kubectl label nodes node2 app-

node/node2 labeled

//验证

[root@master ~]# kubectl get nodes node2 --show-labels

NAME STATUS ROLES AGE VERSION LABELS

node2 Ready 5d4h v1.20.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux

[root@master ~]# cat jj.yml

apiVersion: v1

kind: Pod

metadata:

name: nginx

namespace: default

spec:

containers:

  • name: nginx

image: nginx

imagePullPolicy: IfNotPresent

nodeSelector:

app: nginx

[root@master ~]# kubectl delete -f jj.yml

pod “nginx” deleted

[root@master ~]# kubectl apply -f jj.yml

pod/nginx created

//这种情况属于等待(也就是说等待某个节点中有app=nginx,一直等,等到那个节点有就给哪个节点)

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

nginx 0/1 Pending 0 14s

//我现在给node2上加标签

[root@master ~]# kubectl get nodes node2 --show-labels #确定node2上没有标签

NAME STATUS ROLES AGE VERSION LABELS

node2 Ready 5d4h v1.20.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux

[root@master ~]# kubectl label nodes node2 app=nginx

node/node2 labeled

//刚刚添加标签

[root@master ~]# kubectl get nodes node2 --show-labels

NAME STATUS ROLES AGE VERSION LABELS

node2 Ready 5d4h v1.20.0 app=nginx,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux

//发现是node2

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

nginx 1/1 Running 0 5m 10.244.2.49 node2

nodeAffinity:节点亲和性,与nodeSelector作用一样。但相比更灵活,满足更多条件

  • 匹配有更多的逻辑组合,不只是字符串的完全相等

  • 调度分为软策略和硬策略,而不是硬性要求

  • 硬(required):必须满足

  • 软(preferred):尝试满足,但不保证

  • 操作符:ln、NotIn、Exists、DoesNotExist、Gt.Lt

//帮助

[root@master ~]# kubectl explain pod.spec.affinity.nodeAffinity

KIND: Pod

VERSION: v1

RESOURCE: nodeAffinity

DESCRIPTION:

Describes node affinity scheduling rules for the pod.

Node affinity is a group of node affinity scheduling rules.

FIELDS:

preferredDuringSchedulingIgnoredDuringExecution <[]Object>

The scheduler will prefer to schedule pods to nodes that satisfy the

affinity expressions specified by this field, but it may choose a node that

violates one or more of the expressions. The node that is most preferred is

the one with the greatest sum of weights, i.e. for each node that meets all

of the scheduling requirements (resource request, requiredDuringScheduling

affinity expressions, etc.), compute a sum by iterating through the

elements of this field and adding “weight” to the sum if the node matches

the corresponding matchExpressions; the node(s) with the highest sum are

the most preferred.

requiredDuringSchedulingIgnoredDuringExecution

If the affinity requirements specified by this field are not met at

scheduling time, the pod will not be scheduled onto the node. If the

affinity requirements specified by this field cease to be met at some point

during pod execution (e.g. due to an update), the system may or may not try

to eventually evict the pod from its node.

示例

第一种(只会在node1)

node1 打两个标签(app=nginx gpu=nvdia)

node2 打一个标签(app=nginx)

  • required:必须满足

  • preferred:尝试满足,但不保证

//node1 打两个标签(app=nginx gpu=nvdia)

[root@master ~]# kubectl label nodes node1 app=nginx gpu=nvdia

node/node1 labeled

//node2 打一个标签(app=nginx)

[root@master ~]# kubectl label nodes node2 app=nginx

node/node2 labeled

[root@master ~]# kubectl get nodes node1 node2 --show-labels

NAME STATUS ROLES AGE VERSION LABELS

node1 Ready 5d4h v1.20.0 app=nginx,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,gpu=nvdia,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux

node2 Ready 5d4h v1.20.0 app=nginx,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux

[root@master ~]# cat yy.yml

apiVersion: v1

kind: Pod

metadata:

name: test

namespace: default

spec:

containers:

  • name: b1

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

affinity:

nodeAffinity:

requiredDuringSchedulingIgnoredDuringExecution:

nodeSelectorTerms:

  • matchExpressions:

  • key: app

operator: In

values:

  • nginx

preferredDuringSchedulingIgnoredDuringExecution:

  • weight: 3

preference:

matchExpressions:

  • key: gpu

operator: In

values:

  • nvdia

[root@master ~]# kubectl apply -f yy.yml

pod/test created

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

test 1/1 Running 1 87s 10.244.1.97 node1

第二种(遵循默认规则,公平竞争)

node1 打一个标签(app=nginx )

node2 打一个标签(app=nginx)

  • required:必须满足

  • preferred:尝试满足,但不保证

//node1 打一个标签(app=nginx)

[root@master ~]# kubectl label nodes node1 app=nginx

node/node1 labeled

//node2 打一个标签(app=nginx)

[root@master ~]# kubectl label nodes node2 app=nginx

node/node2 labeled

[root@master ~]# kubectl get nodes node1 node2 --show-labels

NAME STATUS ROLES AGE VERSION LABELS

node1 Ready 5d5h v1.20.0 app=nginx,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux

node2 Ready 5d5h v1.20.0 app=nginx,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux

[root@master ~]# cat yy.yml

apiVersion: v1

kind: Pod

metadata:

name: test

namespace: default

spec:

containers:

  • name: b1

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

affinity:

nodeAffinity:

requiredDuringSchedulingIgnoredDuringExecution:

nodeSelectorTerms:

  • matchExpressions:

  • key: app

operator: In

values:

  • nginx

preferredDuringSchedulingIgnoredDuringExecution:

  • weight: 3

preference:

matchExpressions:

  • key: gpu

operator: In

values:

  • nvdia

[root@master ~]# kubectl apply -f yy.yml

pod/test created

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

test 1/1 Running 0 6s 10.244.1.98 node1

Taint(污点)& Tolerations(污点容忍)


Taints: 避免Pod调度到特定Node上

TolerationsI: 允许Pod调度到持有Taints的Node上

应用场景:

  • 专用节点:根据业务线将Node分组管理,希望在默认情况下不调度该节点,只有配置了污点容忍才允许分配

  • 配备特殊硬件:部分Node配有SSD硬盘、GPU,希望在默认情况下不调度该节点,只有配置了污点容忍才允许分配

  • 基于Taint的驱逐

给节点添加污点

格式:kubectl taint node [node] key=value:[effect]

例如:kubectl taint node node1 gpu=yes:NoSchedule

验证:kubectl describe node node1 lgrep Taint

去掉污点:kubectl taint node [node] key:[effect]-

//查看污点

[root@master ~]# kubectl describe node node1 node2 master | grep -i taint

Taints:

Taints:

Taints: node-role.kubernetes.io/master:NoSchedule

其中[effect]可取值

  • NoSchedule :一定不能被调度

  • PreferNoSchedule:尽量不要调度,非必须配置容忍

  • NoExecute:不仅不会调度,还会驱逐Node上已有的Pod

添加污点容忍(tolrations)字段到Pod配置中

//案例

apiVersion: v1

kind: Pod

metadata:

name: pod-taints

spec:

containers:

  • name: pod-taints

image: busybox:latest

tolerations:

  • key: “gpu”

operator: “Equal”

value: “yes”

effect: “NoSchedule”

示例

第一种(NoSchedule)

  • 不能被调度

//给node1加污点

[root@master ~]# kubectl taint node node1 node1:NoSchedule

node/node1 tainted

[root@master ~]# kubectl describe node node1 | grep -i taint

Taints: node1:NoSchedule

[root@master ~]# cat yy.yml

apiVersion: v1

kind: Pod

metadata:

name: test

namespace: default

spec:

containers:

  • name: b1

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

[root@master ~]# kubectl apply -f yy.yml

pod/test created

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

test 1/1 Running 0 6s 10.244.2.50 node2

//清除污点

[root@master ~]# kubectl taint node node1 node1:NoSchedule-

node/node1 untainted

[root@master ~]# kubectl describe node node1 | grep -i taint

Taints:

第二种(PreferNoSchedule)

  • 尽量不要调度,也有可能调度

[root@master ~]# kubectl taint node node1 node1:PreferNoSchedule

node/node1 tainted

[root@master ~]# kubectl describe node node1 | grep -i taint

Taints: node1:PreferNoSchedule

[root@master ~]# cat yy.yml

apiVersion: v1

kind: Pod

metadata:

name: test

namespace: default

spec:

containers:

  • name: b1

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

[root@master ~]# kubectl apply -f yy.yml

pod/test created

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

test 1/1 Running 0 3s 10.244.2.51 node2

第三种(NoExecute)

  • 驱逐

  • 不仅不会调度,还会驱逐Node上已有的Pod

[root@master ~]# cat yy.yml

apiVersion: apps/v1

kind: Deployment

metadata:

name: test

namespace: default

spec:

selector:

matchLabels:

app: nginx

template:

metadata:

labels:

app: nginx

spec:

containers:

  • name: b1

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

//去掉node2的标签,留下node1的标签

[root@master ~]# kubectl label nodes node2 app-

node/node2 labeled

[root@master ~]# kubectl get nodes node1 node2 --show-labels

NAME STATUS ROLES AGE VERSION LABELS

node1 Ready 5d6h v1.20.0 app=nginx,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux

node2 Ready 5d6h v1.20.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux

[root@master ~]# kubectl apply -f yy.yml

deployment.apps/test created

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

test-d6cbf6c57-qbpz8 1/1 Running 0 8s 10.244.1.108 node1

//给node1 添加污点后

[root@master ~]# kubectl taint node node1 node1:NoExecute

node/node1 tainted

[root@master ~]# kubectl describe node node1 | grep -i taint

Taints: node1:NoExecute

//此时在node2上

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

test-d6cbf6c57-r8d7l 1/1 Running 0 19s 10.244.2.52 node2

示例

  • 容忍

//帮助

[root@master ~]# kubectl explain deploy.spec.template.spec

KIND: Deployment

VERSION: apps/v1

RESOURCE: spec

DESCRIPTION:

Specification of the desired behavior of the pod. More info:

https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

tolerations <[]Object>

If specified, the pod’s tolerations.

topologySpreadConstraints <[]Object>

TopologySpreadConstraints describes how a group of pods ought to spread

across topology domains. Scheduler will schedule pods in a way which abides

by the constraints. All topologySpreadConstraints are ANDed.

volumes <[]Object>

List of volumes that can be mounted by containers belonging to the pod.

More info: https://kubernetes.io/docs/concepts/storage/volumes

[root@master ~]# cat yy.yml

apiVersion: apps/v1

kind: Deployment

metadata:

name: test

namespace: default

spec:

selector:

matchLabels:

app: nginx

template:

metadata:

labels:

app: nginx

spec:

containers:

  • name: b1

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

tolerations:

  • key: node1

effect: NoExecute #容忍

//污点依然在node1节点上

[root@master ~]# kubectl describe node node1 | grep -i taint

Taints: node1:NoExecute

[root@master ~]# kubectl apply -f yy.yml

deployment.apps/test configured

[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

test-84d56c4b4c-59m89 1/1 Running 0 3s 10.244.1.109 node1 #现在在node1节点上

test-d6cbf6c57-r8d7l 0/1 Terminating 6 12m 10.244.2.52 node2 #已经终止了

nodeName


  • nodeName:指定节点名称,用于将Pod调度到指定的Node上,不经过调度器

[root@master ~]# cat yy.yml

apiVersion: apps/v1

kind: Deployment

metadata:

name: test

namespace: default

spec:

selector:

matchLabels:

app: nginx

template:

metadata:

labels:

app: nginx

spec:

nodeName: node2

containers:

  • name: b1

image: busybox

imagePullPolicy: IfNotPresent

command: [“bin/sh”,“-c”,“sleep 45”]

[root@master ~]# kubectl apply -f yy.yml

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

JavaScript

  • js的基本类型有哪些?引用类型有哪些?null和undefined的区别。

  • 如何判断一个变量是Array类型?如何判断一个变量是Number类型?(都不止一种)

  • Object是引用类型嘛?引用类型和基本类型有什么区别?哪个是存在堆哪一个是存在栈上面的?

  • JS常见的dom操作api

  • 解释一下事件冒泡和事件捕获

  • 事件委托(手写例子),事件冒泡和捕获,如何阻止冒泡?如何组织默认事件?

  • 对闭包的理解?什么时候构成闭包?闭包的实现方法?闭包的优缺点?

  • this有哪些使用场景?跟C,Java中的this有什么区别?如何改变this的值?

  • call,apply,bind

  • 显示原型和隐式原型,手绘原型链,原型链是什么?为什么要有原型链

  • 创建对象的多种方式

  • 实现继承的多种方式和优缺点

  • new 一个对象具体做了什么

  • 手写Ajax,XMLHttpRequest

  • 变量提升

  • 举例说明一个匿名函数的典型用例

  • 指出JS的宿主对象和原生对象的区别,为什么扩展JS内置对象不是好的做法?有哪些内置对象和内置函数?

  • attribute和property的区别

  • document load和document DOMContentLoaded两个事件的区别

  • JS代码调试

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-O8Z22F1B-1712837493837)]

JavaScript

  • js的基本类型有哪些?引用类型有哪些?null和undefined的区别。

  • 如何判断一个变量是Array类型?如何判断一个变量是Number类型?(都不止一种)

  • Object是引用类型嘛?引用类型和基本类型有什么区别?哪个是存在堆哪一个是存在栈上面的?

  • JS常见的dom操作api

  • 解释一下事件冒泡和事件捕获

  • 事件委托(手写例子),事件冒泡和捕获,如何阻止冒泡?如何组织默认事件?

  • 对闭包的理解?什么时候构成闭包?闭包的实现方法?闭包的优缺点?

  • this有哪些使用场景?跟C,Java中的this有什么区别?如何改变this的值?

  • call,apply,bind

  • 显示原型和隐式原型,手绘原型链,原型链是什么?为什么要有原型链

  • 创建对象的多种方式

  • 实现继承的多种方式和优缺点

  • new 一个对象具体做了什么

  • 手写Ajax,XMLHttpRequest

  • 变量提升

  • 举例说明一个匿名函数的典型用例

  • 指出JS的宿主对象和原生对象的区别,为什么扩展JS内置对象不是好的做法?有哪些内置对象和内置函数?

  • attribute和property的区别

  • document load和document DOMContentLoaded两个事件的区别

  • JS代码调试

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Uub7mpyQ-1712837493838)]

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值