Kubernetes 调度和资源管理 | 学习笔记

简介: 快速学习 Kubernetes 调度和资源管理

开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程:Kubernetes 调度和资源管理 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/913/detail/14505


Kubernetes 调度和资源管理


摘要:本小节主要内容为 Pod 调度和资源管理,包括 Pod 调度过程、资源源调度和关系调度、调度相关的配置和使用、K8s 组件控制器、SVC 创建及使用、Pod 生命周期管理及 Kubectl 常用命令和使用技巧。

 

目录

Ÿ Pod 调度过程

Ÿ 资源调度和关系调度

Ÿ 调度相关的配置和使用

Ÿ 优先调度

 

一、Pod 调度过程

调度过程是把 Pod 放到合适 Node 上:

Ÿ 满足 Pod 资源要求;

Ÿ 满足 Pod 的特殊关系要求;

Ÿ 满足 Node 限制条件要求;

Ÿ 做到集群资源合理利用;

Controllers 副本集控制器 Kube-Scheduler 调度组件,按照预定的调度策略,将Pod 调度到相应的机器上,Kubelet 负责维护容器的生命周期,同时也负责 Volume 和网络的管理。

image.png

使用 kubectl 或者在控制台创建 deployment 类型 Pod,向 Apiserver 发送请求,scheduler 监控到 Pod 调度请求后,如何调度呢?

Kubernetes 的默认调度过程

Ÿ 客户端向 api-server 发出控制器 ( deployment,statefulset,job,cronjob ) 创建请求,最终会转化为创建和调度 Pod;

Ÿ kube-scheduler 通过 api-server 获取还未调度的 Pod 列表,通过对应的筛选规则和算法循环遍历为每个 Pod 分配节点,筛选分为两阶段:

ž Predicate:过滤(预选)阶段,将所有节点混在一起,通过一定算法对匹配项进行匹配,将不合格的节点剔出去,留下合格的节点,如果此时没有筛选出合适的节点,则 Pod 会进入 pending 状态,不断重试调度,直到有合适节点为止;

ž Priority:优选阶段,对刚刚通过过滤阶段筛选出来的节点,通过权重和优先级进行计算得出一个最终得分,这个分值范围为(0-10),得分高的为最合适的调度节点。

Ÿ 选举得分最高的主机 binding,结果存储 etcd;

Ÿ 最终选举节点 kubelet 接收指令进行 Pod 的创建。

 

二、资源调度和关系调度

除了集群默认调度能力外,还有自定义调度,用户可以设置 Pod 的资源限额参数、亲和性、反亲和性、污点等,实现自定义调度策略,使 Pod 能够充分利用资源并且按照业务需求合理调度。

1. Kubernetes 基础调度能力

a. 资源调度:满足 Pod 资源要求

Ÿ Resources:CPU/Memory/Storage/GPU/FGPA (资源大小限制);

Ÿ QoS:Guaranteed/Burstable/BestEffort (服务质量要求);

Ÿ Resource Quota (配额限制);

b. 关系调度:满足 Pod/Node 的特殊关系/条件要求

Ÿ PodAffinity/PodAntiAffinity:Pod 和 Pod 间关系(亲和性和反亲和性);

Ÿ NodeSelector/NodeAffinity:由 Pod 决定适合自己的 Node (节点选择器);

Ÿ Taint/Tolerations:限制调度到某些 Node (污点限制);

如果未做过节点 nodeSelector,亲和性( node affinity ) 或 Pod 亲和、反亲和性  ( Pod affinity/anti-affinity ) 等 Pod 高级调度策略设置,则没有办法指定服务部署到指定节点上,可能会造成 CPU 或内存等密集型的 Pod 同时分配到相同 Node,造成资源竞争;另一方面,如果未对资源进行限制,一些关键的服务可能会因为资源竞争因 OOM (Out of Memory) 等原因被 kill 掉,或者被限制 CPU 使用。

a. Pod 的资源类型,可以对 cpu、内存、存储、gpu 资源的使用量进行限制

Ÿ Cpu

Ÿ Memory

Ÿ ephemeral-storage

