1、创建一个pod的工作流程

master节点组件

  1. 1apiserver --> etcd
  2. 2scheduler
  3. 3controller-manager

node节点有那些组件

  1. 1kubelet
  2. 2proxy
  3. 3docker

执行kubectl apply -f pod.yaml 会执行的内容

  1. 1kubectlyaml内容转换成json,提交给apiserverapiserver将数据存储在etcd
  2. 2scheduler会监听到创建新pod事件,根据pod属性调度到指定节点,并且给pod打个标签具体是那个节点
  3. 3apiserver拿到调度的结算结果并写到etcd
  4. 4kubeletapiserver获取分配到那台节点上
  5. 5kubelet根据调用docker sock创建容器
  6. 6docker根据kubelet需求创建完容器后将容器状态返回给kubelet
  7. 7kubelet会将pod状态更新到apiserver
  8. 8apiserver将状态数据写入到etcd
  9. 9kubectl get pods

2、Pod中影响调度的主要属性  

  1. resources:{} #资源调度依据
  2. schedulerName: default-scheduler #默认是不需要改
  3. nodeName: "" #根据节点名称进行调度
  4. nodeSelector:{} #根据节点的标签进行调度
  5. affinity: {} #亲和性
  6. tolerations: [] #污点

  

3、资源限制对pod调度的影响

pod和container的资源请求和限制

  1. spec.containers[].resources.limits.cpu #CPU最大使用的资源
  2. spec.containers[].resources.limits.memory #内存最大使用的的资源
  3. spec.containers[].resources.requests.cpu #CPU使用量配置
  4. spec.containers[].resources.requests.memory #内存使用量配置

不指定这个两个值,pod可以使用宿主机的所有资源,时间长可能会造成雪崩效应

  1. requests #资源配额,配置启动需要的资源大小
  2. limits #最大限制,如果不指定,会使用宿主机全部资源
  3. requests #资源配额超出了所有机器可以分配的资源会创建失败

CPU单位:  

  1. 2000m = 2
  2. 1000m = 1
  3. 500m = 0.5
  4. 100m = 0.1

k8s会根据Request的值去找有足够资源的node来调度此pod

例如:

cat deployment.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: web2
  5. spec:
  6. replicas: 1
  7. selector:
  8. matchLabels:
  9. project: demo
  10. app: java
  11. template:
  12. metadata:
  13. labels:
  14. project: demo
  15. app: java
  16. spec:
  17. containers:
  18. - name: web
  19. image: lizhenliang/java-demo
  20. ports:
  21. - containerPort: 8080
  22. resources:
  23. requests: #资源配额,启动需要多少资源
  24. cpu: 500m
  25. memory: 500mi #资源调度的依据
  26. limits: #最大使用配置
  27. cpu: 1
  28. memory: 600mi  

生效配置

  1. kubectl apply -f deployment.yaml 

查询节点资源分配详细情况,可用和已用,pod运行时间等

  1. kubectl describe node node-1

4、nodeSelector & nodeAffinity  

nodeSelector 用于将pod调度到匹配的Label的node上

给节点打标签

  1. kubectl label nodes [node] key=value
  2. kubectl label nodes node-1 disktype=ssd #给节点打标签
  3. kubectl get node --show-labels #查看节点的标签
  4. kubectl get pods --show-labels #查看pod的标签
  5. kubectl get svc --show-labels #查看svc的标签

例子:

给node-1节点打标签

  1. kubectl label nodes node-1 disktype=ssd 

编写清单文件

cat nodeselector.yaml

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: my-pod
  5. spec:
  6. nodeSelector:
  7. disktype: "ssd" #根据标签进行调度,之后调度到有ssd这个标签的机器上
  8. containers:
  9. - name: web
  10. image: lizhenliang/nginx-php 

nodeAffinity:节点亲和类似与nodeSelector

nodeAffinity:节点亲和类似与nodeSelector可根据节点数的标签来约束pod可用调度到那些节点。

nodeAffinity相比nodeSelector:

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

2、调度分软策略和硬策略,而不是硬性要求

  • 硬(required):必须满足
  • 软(preferred):尝试满足

操作符:ln、Notln、Exists、DoesNotExist、Git、Lt

例如:

