首页 > 编程语言 >k8s 练习 - node 亲和和反亲和

k8s 练习 - node 亲和和反亲和

时间:2023-03-08 23:31:40浏览次数:46  
标签:node busybox name 标签 key 反亲 Pod k8s 节点

假设有 3 个节点,具有一下标签:

节点名

标签

w1

env=prod, plan=a1, kubernetes.io/hostname=w1

w2

env=dev, plan=a2, kubernetes.io/hostname=w2

w3

env=test, plan=a3, kubernetes.io/hostname=w3

一、nodeSelector

可以通过在 Pod 的配置文件中定义一组标签,来指定 Pod 应该被调度到哪些节点上运行。节点上需要拥有与 Pod 标签相匹配的标签,才能接受该 Pod 的调度请求。

# 只会调度到具有 “env=dev” 标签的 w2 节点上
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
nodeSelector:
env: dev

二、nodeName

可以在 Pod 的配置文件中添加如下的 nodeName 字段,指定该 Pod 应该被调度到该节点上:

# 只调度到名为 “w1” 的节点上
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
nodeName: w1

三、affinity

可以在 Pod 的配置文件中添加如下的 affinity 字段,定义 Pod 对节点的亲和和反亲和策略。

亲和与反亲和对目的标签的选择匹配不仅仅支持 and,还支持 In、NotIn、Exists、DoesNotExist、Gt、Lt。

  • In:标签的值存在匹配列表中(匹配成功就调度到目的node, 实现node亲和)
  • NotIn:标签的值不存在指定的匹配列表中(不会调度到目的node, 实现反亲和)
  • Exists:指定的标签存在
  • DoesNotExist:指定的标签不存在
  • Gt:标签的值大于某个值(字符串)
  • Lt: 标签的值小于某个值(字符串)


3.1 硬亲和

requiredDuringSchedulingIgnoredDuringExecution 表示必须满足指定的亲和性或反亲和性规则才能够在节点上进行调度。如果没有符合条件的节点,Pod 会一直保持 Pending 状态,直到有符合条件的节点。

# 该 Pod 将会被调度到具有标签 env 为 dev 的节点上。
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- dev
  • 同个 key 的 values 有多个的情况,只要有一个匹配就可以
# 该 Pod 将会被调度到具有标签 env 为 dev 或 test 的节点上。
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- dev
- test
- xxx
  • 同个 matchExpressions 的 key 有多个的情况,每个 key 都必须要匹配成功一个 value,否则不调度。
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- dev
- xxx
- key: plan
operator: In
values:
- a1
- ax
  • 多个 matchExpressions 的情况下,只有有一个 matchExpressions 能匹配成功就可以调度。
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- dev
- xxx
- matchExpressions:
- key: plan
operator: In
values:
- az
- ax
  • 使用 NotIn 实现反亲和
# pod 将不会调度到含有标签 env 为 dev 的节点上
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: NotIn
values:
- dev

3.2 软亲和

preferredDuringSchedulingIgnoredDuringExecution 表示如果有符合条件的节点可用,则 Pod 将被调度到这些节点上;如果没有符合条件的节点,则 Pod 仍然可以被调度到其他节点上。

# weight 表示匹配调度的优先级,数值越大,优先级越高.
# 条件1不满足时,继续匹配条件2
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.35.0
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
# 条件1
- preference:
matchExpressions:
- key: env
operator: In
values:
- dev
weight: 100
# 条件2
- preference:
matchExpressions:
- key: plan
operator: In
values:
- a1
weight: 80


标签:node,busybox,name,标签,key,反亲,Pod,k8s,节点
From: https://blog.51cto.com/belbert/6108928

相关文章

  • Rocky Linux 9 安装 Node.js
    一、概要1.环境(1)RockyLinux9.1(2)Node.js16.0二、安装1.准备(1)更新仓库sudodnfupdate-y(2)安装NPM依赖的构建工具sudoyumgroupinstall'Deve......
  • k8s--etcd 基本操作
    介绍Etcd是CoreOS基于Raft开发的分布式key-value存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。在分布式系统中,如何管理节点间的状态一......
  • uniapp 使用 socket.io通讯 服务端nodejs+express
    uniapp安装: npmisocket.io-clientonLoad:function(){ var_this=this; _this.socket=io.connect('http://localhost:30000/',{transports:['websock......
  • Node 非服务脚本调试
    缘起最近在弄docsify作为自己的记事本,好处就是用git+markdown方式比较好管理。碰到了个比较麻烦的事,就是要手动去加目录到_sidebar.md中,网上的确有一些开源的脚本做这个事......
  • K8s里containerd作为runc时,相关文件映射到node的具体路径
    containerd为runc时,标准输出(stdout)的日志文件存放在node:/var/log/containerscontainerd为runc时,运行的所有文件(merger层)存放在node:/run/containerd/io.containerd.runti......
  • nodejs服务后台持续运行三种方法
    nodejs服务后台持续运行三种方法 一、利用foreverforever是一个nodejs守护进程,完全由命令行操控。forever会监控nodejs服务,并在服务挂掉后进行重启。1、安装fore......
  • kubeadm 安装1.16.2版本k8s
    环境介绍 环境准备#修改hostnamehostnamectlset-hostnameyour-new-host-name#查看修改结果hostnamectlstatus#设置hostname解析echo"127.0.......
  • K8S 实用工具之六-kubectl-aliases
    开篇......
  • K8s 查询手册
    1kubectl命令1.1资源管理方式1.1.1命令式对象管理kubectlrunnginx-pod--image=nginx:1.17.1--port=801.1.2命令式对象配置kubectlcreate/delete-fnginx......
  • 如何在node中配置环境 以及如何配置生产开发环境变量
    创建环境文件.env.development.env.production写入环境文件内变量修改启动配置package.json文件因window环境下不支持直接配置NODE_ENV=development所以需要......