Docker 与 K8S学习笔记(二十五)—— Pod的各种调度策略(上)
上一篇,我们学习了各种工作负载的使用,工作负载它会自动帮我们完成Pod的调度和部署,但有时我们需要自己定义Pod的调度策略,这个时候该怎么办呢?今天我们就来看一下如何定义Pod调度策略。
一、NodeSelector:节点定向调度
Kubernetes的Scheduler服务在调度Pod的时候会通过一系列复杂的算法自动计算出每一个Pod的最佳目标节点,但有的时候,我们需要将Pod指定的到一些Node上,比如我们有的Node安装了SSD,磁盘读写高,可以部署一些IO密集型应用,这个时候,我们就需要给这些Node打标签,然后在Pod中定义NodeSelector就可以实现。接下来我们来看一些如何实现:
1、我们通过kubectl label命令给集群中kubevm2打标签:disk=ssd,标示我们kubevm2的磁盘使用SSD。
[root@kubevm1 ~]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kubevm1 Ready master 33d v1.19.16 192.168.56.120 <none> CentOS Linux 7 (Core) 3.10.0-1160.el7.x86_64 docker://1.13.1
kubevm2 Ready <none> 33d v1.19.16 192.168.56.121 <none> CentOS Linux 7 (Core) 3.10.0-1160.el7.x86_64 docker://1.13.1
kubevm3 Ready <none> 33d v1.19.16 192.168.56.122 <none> CentOS Linux 7 (Core) 3.10.0-1160.el7.x86_64 docker://1.13.1
[root@kubevm1 ~]# kubectl label nodes kubevm2 disk=ssd
2、我们在之前deployment的例子中的Pod定义中增加nodeSelector设置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
nodeSelector:
disk: ssd
3、创建此Deployment,查看pod部署位置:我们发现三个副本都部署在kubevm2上。
[root@kubevm1 workspace]# kubectl create -f demo_deployment.yml
deployment.apps/nginx-deployment created
[root@kubevm1 workspace]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-758754644-d2qg5 1/1 Running 0 101s 10.244.1.26 kubevm2 <none> <none>
nginx-deployment-758754644-tsf9f 1/1 Running 0 101s 10.244.1.27 kubevm2 <none> <none>
nginx-deployment-758754644-vxdkm 1/1 Running 0 101s 10.244.1.25 kubevm2 <none> <none>
如果我们给多个Node都定义了相同的标签,则Scheduler会从这组Node中挑选一个可用的Node。我们可以看到通过给Node打标签的方式,我们可以描述集群中具有不同特点的Node,在部署应用时通过结合应用的需求设置NodeSelector进行指定Node范围的调度。这里要注意,如果我们指定了NodeSelector条件,但集群中不存在包含相应标签的Node,即使集群中还有其他可供使用的node,这个Pod也无法被成功调度,就那上面的例子来说,我们希望应用部署在SSD节点上,但如果集群中没有SSD的节点了,使用机械硬盘的节点也能部署,这样的话,使用NodeSelector就无法满足这一需求了。这个时候我们就需要使用节点亲和性调度了。
二、NodeAffinity:节点亲和性调度
NodeAffinity是用于替换NodeSelector的全新调度策略,目前该策略有两种表达方式:
RequiredDuringSchedulingIgnoredDuringExecution:调度器只有在规则被满足的时候才能执行调度。此功能类似于 nodeSelector,但其语法表达能力更强
PreferredDuringSchedulingIgnoredDuringExecution:调度器会尝试寻找满足对应规则的节点。如果找不到匹配的节点,调度器仍然会调度该 Pod。
我们可以看到RequiredDuringSchedulingIgnoredDuringExecution 的特性跟NodeSelector很像,而PreferredDuringSchedulingIgnoredDuringExecution更加灵活一些,我们接下来看一下二者的用法:
1、RequiredDuringSchedulingIgnoredDuringExecution使用
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disk
operator: In
values:
- ssd
我们创建此Deployment,可以看到Pod豆部署在kubevm2上:
[root@kubevm1 workspace]# kubectl create -f demo_deployment.yml
deployment.apps/nginx-deployment created
[root@kubevm1 workspace]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-6ff7bf994d-9dhl2 1/1 Running 0 63s 10.244.1.28 kubevm2 <none> <none>
nginx-deployment-6ff7bf994d-c8xzh 1/1 Running 0 63s 10.244.1.29 kubevm2 <none> <none>
nginx-deployment-6ff7bf994d-xlpg8 1/1 Running 0 63s 10.244.1.30 kubevm2 <none> <none>
2、PreferredDuringSchedulingIgnoredDuringExecution的使用
我们将kubevm2、kubevm3打标签:disk=sata:
[root@kubevm1 workspace] kubectl label nodes kubevm2 disk=sata
node/kubevm2 labeled
[root@kubevm1 workspace] kubectl label nodes kubevm3 disk=sata
node/kubevm3 labeled
修改deployment配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: disk
operator: In
values:
- ssd
- key: disk
operator: In
values:
- ssd
我们创建此Deployment可以看到,即使当前集群中没有ssd的node,Pod仍然可以部署:
[root@kubevm1 workspace]# kubectl create -f demo_deployment.yml
deployment.apps/nginx-deployment created
[root@kubevm1 workspace]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-cff9b7cf7-26hww 1/1 Running 0 81s 10.244.2.15 kubevm3 <none> <none>
nginx-deployment-cff9b7cf7-k9x47 1/1 Running 0 81s 10.244.1.31 kubevm2 <none> <none>
nginx-deployment-cff9b7cf7-xtrq4 1/1 Running 0 81s 10.244.1.32 kubevm2 <none> <none>
在上面的例子中,我们使用到了In操作符,NodeAffinity支持的操作符包括In、NotIn、Exists、DoesNotExist、Gt、Lt等。
OK,以上就是今天的内容了,后面我们继续学习Pod的其他调度策略。
Docker 与 K8S学习笔记(二十五)—— Pod的各种调度策略(上)的更多相关文章
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- Docker 与 K8S学习笔记(十九)—— Pod的配置管理
我们在部署应用时常常会考虑将应用程序与配置文件相分离,这样可以使应用程序更好的复用,并且通过不同配置也能实现更灵活的功能.将应用制作成镜像后,我们可以在启动容器时通过环境变量或挂载文件的方式注入,但是 ...
- Docker 与 K8S学习笔记(十 二)容器间数据共享
数据共享是volume的关键特性,今天我们来看一下通过volume实现容器与host.容器与容器之间共享数据. 一.容器与host共享数据 在上一篇中介绍到的bind mount和docker man ...
- Java基础学习笔记二十五 MySQL
MySQL 在dos中操作mysql 连接mysql命令: mysql -uroot -p密码 ,连接OK,会出现mysql> 对数据库的操作 创建一个库 create database 库名 ...
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- Docker 与 K8S学习笔记(十八)—— Pod的使用
Pod 是一组紧密关联的容器集合,它们共享IPC.Network和UTS namespace,是 Kubernetes 调度的基本单元.Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件 ...
- Docker 与 K8S学习笔记(十)—— 容器的端口映射
我们一般将应用部署在容器里面,而一个服务器上会有许许多多的容器,那么外界该如何访问我们的应用呢?答案是:端口映射. Docker可以将容器对外提供服务的端口映射到host的某个端口上,外网通过此端口访 ...
- PHP学习笔记二十五【类的继承】
<?php //定义父类 class Stu{ public $name; protected $age; protected $grade; private $address;//私有变量不会 ...
- angular学习笔记(二十五)-$http(3)-转换请求和响应格式
本篇主要讲解$http(config)的config中的tranformRequest项和transformResponse项 1. transformRequest: $http({ transfo ...
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...
随机推荐
- uniapp中添加vant组件
首先是npm i vant@2 -S 下载vant包 接下来就是找到main.js引入vant 然后就是在页面中直接使用 会发现没有样式 最后再找到app.vue再style里面全局引入vant的样式 ...
- Edu Cf Round 105 (Div. 2) B. Berland Crossword 1.读懂题, 2. 思维
一. 原题链接 https://codeforces.com/contest/1494/problem/B 二. 题意 + 题解: 没看懂题目, 懵了好久, 先狡辩一下当时误解的句子, 英语是硬伤 ...
- http协议 知识点
前端工程师,也叫Web前端开发工程师.他是随着web发展,细分出来的行业.第一步要学好HTML.CSS和JavaScript!接着就要学习交互,HTTP协议.Tomcat服务器.PHP服务器端技术是必 ...
- partOne讲解思路
讲解思路 分解:把一个复杂的大问题,拆解成更可执行.更好理解的小步骤. 模式识别:找出相似模式,高效解决细分问题. 抽象:聚焦最重要的信息,忽视无用细节. 算法:设计一步一步的解决路径,解决整个问 ...
- 我向PostgreSQL社区贡献的功能:空闲会话超时
经过约八个月的努力,终于完成了 PostgreSQL 空闲会话超时断开的功能. 该功能将在版本 14 中发布. 这是我第一次向 PostgreSQL 提供功能,虽然之前也有向社区提供过补丁,但是这次整 ...
- 类变量_main方法_代码块
需要解决的问题: 统计一共创建了多少个对象 类变量(静态变量) 被所有对象共享 可以通过 类名(推荐)|对象名.变量名 方式来访问 main main 方法 是虚拟机在调用 args 传值灵活 结果 ...
- 开发一款让我们慢慢变好的微信小程序
1. 前言 朋友,你还记得你想学编程最初的目的是什么吗? 先说说我的吧,我最初想学编程的目的只有一点,感觉编程很酷,会写代码的人很厉害!.随着后面参加工作,我马上产生了让我能够在编程这条路上继续走下去 ...
- SmartIDE v0.1.16 已经发布 - 支持阿里&蚂蚁开源的国产 IDE OpenSumi
SmartIDE v0.1.16 (Build 3137) 已经在2022年4月19日发布到稳定版通道,我们在这个版本中增加了阿里和蚂蚁发布的国产IDE OpenSumi的支持,以及其他一些改进.Sm ...
- ZooKeeper 到底解决了什么问题?
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 目标 ZooKeeper 很流行,有个基本的疑问: Zo ...
- 单源最短路问题:OJ5——低德地图
本题就是一道单源最短路问题.由于是稀疏图,我们采用Dijkstra算法. Dijkstra算法原理 Dijkstra算法的步骤 我们把所有的节点分为两个集合:被选中的(visited==1) 和 未被 ...