cat nodeaffinity.yaml

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: with-node-affinity
  5. spec:
  6. affinity:
  7. nodeAffinity:
  8. requiredDuringSchedulingIgnoredDuringExecution:
  9. nodeSelectorTerms:
  10. - matchExpressions:
  11. - key: disktype
  12. operator: In
  13. values:
  14. - ssd
  15. containers:
  16. - name: with-node-affinity
  17. image: nginx

  

5、Taint(污点) 

5.1、Taints:避免pod调度到特定的node上

应用场景:

l  专用节点,例如配置了特殊硬件的节点

l  基于Taint的驱逐  

设置污点

  1. kubectl taint node [node] key=value:Noschedule/PerferNoSchedule/NoExecute 三选一
  2. # 设置node-1污点
  3. kubectl taint node node-1 gpu=yes:Noschedule

查看污点

  1. kubectl describe node | grep Taint

去除污点

  1. kubectl taint node [node] key:effect
  2. kubectl taint node node-2 gpu

其中[effect]可取值

1、Noschedule:一定不能被调度

2、PerferNoSchedule:尽量不要调度

3、NoExecute:不仅不会调度,还会驱逐node上已有的pod

5.2、Tolerations (容忍污点)

Tolerations:允许pod调度到持有Taints的节点上

例如:

cat tolerations.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: web
  6. name: web2
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: web
  12. strategy: {}
  13. template:
  14. metadata:
  15. labels:
  16. app: web4
  17. spec:
  18. tolerations:
  19. - key: "gpu"
  20. operator: "Equal"
  21. value: "yes"
  22. effect: "NoSchedule"
  23. containers:
  24. - image: nginx
  25. name: nginx  

 生效清单文件

  1. kubectl apply -f tolerations.yaml

注意:污点和污点容忍主要是在控制器节点跑特定的pod,如果不配置污点容忍,部署的Pod就不会分配在有污点的节点,也有几率分配到没有污点的节点

6、NodeName

nodeName:用于将Pod调度到指定节点上,不经过调度器scheduler

应用场景:调度器出问题了,无法实现调度,需要指定到指定的节点上

例子:

cat nodename.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: web
  6. name: web2
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: web
  12. strategy: {}
  13. template:
  14. metadata:
  15. labels:
  16. app: web4
  17. spec:
  18. nodeName: node-2
  19. containers:
  20. - image: nginx
  21. name: nginx

7、DaemonSet控制器

DaemonSet功能

  1. 1、在每个node上运行一个pod
  2. 2、新加入的Node也同样会自动运行一个pod
  3. 应用场景:网络插件、监控、agent、日志收集agent

注意:会受污点的影响,有污点的节点不会创建pod

配置容忍污点部署daemonset才会在每个节点上创建pod

例子:

cat daemonset.yaml

  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4. name: web3
  5. spec:
  6. selector:
  7. matchLabels:
  8. project: demo
  9. app: java
  10. template:
  11. metadata:
  12. labels:
  13. project: demo
  14. app: java
  15. spec:
  16. tolerations:
  17. - key: gpu
  18. operator: Equal
  19. value: "yes"
  20. effect: "NoSchedule"
  21. - key: node-role.kubernetes.io/master
  22. effect: NoSchedule
  23. containers:
  24. - name: web
  25. image: lizhenliang/java-demo

调度失败原因的分析  

查看调度结果:

  1. kubectl get pod <podname> -o wide

查看调度失败原因:

  1. kubectl deacribe pod <podname>
  1. 1、节点CPU、内存不足
  2. 2、有污点、没有容忍
  3. 3、没有匹配到节点标签

