企业级运维之云原生与Kubernetes实战课程 - 第二章第3讲 Kubernetes调度和资源管理

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

企业级运维之云原生与Kubernetes实战课程

第二章第3Kubernetes调度和资源管理

 

 

视频地址:https://developer.aliyun.com/learning/course/913/detail/14505

 

摘要:本小节主要内容为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发出控制器 (deploymentstatefulsetjobcronjob)创建请求,最终会转化为创建和调度Pod
  • kube-scheduler通过api-server获取还未调度的Pod列表,通过对应的筛选规则和算法循环遍历为每个Pod分配节点,筛选分为两阶段:
  • Predicate:过滤(预选)阶段,将所有节点混在一起,通过一定算法对匹配项进行匹配,将不合格的节点剔出去,留下合格的节点,如果此时没有筛选出合适的节点,则Pod会进入pending状态,不断重试调度,直到有合适节点为止;
  • Priority:优选阶段,对刚刚通过过滤阶段筛选出来的节点,通过权重和优先级进行计算得出一个最终得分,这个分值范围为(0-10),得分高的为最合适的调度节点。
  • 选举得分最高的主机binding,结果存储etcd
  • 最终选举节点kubelet接收指令进行Pod的创建。

 

二、资源调度和关系调度

 

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

 

1. Kubernetes 基础调度能力

 

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

 

  • ResourcesCPU/Memory/Storage/GPU/FGPA(资源大小限制)
  • QoSGuaranteed/Burstable/BestEffort (服务质量要求)
  • Resource Quota (配额限制)

 

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

 

  • PodAffinity/PodAntiAffinityPodPod间关系(亲和性和反亲和性)
  • 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-resourcenvidia.com/gpu

 

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

 

示例:

 

apiversionv1

kindPod

metadata

   namespacedemo-ns

namedemo-pod

Spec

   containers

 - imagenginxlatest

   namedemo-container

   requests

     cpu2

    memory1Gi

   1imits

     cpu2

    memory1Gi

 

如上yaml文件中,指明了容器信息及资源限制,requests表示需要请求的资源大小,而limits表示容器限制资源的大小,如果容器内使用的内存超过了limits设置的内存大小,会发生OOMout 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进行服务质量管理,提供了采用requestslimits两种类型对资源进行分配和使用限制。

 

b.  QoS的三种类型:

 

  • Guaranteed-高,保障(CPU/Memory必须request==limit,其余资源可不等)
  • Burstable-中,弹性(CPU/Memory requestlimit不相等)
  • BestEffort-低,尽力而为(所有资源request/limit必须都不填)

 

c.  资源回收策略

 

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

 

d.  QoS Podskill掉场景与顺序

 

  • Best-effort类型的Pods:系统用完了全部内存时,该类型pods会最先被kill掉;
  • Burstable类型Pods:系统用完了全部内存,且没有Best-Effort container可以被kill时,该类型Pods会被kill掉;
  • Guaranteed Pods:系统用完了全部内存,且没有BurstableBest-Effort container可以被kill,该类型的Pods会被kill掉;

 

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

 

e.  ResourceQuota

 

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

 

用法:

-pernamespace

-Scope

Terminating/NotTerminating BestEffort/NotBestEffort priorityClass

 

Quota超限后会禁止创建:

-forbiddenexceeded quota

 

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

 

如下示例yaml文件中,限制demo-ns Namespace下非BestEffort QoSQuotacpu只能使用1000个、memory只能使用200GiPods只能创建10个:

 

kindResourceQuota

metadata

   namedemo-quota

   namespacedemo-ns

Spec

   hard

      cpu"1000"

      memory200Gi

      pods"10"

   scopeSelector#可以不填

      matchExpressions

      - operatorExists

      scopeNameNotBestEffort

 

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

 

1. 如何满足PodPod之间的关系要求?—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 调度到指定的每个标签的节点上。

 

如下示例中,标签的KeydisktypeValue 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所在节点:

 

apiversionvl

kindPod

metadata

   namespacedemo-ns

   namedemo-pod

spec

   containers

   - image nginx1atest

   namedemo-container

affinity

   podAffinity

     requiredDuringSchedulingIgnoredDuringExecution

      - labelSelectormatchExpressions

      - keyk1

          operatorIn

          values

          - vl

      topologykey"kubernetes.io/hostname"

 

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

 

apiversionvl

kindPod

metadata

   namespacedemo-ns

   namedemo-pod