Ÿ extended-resource:nvidia.com/gpu

b. 在应用的 container 标签下面增加 resource 标签,即可对 Pod 资源的使用量进行限制;

示例:

apiversion:v1

kind:Pod

metadata:

namespace:demo-ns

namedemo-pod

Spec:

containers:

- image:nginx:latest

name:demo-container

requests:

cpu:2

memory:1Gi

1imits:

cpu:2

memory:1Gi

如上 yaml 文件中,指明了容器信息及资源限制,requests 表示需要请求的资源大小,而 limits 表示容器限制资源的大小,如果容器内使用的内存超过了 limits 设置的内存大小,会发生 OOM(out of memory),导致容器重启;如果容器内 CPU使用超过了 limits 设置的 CPU 大小,并不会导致容器重启。

c. 如何判断请求的内存大小

Ÿ 通过执行命令 kubectl describe node xxx(xxx为节点名),查看资源使用情况及请求资源统计。

2.如何满足 Pod 资源要求

a. 什么是 PodQoS?

Ÿ Quality of Service

Kubernetes 为了实现资源被有效调度和分配的同时提高资源利用率,Kubernetes针对不同服务质量的预期,通过 QoS (Quality of Service)  来对 Pod 进行服务质量管理,提供了采用 requests 和 limits 两种类型对资源进行分配和使用限制。

b. QoS 的三种类型:

Ÿ Guaranteed-高,保障( CPU/Memory 必须 request==limit ,其余资源可不等);

Ÿ Burstable-中,弹性( CPU/Memory request 和 limit 不相等);

Ÿ BestEffort-低,尽力而为(所有资源 request/limit 必须都不填);

c. 资源回收策略

Ÿ 当 kubernetes 集群中,某个节点上可用资源比较小时,kubernetes 提供了资源回收策略保证被调度到该节点 pod 服务正常运行。当节点上的内存或者 CPU 资源耗尽时,可能会造成该节点上正在运行的 pod 服务不稳定。

Ÿ Kubernetes 通过 kubelet 来进行回收策略控制,保证节点上 Pod 在节点点资源比较小时可以稳定运行。

d. QoS Pods 被 kill 掉场景与顺序

Ÿ Best-effort 类型的 Pods:系统用完了全部内存时,该类型 pods 会最先被 kill 掉;

Ÿ Burstable 类型 Pods:系统用完了全部内存,且没有 Best-Effort container 可以被kill时,该类型 Pods 会被 kill 掉;

Ÿ Guaranteed Pods:系统用完了全部内存,且没有 Burstable 与 Best-Effort container 可以被 kill,该类型的 Pods 会被 kill 掉;

注:如果 Pod 进程因使用超过预先设定的 limites ,而非 Node 资源紧张情况,系统倾向于在其原所在的机器上重启该 container 或本机或其他重新创建一个Pod。

e. ResourceQuota

作用:限制每个 Namespace 资源用量,如对 Pod 内存和 CPU 限制。

用法:

-pernamespace

-Scope

Terminating/NotTerminating BestEffort/NotBestEffort priorityClass

当 Quota 超限后会禁止创建:

-forbidden:exceeded quota

一个 namespace 下面可以创建多个 ResourceQuota( ResourceQuota 本身也可以限制 ResourceQuota 的数量),常规的使用是把计算资源 quota( cpu、mem 等),存储资源 quota( storage、pvc 等),对象数量 quota( Pod、service 等)分别创建在不同的 ResourceQuota 下面,但是各个 ResourceQuota 中的限制项是可以重复的,这时会取最小的值。

如下示例 yaml 文件中,限制 demo-ns Namespace 下非 BestEffort QoS 的Quota ,cpu 只能使用 1000 个、memory 只能使用 200 Gi、Pods 只能创建10个:

kind:ResourceQuota

metadata:

name:demo-quota

namespace:demo-ns

Spec:

hard:

cpu:"1000"

memory:200Gi

pods:"10"

scopeSelector:#可以不填

matchExpressions:

- operator:Exists

scopeName: NotBestEffort

 

三. 调度相关的配置和使用

