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资源调度的更多相关文章

  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. Oracle错误 ora-12514 解决方法-九五小庞

    成功连到数据库上之后,查看listener状态:lsnrctl status status READY 状态,需要由非归档转为归档模式,故操作如下: 1.关闭数据库shutdown immediate ...

  2. idea中右击的快捷键都找不到 Diagrams

    今天突然发现了一件很恐怖的事情,那就是我的IDEA的右击中找不到Diagrams了,因为我是用这个东西打开 .bpmn文件生成png的,突然没了.. 说一下解决吧 在FIle -> settin ...

  3. Mysql批量导入

    这应该是我写Mysql技术的最后一章了吧,短时间内应该不会再写Mysql的文章了,当然疑难杂症除外 insert语句优化 因为之前我也遇到过这样的问题,是我在做数据库适配的时候碰见的,那是我的数据还是 ...

  4. Zabbix value cache working in low memory mode

    Zabbix监控自身时告警"Zabbix value cache working in low memory mode",出现这个问题是因为Zabbix Server的参数Valu ...

  5. 20190923-06Linux文件权限类 000 014

    文件属性 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定.在Linux ...

  6. git 快速入门及常用命令

    身为技术人员,都知道Git是干嘛的.从服务端角度它是代码仓库,可以多人协作.版本控制.高效处理大型或小型项目所有内容:从客户端讲,它能够方便管理本地分支.且与服务端代码的同步,从拉取.合并.提交等等管 ...

  7. pytest文档4-Allure报告清除上一次数据

    前言 大家在执行过几次Allure之后就会发现,Allure的报告会把历史的执行结果都展示出来,但实际工作中我们可能只关心本次的结果,解决的话就需要修改一下执行命令了. 问题: 例如图中显示的第一条其 ...

  8. 万字详解TDengine 2.0整体架构设计思路

    ​导读:涛思数据8月3日将TDengine 的集群功能开源,TDengine具有超强的性能和功能,为什么能做到?它到底有哪些技术创新?今将TDengine的整体设计文档分享出来. 1: 数据模型 物联 ...

  9. 预科班D2

    2020.09.08星期二 预科班D2 学习内容: 一.复习 1.平台: 平台=操作系统+计算机硬件 2.跨平台性 3.文件 文件是指操作系统提供给上层使用者操作硬盘的一种功能.

  10. 深度神经网络conda环境下载

    介绍 因为使用conda下载数据有时候因为网络问题下载非常慢,因此我把conda的环境备份好,到时可以直接使用conda的conda create -n 新环境名字 –clone 环境的路径 , 直接 ...