spec

   containers

   - image nginx1atest

   namedemo-container

affinity

   podAffinity

     requiredDuringSchedulingIgnoredDuringExecution

      - 1abelSelector

      matchExpressions

      - keykl

      operatorIn

      values:

      - v1

      topologykey"kubernetes.io/hostname"

 

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

 

a.  节点污点Node Taints

 

  • 一个Node可以有多个Taints
  • Effect(不能为空)
  • NoSchedule:只是禁止新Pods调度上来;
  • PreferNoSchedule:尽量不调度到这台;
  • NoExecute:会驱逐没有对应tolerationPods,并且也不会调度新的上来;

 

b.  Pod Tolerations

 

  • 一个Pod可以有多个Tolerations
  • Effect可以为空,匹配所有
  • 取值和TaintsEffect一致
  • Operator
  • Exists/Equal

 

示例:

 

Node上带了K1=V1且效果是NoScheduleTaints

 

apiversionvl

KindNode

metadata

   namedemo-node

spec

   taints

   - key"k1"

   value"v1"

   effect"Noschedule"

 

Pod上必须带有K1=V1且效果是NoScheduleTolerations

 

apiversionv1

kindPod

metadata:

namespacedemo-name

spec

   containers:

   imagenginx=latest

   namedemo-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

 

示例:

 

  • 创建一个名为highpriorityClass,得分为10000,示例如下:

 

apiversionscheduiing.K8s.io/v1

kindPriorityclass

metadata

   namehigh

value10000

galobalDefaultfalse

 

  • 创建一个名为lowpriorityClass,得分为100,示例如下:

 

apiversionscheduling.k8s.io/v1

kindPriorityclass

metadata

namelow

value=100

g1oba1Defaultfalse

 

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
9月前
|
人工智能 关系型数据库 OLAP
光云科技 X AnalyticDB:构建 AI 时代下的云原生企业级数仓
AnalyticDB承载了光云海量数据的实时在线分析,为各个业务线的商家提供了丝滑的数据服务,实时物化视图、租户资源隔离、冷热分离等企业级特性,很好的解决了SaaS场景下的业务痛点,也平衡了成本。同时也基于通义+AnalyticDB研发了企业级智能客服、智能导购等行业解决方案,借助大模型和云计算为商家赋能。
759 17
|
9月前
|
人工智能 运维 监控
阿里云携手神州灵云打造云内网络性能监测标杆 斩获中国信通院高质量数字化转型十大案例——金保信“云内网络可观测”方案树立云原生运维新范式
2025年,金保信社保卡有限公司联合阿里云与神州灵云申报的《云内网络性能可观测解决方案》入选高质量数字化转型典型案例。该方案基于阿里云飞天企业版,融合云原生引流技术和流量“染色”专利,解决云内运维难题,实现主动预警和精准观测,将故障排查时间从数小时缩短至15分钟,助力企业降本增效,形成可跨行业复制的数字化转型方法论。
506 6
|
存储 运维 关系型数据库
开源新发布|PolarDB-X v2.4.1 增强企业级运维能力
PolarDB-X 是阿里云推出的云原生分布式数据库,自2021年10月开源以来,持续迭代升级,至2024年4月发布的v2.4.1版本,重点增强了企业级运维能力,如无锁变更、物理扩缩容、数据TTL等,提供金融级高可用、透明分布式、HTAP一体化等特性。PolarDB-X 支持集中式和分布式一体化形态,兼容MySQL生态,适用于金融、通信、政务等行业。
2047 101
|
运维 Cloud Native 开发工具
智能运维:云原生大规模集群GitOps实践
智能运维:云原生大规模集群GitOps实践,由阿里云运维专家钟炯恩分享。内容涵盖云原生运维挑战、管理实践、GitOps实践及智能运维体系。通过OAM模型和GitOps优化方案,解决大规模集群的发布效率与稳定性问题,推动智能运维工程演进。适用于云原生环境下的高效运维管理。
493 8
|
存储 Cloud Native 块存储
EBS深度解析:云原生时代企业级块存储
企业上云的策略,从 Cloud-Hosting 转向 Serverless 架构。块存储作为企业应用上云的核心存储产品,将通过 Serverless 化来加速新的计算范式全面落地。在本话题中,我们将会介绍阿里云块存储企业级能力的创新,深入解析背后的技术细节,分享对未来趋势的判断。
990 3
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
895 30
|
3月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
370 1
|
3月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
276 89
|
8月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
358 9

热门文章

最新文章