1. 如何满足 Pod 与 Pod 之间的关系要求?— Pod 亲和调度

a. Pod 亲和调度 PodAffinity

Ÿ 必须和某些 Pod 调度到一起

requiredDuringSchedulinglgnoredDuringExecution

Ÿ 优先和某些 Pod 调度到一起

preferredDuringSchedulinglgnoredDuringExecution

b. Pod 反亲和调度 PodAntiAffinity

Ÿ 禁止和某些Pod调度到一起

requiredDuringSchedulingIgnoredDuringExecution

Ÿ 优先不和某些 Pod 调度到一起

preferredDuringSchedulinglgnoredDuringExecution

c. Operator

Ÿ In/NotIn/Exists/DoesNotExist

d. nodeSelector 标签选择器

Ÿ 节点选择约束的最简单推荐形式。可以将 nodeSelector  字段添加到 Pod 的规约中设置你希望目标节点所具有的节点标签。Kubernetes 只会将 Pod 调度到指定的每个标签的节点上。

如下示例中,标签的 Key 为 disktype,Value 为 ssd。

apiVersion: v1

kind: Pod

metadata:

name: nginx

labels:

env: test

spec:

containers:

- name: nginx

image: nginx

imagePullPolicy: IfNotPresent

nodeSelector:

disktype: ssd

必须调度到带了 K1=V1 标签的 Pod 所在节点:

apiversion:vl

kind:Pod

metadata:

namespace:demo-ns

name:demo-pod

spec:

containers:

- image: nginx:1atest

name:demo-container

affinity:

podAffinity:

requiredDuringSchedulingIgnoredDuringExecution:

- labelSelector:matchExpressions:

- key:k1

operator:In

values:

- vl

topologykey:"kubernetes.io/hostname"

禁止调度到带了 K1=V1 标签的 Pod 所在节点:

apiversion:vl

kind:Pod

metadata:

namespace:demo-ns

name:demo-pod

spec:

containers:

- image: nginx:1atest

name:demo-container

affinity:

podAffinity:

requiredDuringSchedulingIgnoredDuringExecution:

- 1abelSelector:

matchExpressions:

- key:kl

operator:In

values:

- v1

topologykey:"kubernetes.io/hostname"

2. 如何满足 Pod 与 Pod 之间的关系要求?—Node 亲和调度

a. 节点污点 Node Taints

Ÿ 一个 Node 可以有多个 Taints

Ÿ Effect (不能为空)

ž NoSchedule:只是禁止新 Pods 调度上来;

ž PreferNoSchedule:尽量不调度到这台;

ž NoExecute:会驱逐没有对应 toleration 的 Pods ,并且也不会调度新的上来;

b. Pod Tolerations

Ÿ 一个 Pod 可以有多个 Tolerations

Ÿ Effect 可以为空,匹配所有

ž 取值和 Taints 的 Effect 一致

Ÿ Operator

ž Exists/Equal

示例:

Node 上带了 K1=V1 且效果是 NoSchedule 的 Taints:

apiversion:vl

Kind:Node

metadata:

name:demo-node

spec:

taints:

- key:"k1"

value:"v1"

effect:"Noschedule"

Pod 上必须带有 K1=V1 且效果是 NoSchedule 的 Tolerations:

apiversion:v1

kind:Pod

metadata:

namespace:demo-name

spec:

containers:

image:nginx=latest

name:demo-container

tolerations:

-key:"k1"

operatorEqual"

value:"v1" #当 op=Exists 可为空

effect:"Noschedule" #可以为空,匹配所有

四、集群资源优先级调度

1. 集群资源不够时怎么办?

Ÿ 先到先得策略( FIFO ):简单、相对公平、上手快;

Ÿ 优先级策略( Priority ):符合日常公司业务特点;

优先级和抢占机制,解决的是 Pod 调度失败时该怎么办的问题。正常情况下,当一个 Pod 调度失败后,它就会被暂时“搁置”起来,直到 Pod 被更新,或者集群状态发生变化,调度器才会对这个 Pod 进行重新调度。

2. 特殊要求的场景:

