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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 本小节主要内容为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

 

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
28天前
|
运维 监控 关系型数据库
运维实战:Windows服务挂掉了怎么办,通过Bat脚本实现自动重启
本文介绍了如何使用Bat脚本自动监控并重启Windows服务器上的挂掉服务,例如MySQL,以避免在假期等情况下需要紧急处理问题。首先,创建一个Bat脚本,设定每小时检查一次服务状态,如果服务停止则自动重启。脚本内容包括检查服务是否运行并根据状态执行相应操作。同时,脚本中包含了确保以管理员权限运行的代码。 脚本需设置为ANSI编码以防止乱码。推荐将Bat脚本封装为Windows服务以保证稳定运行,提供了使用NSSM工具、Windows服务程序和开源的Java工具winsw将批处理脚本转化为服务的方法。这些方法可以确保服务在后台可靠运行,即使在服务意外停止时也能自动恢复。
|
2月前
|
Kubernetes Cloud Native 开发者
构建高效的云原生应用:Docker与Kubernetes的完美搭档
【5月更文挑战第29天】 在现代软件开发领域,"云原生"这一术语已经成为高效、可扩展和弹性的代名词。本文将深入探讨如何通过Docker容器化技术和Kubernetes集群管理工具实现云原生应用的构建和管理。我们将剖析Docker的核心原理,揭示其轻量级和易于部署的特点,并进一步探索Kubernetes如何为这些容器提供编排,保证应用的高可用性与自动扩缩容。文章不仅讨论了二者的技术细节,还提供了实践案例,帮助开发者理解并运用这些技术构建和维护自己的云原生应用。
|
12天前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
|
13天前
|
运维 Kubernetes Cloud Native
云原生时代的技术革命:Kubernetes与容器编排
【6月更文挑战第17天】在数字化转型的浪潮中,云原生技术正成为推动企业IT架构现代化的核心力量。本文将深入探讨Kubernetes作为云原生生态中的佼佼者,如何引领容器编排的技术革命,并分析其在现代应用部署、管理和扩展中的关键作用。通过实例和案例分析,我们将揭示Kubernetes如何助力企业实现更高效、灵活和可靠的云原生应用管理。
|
4天前
|
分布式计算 资源调度 Hadoop
技术好文共享:资源管理与调度系统
技术好文共享:资源管理与调度系统
|
5天前
|
分布式计算 资源调度 监控
分布式资源管理和调度架构
分布式资源管理和调度架构
|
6天前
|
存储 Kubernetes Cloud Native
云原生 - Kubernetes基础知识学习
云原生 - Kubernetes基础知识学习
13 0
|
2月前
|
Kubernetes 安全 Cloud Native
Rainbond 携手 TOPIAM 打造企业级云原生身份管控新体验
TOPIAM是开源的IDaas/IAM平台,旨在统一管理企业账号、权限和认证,整合各类系统,实现单点登录。通过集中式管理,它解决传统IT架构中的安全和效率问题,加强企业安全并促进数字化转型。使用Rainbond云原生应用管理平台可轻松部署TOPIAM。TOPIAM功能包括组织信息管理、身份源集成、多种认证协议、安全审计、防暴力破解和密码策略。未来将推出更多与Rainbond的结合应用案例。
Rainbond 携手 TOPIAM 打造企业级云原生身份管控新体验
|
16天前
|
SQL 存储 关系型数据库
精通MySQL:从基础到高级运维实战
第一章:MySQL入门与基础 1.1 MySQL概述 简要介绍MySQL的历史、发展及其在数据库领域的地位
|
24天前
|
运维 Cloud Native 云计算
云原生技术在企业级应用中的应用与前景分析
随着云计算技术的快速发展,云原生技术作为一种优秀的应用架构模式,正在逐渐受到企业和开发者的关注。本文通过分析云原生技术在企业级应用中的应用情况和未来发展前景,探讨了其在加速企业数字化转型、提升应用性能和灵活性等方面的优势,以及面临的挑战和解决方案。
20 0