前言
本文记录了Pod调度策略,Pod标签管理,Pod资源配额与限额,全局资源配额与限额策略
一、Pod调度策略
调度分配
调度是将Pod分配到合适的计算节点上,然后对应节点上的kubelet运行这些Pod
kube-scheduler是默认调度器,是集群的核心组件
调度器的工作原理
调度器通过k8s的监测(Watch)机制发现集群中尚未被调度到节点上的Pod,调度器依据调度原则将Pod分配到一个合适的节点上运行
调度流程
调度器给一个Pod做调度选择包含两个步骤:筛选和打分
筛选
首先筛选出满足Pod所有的资源请求的节点,这里包含计算资源、内存、存储、网络、端口号等,如果没有节点满足Pod需求,Pod将一直停留在Pending状态,直到调度器能够找到合适节点运行它
打分
打分阶段,调度器会根据打分规则,为每一个可调度节点进行打分,选出得分最高的节点来运行Pod,如果存在多个得分最高的节点,调度器会从中随即选取一个
绑定
在确定某个节点运行Pod后,调度器会将这个调度决定通知给kube-apiserver,这个过程叫绑定
Pod定向调度
基于节点名称的调度
在创建Pod时,可以配置相关的调度规则,从而让Pod运行在制定的节点上
-nodeName标签在spec下声明目标主机的名字
ps:如果指定标签的节点无法运行Pod,它不会迁移到其他节点,将会一直等待下去
标签与Pod调度
标签管理
标签(Labels)是附加到kubernetes对象上的键值对
标签的用途
k8s在创建、删除、修改资源对象的时候可以使用标签来确定要修改的资源对象,在Pod调度的任务中,使用标签可以更家灵活的完成调度任务
标签可以在创建的时候附加到对象,也可以在创建之后随时添加和修改,标签可以用于组织和选择对象的子集
查看筛选标签
使用 --show-lables查询标签
管理标签语法格式
设置标签 : kubectl label 资源类型 [资源名称] =
删除标签 : kubectl label 资源类型 [资源名称] -
查看标签 : kubectl get 资源类型 [资源名称] --show-labels
使用标签选择 : kubectl get 资源类型 [资源名称] -l =
Pod标签调度
标签选择运算符
与名称和UID不同,标签不支持唯一性。通过标签选择运算符,客户端/用户可以识别一组对象
标签选择运算符可以由多个需求组成,在多个需求下,必须满足所有需求,相当于逻辑与(&&)运算符
spec.nodeSelector可以在指定拥有该标签的主机
Pod资源管理
资源管理概述
当多个应用共享固定节点数目的集群时,人们担心某些应用无法获得足够的资源,从而影响到其正常运行,需要设置一些规则,用来保证应用能获得其运行所需资源
CPU资源类型
内存资源类型
详情见学习日志三
使用方法:在spec.containers.resources.requests.memory指定内存资源配额
resources是资源策略
requests是配额策略
memory是内存资源配额
将memory换为cpu就可以指定计算资源配额
ps:同时设置CPU和内存配额时,资源必须全部满足
Pod资源限额
限额策略是为了防止某些应用对节点资源过度使用而配置的限制性策略,限额与配额相反,他不检查节点资源剩余情况,只限制应用对资源的大量使用
资源限额使用limits进行配置
使用在spec.containers.resources.limits.cpu和spec.containers.resources.limits.memory
全局资源管理
全局资源配额
如果有大量的容器需要设置资源配额,为每个Pod设置资源配额策略不方便且不好管理,管理员可以一名称空间(namespace)为单位,限制其资源的使用和创建。在该名称空间中创建的容器都会受到规则的限制
k8s支持的全局资源配额方式有:
对单个Pod内存、CPU进行配额:LimitRange
对资源总量进行配额:ResourceQuota
LimitRange
---
apiVersion : v1
kind : LimitRange
metadata :
name : mylimit # 策略名称
namespace : work # 规则生效的名称空间
spec :
limits : # 全局规则
- type : Container # 资源类型
defaults : # 对没有限制策略的容器添加规则
cpu : 300m # 计算资源限额
memory : 500Mi # 内存资源限额
defaultRequest :
cpu : 8m # 计算资源配额
memory : 8Mi # 内存资源配额
设置资源使用范围
设置名称空间的最大限额和最小配额
... ..
spec : # 为LimitRange.spec 配置
limits : # 全局限制规则
- type : Container # 资源类型
... ... # 在默认资源配额下添加
max : # 资源限额
cpu : 800m # 计算资源限额
memory : 1000Mi # 内存资源限额
min : # 资源配额
cpu : 2m # 计算资源配额
memory : 8Mi # 内存资源配额
ps : 将对象改为Pod就是对整个Pod设置总限额
ResourceQuota
---
apiVersion : v1
kind : ResourceQuota # 全局资源限额对象
metadata :
name : myquota # 规则名称
namespace : work # 规则作用的名称空间
spec : # ResourcesQuota.spec定义
hard : # 强制规则
requests.cpu : 1000m # 计算资源配额总数
requests.memory : 2000Mi # 内存资源配额总数
limits.cpu : 5000m # 计算资源限额总数
limits.memory : 8Gi # 内存资源限额总数
pods : 3 # 限制创建资源对象总数