Kubernetes
1.Pod调度策略
什么是调度分配?
将Pod分配到合适的计算节点上 ,对应节点上的kubelet运行这些Pod
Scheduler是如何工作的?
Scheduler通过watch机制来发现集群中尚未被调度到节点上的Pod,再根据调度原则将Pod分配到合适的节点上运行
Scheduler调度流程(过滤和打分)
- 过滤:筛选出满足Pod所有资源请求的节点,包含(计算资源、内存、存储、网络、端口号等)
如果没有节点满足Pod的需求,Pod将一直处于Pending的状态,直到Scheduler找到合适的节点 运行它 - 打分:Scheduler根据打分规则为每个调度节点打分,选出得分最高的节点来运行Pod,
如果存在得分相同的Pod,Scheduler会随机选择一个节点
确定了某个节点运行Pod后,Scheduler会将决定通知给apiServer,这个过程叫做绑定
2.Pod定向调度
缺点:节点单一,没有冗余性,如果指定的节点不能运行Pod,不会迁移到其他节点,会一直等待下去
基于标签的Pod调度
标签是什么?
标签(labels)是附加在Kubernetes上的键值对
标签的用途
使用节点名称调度不够灵活,标签可以更加灵活的方式完成调度任务
标签能够以松散耦合的方式将它们的组织结构映射到系统,无需客户端存储这些映射
标签可以在创建时附加到对象,也可以在创建之后随时添加和修改
标签可以用于组织和选择对象的子集
#使用show-lables查询标签
kubelet -n kube-system get pods --show-labels
#使用-l筛选标签
kubelet -n kube-system get pods -l 标签名称
#查看标签
kubectl get 资源类型 [资源名称] --show-lables
#设置标签
kubectl label 资源类型 [资源名称] <label-key>=<lable-value>
#删除标签
kubectl label 资源类型 [资源名称] <label-key>-
标签选择运算符(yaml中标签的key相同会被覆盖)
3.资源配额
为什么要资源配额?
当多个应用共享固定节点数目的集群时,人们会担心某些应用多度的使用资源,从而影响到其他的服务,我们需要设定一些规则,用来保证应用能获得其运行所需要的合理资源
CPU资源类型
CPU的约束请求以毫核(m)为单位。在K8S中1m是最小的调度单元,CPU的一个核心是1000m
内存资源类型
memory的约束和请求以字节为单位
内存的表示单位:E、P、T、G、M、k
也可以使用对应的2的幂数:Ei、Pi、Ti、Gi、Mi、Ki
例如:以下表达式所代表的是相同的值
1k==1000
1Ki==1024
最小资源配额
备注:比如一个2CPU、4GB内存的服务器,只能创建3个*1200Mi的Pod,第四个就会处于Pending的状态
2个CPU2个核心1000毫核,所以800毫核只能创建2个Pod,第三个处于Pending
最大资源配额
#内存超过限额服务会被强制杀死
全局资源配额
如果大量容器需要设置资源配额,为每个Pod设置资源配策略不方便且不好管理,管理员可以以名称空间为单位(namespace),限制其资源的使用及创建。在该名称空间中创建的容器都会受到规则的限制
K8S支持的全局配额方式有:
- 对内存、CPU、存储资源进行配额:LimitRange
- 对Pod进行配额:ResourceQuota
4.资源监控工具
K8S中的Metrics-server组件提供有关节点和Pod的资源使用情况
Metrics-server是什么?
是集群核心监控数据的聚合器,存储了各个节点和Pod的监控数据,并且提供了API以供查询和使用
通过kubelet获取node和Pod的CPU,内存等监控数据。为调度器、弹性控制器、以及Dashboard等UI组件提供数据来源
安装条件
kube-apiServer必须启用聚合服务,或使用kube-proxy代理转发
节点必须启用身份验证和授权。kubelet证书需要由集群证书颁发机构签名