5-kunernetes资源调度
1、创建一个pod的工作流程
master节点组件
- 1、apiserver --> etcd
- 2、scheduler
- 3、controller-manager
node节点有那些组件
- 1、kubelet
- 2、proxy
- 3、docker
执行kubectl apply -f pod.yaml 会执行的内容
- 1、kubectl将yaml内容转换成json,提交给apiserver,apiserver将数据存储在etcd中
- 2、scheduler会监听到创建新pod事件,根据pod属性调度到指定节点,并且给pod打个标签具体是那个节点
- 3、apiserver拿到调度的结算结果并写到etcd中
- 4、kubelet从apiserver获取分配到那台节点上
- 5、kubelet根据调用docker sock创建容器
- 6、docker根据kubelet需求创建完容器后将容器状态返回给kubelet
- 7、kubelet会将pod状态更新到apiserver
- 8、apiserver将状态数据写入到etcd
- 9、kubectl get pods
2、Pod中影响调度的主要属性
- resources:{} #资源调度依据
- schedulerName: default-scheduler #默认是不需要改
- nodeName: "" #根据节点名称进行调度
- nodeSelector:{} #根据节点的标签进行调度
- affinity: {} #亲和性
- tolerations: [] #污点
3、资源限制对pod调度的影响
pod和container的资源请求和限制
- spec.containers[].resources.limits.cpu #CPU最大使用的资源
- spec.containers[].resources.limits.memory #内存最大使用的的资源
- spec.containers[].resources.requests.cpu #CPU使用量配置
- spec.containers[].resources.requests.memory #内存使用量配置
不指定这个两个值,pod可以使用宿主机的所有资源,时间长可能会造成雪崩效应
- requests #资源配额,配置启动需要的资源大小
- limits #最大限制,如果不指定,会使用宿主机全部资源
- requests #资源配额超出了所有机器可以分配的资源会创建失败
CPU单位:
- 2000m = 2核
- 1000m = 1核
- 500m = 0.5核
- 100m = 0.1核
k8s会根据Request的值去找有足够资源的node来调度此pod
例如:
cat deployment.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: web2
- spec:
- replicas: 1
- selector:
- matchLabels:
- project: demo
- app: java
- template:
- metadata:
- labels:
- project: demo
- app: java
- spec:
- containers:
- - name: web
- image: lizhenliang/java-demo
- ports:
- - containerPort: 8080
- resources:
- requests: #资源配额,启动需要多少资源
- cpu: 500m
- memory: 500mi #资源调度的依据
- limits: #最大使用配置
- cpu: 1
- memory: 600mi
生效配置
- kubectl apply -f deployment.yaml
查询节点资源分配详细情况,可用和已用,pod运行时间等
- kubectl describe node node-1
4、nodeSelector & nodeAffinity
nodeSelector 用于将pod调度到匹配的Label的node上
给节点打标签
- kubectl label nodes [node] key=value
- kubectl label nodes node-1 disktype=ssd #给节点打标签
- kubectl get node --show-labels #查看节点的标签
- kubectl get pods --show-labels #查看pod的标签
- kubectl get svc --show-labels #查看svc的标签
例子:
给node-1节点打标签
- kubectl label nodes node-1 disktype=ssd
编写清单文件
cat nodeselector.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: my-pod
- spec:
- nodeSelector:
- disktype: "ssd" #根据标签进行调度,之后调度到有ssd这个标签的机器上
- containers:
- - name: web
- image: lizhenliang/nginx-php
nodeAffinity:节点亲和类似与nodeSelector
nodeAffinity:节点亲和类似与nodeSelector可根据节点数的标签来约束pod可用调度到那些节点。
nodeAffinity相比nodeSelector:
1、匹配有更多的逻辑组合,不只是字符串的完全相等
2、调度分软策略和硬策略,而不是硬性要求
- 硬(required):必须满足
- 软(preferred):尝试满足
操作符:ln、Notln、Exists、DoesNotExist、Git、Lt
例如:
cat nodeaffinity.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: with-node-affinity
- spec:
- affinity:
- nodeAffinity:
- requiredDuringSchedulingIgnoredDuringExecution:
- nodeSelectorTerms:
- - matchExpressions:
- - key: disktype
- operator: In
- values:
- - ssd
- containers:
- - name: with-node-affinity
- image: nginx
5、Taint(污点)
5.1、Taints:避免pod调度到特定的node上
应用场景:
l 专用节点,例如配置了特殊硬件的节点
l 基于Taint的驱逐
设置污点
- kubectl taint node [node] key=value:Noschedule/PerferNoSchedule/NoExecute 三选一
- # 设置node-1污点
- kubectl taint node node-1 gpu=yes:Noschedule
查看污点
- kubectl describe node | grep Taint
去除污点
- kubectl taint node [node] key:effect
- kubectl taint node node-2 gpu
其中[effect]可取值
1、Noschedule:一定不能被调度
2、PerferNoSchedule:尽量不要调度
3、NoExecute:不仅不会调度,还会驱逐node上已有的pod
5.2、Tolerations (容忍污点)
Tolerations:允许pod调度到持有Taints的节点上
例如:
cat tolerations.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- labels:
- app: web
- name: web2
- spec:
- replicas: 1
- selector:
- matchLabels:
- app: web
- strategy: {}
- template:
- metadata:
- labels:
- app: web4
- spec:
- tolerations:
- - key: "gpu"
- operator: "Equal"
- value: "yes"
- effect: "NoSchedule"
- containers:
- - image: nginx
- name: nginx
生效清单文件
- kubectl apply -f tolerations.yaml
注意:污点和污点容忍主要是在控制器节点跑特定的pod,如果不配置污点容忍,部署的Pod就不会分配在有污点的节点,也有几率分配到没有污点的节点
6、NodeName
nodeName:用于将Pod调度到指定节点上,不经过调度器scheduler
应用场景:调度器出问题了,无法实现调度,需要指定到指定的节点上
例子:
cat nodename.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- labels:
- app: web
- name: web2
- spec:
- replicas: 1
- selector:
- matchLabels:
- app: web
- strategy: {}
- template:
- metadata:
- labels:
- app: web4
- spec:
- nodeName: node-2
- containers:
- - image: nginx
- name: nginx
7、DaemonSet控制器
DaemonSet功能
- 1、在每个node上运行一个pod
- 2、新加入的Node也同样会自动运行一个pod
- 应用场景:网络插件、监控、agent、日志收集agent
注意:会受污点的影响,有污点的节点不会创建pod
配置容忍污点部署daemonset才会在每个节点上创建pod
例子:
cat daemonset.yaml
- apiVersion: apps/v1
- kind: DaemonSet
- metadata:
- name: web3
- spec:
- selector:
- matchLabels:
- project: demo
- app: java
- template:
- metadata:
- labels:
- project: demo
- app: java
- spec:
- tolerations:
- - key: gpu
- operator: Equal
- value: "yes"
- effect: "NoSchedule"
- - key: node-role.kubernetes.io/master
- effect: NoSchedule
- containers:
- - name: web
- image: lizhenliang/java-demo
调度失败原因的分析
查看调度结果:
- kubectl get pod <podname> -o wide
查看调度失败原因:
- kubectl deacribe pod <podname>
- 1、节点CPU、内存不足
- 2、有污点、没有容忍
- 3、没有匹配到节点标签
容器处于pending状态
- 1、正在下载镜像
- 2、CPU不足: 0/3 nodes are available: 3 Insufficient cpu.
- 3、没有匹配标签的节点:0/3 nodes are available: 3 node(s) didn't match node selector
- 4、没有污点容忍:0/3 nodes are available: 1 node(s) had taint {disktype: ssd}, that the pod didn't tolerate, 1 node(s) had taint {gpu: yes}, that the pod didn't tolerate, 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.
5-kunernetes资源调度的更多相关文章
- [大数据之Yarn]——资源调度浅学
在hadoop生态越来越完善的背景下,集群多用户租用的场景变得越来越普遍,多用户任务下的资源调度就显得十分关键了.比如,一个公司拥有一个几十个节点的hadoop集群,a项目组要进行一个计算任务,b项目 ...
- 架构从最简单的数据访问框架(ORM)到资源调度和治理中心(SOA)说起
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构当网站流量很小时,只需一个应用,将 ...
- YARN资源调度器
YARN资源调度器 转载请注明出处:http://www.cnblogs.com/BYRans/ 概述 集群资源是非常有限的,在多用户.多任务环境下,需要有一个协调者,来保证在有限资源或业务约束下有序 ...
- YARN应用场景、原理与资源调度
1.Hadoop YARN产生背景 源于MapReduce1.0 运维成本 如果采用“一个框架一个集群”的模式,则可能需要多个管理员管理这些集群,进而增加运维成本,而共享模式通常需要少数管理员即可完成 ...
- Spark系列(七)Master中的资源调度
资源调度 说明: Application的调度算法有两种,分别为spreadOutApps和非spreadOutApps spreadOutApps 在spark-submit脚本中,可以指定要多少个 ...
- Spark Executor Driver资源调度小结【转】
一.引子 在Worker Actor中,每次LaunchExecutor会创建一个CoarseGrainedExecutorBackend进程,Executor和CoarseGrainedExecut ...
- yarn资源调度(网络搜集)
本文转自:http://www.itweet.cn/2015/07/24/yarn-resources-manager-allocation/ Hadoop YARN同时支持内存和CPU两种资源的调度 ...
- Spark Executor Driver资源调度汇总
一.简介 于Worker Actor于,每次LaunchExecutor这将创建一个CoarseGrainedExecutorBackend流程.Executor和CoarseGrainedExecu ...
- Spark Core_资源调度与任务调度详述
转载请标明出处http://www.cnblogs.com/haozhengfei/p/0593214ae0a5395d1411395169eaabfa.html Spark Core_资源调度与任务 ...
- [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结
本課主題 Master 资源调度的源码鉴赏 [引言部份:你希望读者看完这篇博客后有那些启发.学到什么样的知识点] 更新中...... 资源调度管理 任务调度与资源是通过 DAGScheduler.Ta ...
随机推荐
- 故障:fork failed:Resource Temporarily Unavailable解决方案
故障:fork failed:Resource Temporarily Unavailable解决方案 AIX在一次crontab bkapp.txt导入N多定时任务时候,该用户无法执行任何命令,再s ...
- JAVA线程池原理与源码分析
1.线程池常用接口介绍 1.1.Executor public interface Executor { void execute(Runnable command); } 执行提交的Runnable ...
- OpenResty 作者章亦春访谈实录
[软件简介] OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过众多 ...
- robotframework自动化测试框架搭建及问题汇总
1.安装python RF框架是基于python 的,所以一定要有python环境,python与rf存在兼容性问题,我安装的是python3.7.5,robotframework3.1.2. 选择添 ...
- ElasticSearch7.6.1 安装及其head插件安装
本来打算写一篇ES和Solr的差别的,后来想想算了简单说说吧, 如果是对已存在数据建立完成索引的情况下,Solr更快 一但进行索引的操作的时候,Solr的IO是阻塞的 对于大数据量的实时检索,还是El ...
- Java实现随机生成由字母、数字组合的N位随机数
通过Math.random函数生成所需的字符所有序列,通过判断当前字符是否属于大小写.数字,符合者加入数组内,直到数组存储N位为止,最后把当前数组转为字符串返回调用处. /** * 随机生成由数字.字 ...
- Linux:正则表达式1
正则表达式是以行为单位对字符串进行处理. 1.^ 以xxx开头=>比如在过滤出当前目录下的文件夹.发现文件夹都是以d开头的,那么这个命令就可以这么写 ls -l | grep ^d 过滤出以 ...
- jmeter中接口测试出现乱码或不识别中文解决办法
在查看结果是中出现乱码时:jmeter的bin目录下的jmeter.properties下最下面添加sampleresult.default.encoding=UTF-8后重新打开工具就好了 在接口的 ...
- ARL(资产侦察灯塔系统)-源码搭建
freebuf能力中心开源了一套资产扫描系统(https://github.com/TophantTechnology/ARL),提供docker版,但并无源码搭建的文档(无完整文档).于是在星光哥及 ...
- Java架构师方案—多数据源开发详解及原理(二)(附完整项目代码)
1. mybatis下数据源开发工作 2. 数据源与DAO的关系原理模型 3. 为什么要配置SqlSessionTemplate类的bean 4. 多数据源应用测试 1. mybatis下数据源开发工 ...