Ÿ 当一个高优先级的 Pod 调度失败后,该 Pod 并不会被“搁置”,而是会“挤走”某个 Node 上的一些低优先级的 Pod,这样就保证这个高优先级 Pod 的调度成功;

Ÿ 如何使用优先级调度呢?需要创建一个 priorityClass 资源,然后再为每个 Pod 应用指定不同的 priorityClassName ,这样就完成了优先级以及优先级调度的配置。

3. 优先级调度的配置

Ÿ 创建 PriorityClass 优先级资源,声明优先级大小;

Ÿ 为各个 Pod 应用指定不同的 priorityClassName;

Ÿ 内置默认优先级:DefaultPriorityWhenNoDefaultClassExists=0

Ÿ 用户可配置的最大优先级限制 HighestUserDefinablePriority=1000000000

Ÿ 系统级别优先级 SystemCriticalPriority=2000000000

Ÿ 内置系统级别优先级 system-cluster-criticalsystem-node-critical

示例:

Ÿ 创建一个名为 high 的 priorityClass,得分为 10000,示例如下:

apiversion:scheduiing.K8s.io/v1

kind:Priorityclass

metadata:

name:high

value:10000

galobalDefault:false

Ÿ 创建一个名为 low 的 priorityClass,得分为100,示例如下:

apiversion:scheduling.k8s.io/v1

kind:Priorityclass

metadata:

name:low

value=100

g1oba1Default:false

 

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
212 1
|
存储 边缘计算 Kubernetes
边缘计算问题之YurtControllerManager 接管原生 Kubernetes 的调度如何解决
边缘计算问题之YurtControllerManager 接管原生 Kubernetes 的调度如何解决
111 1
|
7月前
|
人工智能 Serverless 调度
突破地域限制,实现算力无限供给 —阿里云ACK One注册集群开启多地域Serverless算力调度
本文介绍了阿里云ACK One注册集群多地域Serverless算力调度解决方案,解决传统数据中心在AI时代面临的算力不足问题。方案通过分钟级接入、100%兼容Kubernetes操作及云上Serverless弹性,实现跨地域弹性算力供给,支持高并发请求与模型快速迭代。文中详细描述了快速接入步骤、指定地域调度及动态调度方法,并提供了相关代码示例。该方案助力企业实现AI推理服务的规模化部署,提升商业落地效率。
|
7月前
|
人工智能 Serverless 调度
突破地域限制,实现算力无限供给 -- 阿里云ACK One注册集群开启多地域Serverless算力调度
传统单地域算力难以支撑AI推理场景的高并发实时响应、突发高流量的要求,阿里云容器服务ACK One注册集群推出多地域Serverless算力调度方案完美解决此问题。
|
8月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
Kubernetes 调度 容器
Kubernetes高级调度方式
文章介绍了Kubernetes的高级调度方式,包括调度器的工作机制、节点倾向性(Node Affinity)和Pod倾向性(Affinity)。
212 9
Kubernetes高级调度方式
|
应用服务中间件 调度 nginx
Kubernetes的Pod调度:让你的应用像乘坐头等舱!
Kubernetes的Pod调度:让你的应用像乘坐头等舱!
|
机器学习/深度学习 Kubernetes 调度
Kubernetes与GPU的调度:前世今生
本文详细探讨了Kubernetes与GPU的结合使用,阐述了两者在现代高性能计算环境中的重要性。Kubernetes作为容器编排的佼佼者,简化了分布式系统中应用程序的部署与管理;GPU则凭借其强大的并行计算能力,在加速大规模数据处理和深度学习任务中发挥关键作用。文章深入分析了Kubernetes如何支持GPU资源的检测与分配,并介绍了热门工具如NVIDIA GPU Device Plugin和Kubeflow的应用。
|
Prometheus Kubernetes 网络协议
k8s学习笔记之CoreDNS
k8s学习笔记之CoreDNS
|
存储 Kubernetes 数据安全/隐私保护
k8s学习笔记之ConfigMap和Secret
k8s学习笔记之ConfigMap和Secret

热门文章

最新文章

推荐镜像

更多