容器处于pending状态  

  1. 1、正在下载镜像
  2. 2CPU不足: 0/3 nodes are available: 3 Insufficient cpu.
  3. 3、没有匹配标签的节点:0/3 nodes are available: 3 node(s) didn't match node selector
  4. 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资源调度的更多相关文章

  1. [大数据之Yarn]——资源调度浅学

    在hadoop生态越来越完善的背景下,集群多用户租用的场景变得越来越普遍,多用户任务下的资源调度就显得十分关键了.比如,一个公司拥有一个几十个节点的hadoop集群,a项目组要进行一个计算任务,b项目 ...

  2. 架构从最简单的数据访问框架(ORM)到资源调度和治理中心(SOA)说起

    随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构当网站流量很小时,只需一个应用,将 ...

  3. YARN资源调度器

    YARN资源调度器 转载请注明出处:http://www.cnblogs.com/BYRans/ 概述 集群资源是非常有限的,在多用户.多任务环境下,需要有一个协调者,来保证在有限资源或业务约束下有序 ...

  4. YARN应用场景、原理与资源调度

    1.Hadoop YARN产生背景 源于MapReduce1.0 运维成本 如果采用“一个框架一个集群”的模式,则可能需要多个管理员管理这些集群,进而增加运维成本,而共享模式通常需要少数管理员即可完成 ...

  5. Spark系列(七)Master中的资源调度

    资源调度 说明: Application的调度算法有两种,分别为spreadOutApps和非spreadOutApps spreadOutApps 在spark-submit脚本中,可以指定要多少个 ...

  6. Spark Executor Driver资源调度小结【转】

    一.引子 在Worker Actor中,每次LaunchExecutor会创建一个CoarseGrainedExecutorBackend进程,Executor和CoarseGrainedExecut ...

  7. yarn资源调度(网络搜集)

    本文转自:http://www.itweet.cn/2015/07/24/yarn-resources-manager-allocation/ Hadoop YARN同时支持内存和CPU两种资源的调度 ...

  8. Spark Executor Driver资源调度汇总

    一.简介 于Worker Actor于,每次LaunchExecutor这将创建一个CoarseGrainedExecutorBackend流程.Executor和CoarseGrainedExecu ...

  9. Spark Core_资源调度与任务调度详述

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/0593214ae0a5395d1411395169eaabfa.html Spark Core_资源调度与任务 ...

  10. [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结

    本課主題 Master 资源调度的源码鉴赏 [引言部份:你希望读者看完这篇博客后有那些启发.学到什么样的知识点] 更新中...... 资源调度管理 任务调度与资源是通过 DAGScheduler.Ta ...

随机推荐

  1. 故障:fork failed:Resource Temporarily Unavailable解决方案

    故障:fork failed:Resource Temporarily Unavailable解决方案 AIX在一次crontab bkapp.txt导入N多定时任务时候,该用户无法执行任何命令,再s ...

  2. JAVA线程池原理与源码分析

    1.线程池常用接口介绍 1.1.Executor public interface Executor { void execute(Runnable command); } 执行提交的Runnable ...

  3. OpenResty 作者章亦春访谈实录

    [软件简介] OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过众多 ...

  4. robotframework自动化测试框架搭建及问题汇总

    1.安装python RF框架是基于python 的,所以一定要有python环境,python与rf存在兼容性问题,我安装的是python3.7.5,robotframework3.1.2. 选择添 ...

  5. ElasticSearch7.6.1 安装及其head插件安装

    本来打算写一篇ES和Solr的差别的,后来想想算了简单说说吧, 如果是对已存在数据建立完成索引的情况下,Solr更快 一但进行索引的操作的时候,Solr的IO是阻塞的 对于大数据量的实时检索,还是El ...

  6. Java实现随机生成由字母、数字组合的N位随机数

    通过Math.random函数生成所需的字符所有序列,通过判断当前字符是否属于大小写.数字,符合者加入数组内,直到数组存储N位为止,最后把当前数组转为字符串返回调用处. /** * 随机生成由数字.字 ...

  7. Linux:正则表达式1

    正则表达式是以行为单位对字符串进行处理. 1.^ 以xxx开头=>比如在过滤出当前目录下的文件夹.发现文件夹都是以d开头的,那么这个命令就可以这么写 ls -l | grep ^d   过滤出以 ...

  8. jmeter中接口测试出现乱码或不识别中文解决办法

    在查看结果是中出现乱码时:jmeter的bin目录下的jmeter.properties下最下面添加sampleresult.default.encoding=UTF-8后重新打开工具就好了 在接口的 ...

  9. ARL(资产侦察灯塔系统)-源码搭建

    freebuf能力中心开源了一套资产扫描系统(https://github.com/TophantTechnology/ARL),提供docker版,但并无源码搭建的文档(无完整文档).于是在星光哥及 ...

  10. Java架构师方案—多数据源开发详解及原理(二)(附完整项目代码)

    1. mybatis下数据源开发工作 2. 数据源与DAO的关系原理模型 3. 为什么要配置SqlSessionTemplate类的bean 4. 多数据源应用测试 1. mybatis下数据源开发工 ...