k8s教程(pod篇)-调度总结(一)

简介: k8s教程(pod篇)-调度总结(一)

01 概述

1.1 Pod调度控制器分类

Kubernetes平台上,我们很少会直接创建一个Pod,在大多数情况下会通过如下控制器完成对一组Pod副本的创建、调度 及全生命周期的自动控制任务

  • RC
  • Deployment
  • DaemonSet
  • Job等

1.2 RC到Deployment的发展

在最早的Kubernetes,版本里是没有这么多Pod副本控制器的,只有一个Pod副本控制器RC(Replication Controller),这个控制器是这样设计实现的:

RC独立于所控制的Pod,并通过Label标签这个松耦合关联关系控制目标Pod实例的创建和销毁

随着Kubernetes的发展,RC也出现了新的继任者-Deployment,用于更加自动地完成Pod副本的部署、版本更新、回滚等功能

严谨地说,RC的继任者其实并不是Deployment,而是ReplicaSet,因为

ReplicaSet进一步增强了RC标签选择器的灵活性(之前RC的标签选择器只能选择一个标签而ReplicaSet拥有集合式的标签选择器,可以选择多个Pod标签),如下所示:

1.2.1 ReplicaSet

RC不同,ReplicaSet被设计成能控制多个不同标签的Pod副本

举例: 应用MyApp目前发布了v1v2两个版本,用户希望MyAppPod副本数保持为3个,可以同时包含v1v2版本的Pod,就可以用ReplicaSet来实现这种控制,写法如下:

其实,Kubernetes的滚动升级就是巧妙运用ReplicaSet的这个特性来实现的, 同时,Deployment也是通过ReplicaSet来实现Pod副本自动控制功能的。

我们不应该直接使用底层的ReplicaSet来控制Pod副本,而应该通过管理ReplicaSet的Deployment对象来控制副本,这是来自官方的建议。

1.3 Pod调度

在大多数情况下,我们希望Deployment创建的Pod副本被成功调度到集群中的任何一个可用节点,而不关心具体会调度到哪个节点。

1.3.1 情景

但是,在真实的生产环境中的确也存在一种需求:希望某种Pod的副本全部在指定的一个或者一些节点上运行,比如希望将MySQL数据库调度到一个具有SSD磁盘的目标节点上

此时Pod模板中的NodeSelector属性就开始发挥作用了,上述MySQL定向调度案例的实现方式可分为以下两步:

  1. 把具有SSD磁盘的Node都打上自定义标签disk=ssd
  2. 在Pod模板中设定NodeSelector的值为“disk:ssd”

如此一来,Kubernetes在调度Pod副本的时候,就会先按照Node的标签过滤出合适的目标节点,然后选择一个最佳节点进行调度。

1.3.2 存在的问题

上述逻辑看起来既简单又完美,但在真实的生产环境中可能面临以下令人尴尬的问题:

  1. 如果NodeSelector选择的Label不存在或者不符合条件(比如:这些目标节点此时宕机或者资源不足,该怎么办?)
  2. 如果要选择多种合适的目标节点,比如SSD磁盘的节点或者超高速硬盘的节点,该怎么办?

备注:Kubernetes引入了NodeAffinity(节点亲和性设置)来解决该需求。

1.3.3 解决方式

在真实的生产环境中还存在如下所述的特殊需求:

需求 举例描述 解决方式
不同Pod之间的亲和性(Affinity) 比如MySQL数据库与Redis中间件 不能被调度到同一个目标节点上,或者两种不同的Pod必须被调度到同一个Node 上,以实现本地文件共享或本地网络通信等特殊需求 PodAffinity来解决该问题
有状态集群的调度 对于ZooKeeper、Elasticsearch、MongoDB、Kafka等有状态集群,虽然集群中的每个Worker节点看起来都是相同的,但每个Worker节点都必须有明确的、不变的唯一ID(主机名或IP地址),这些节点的启动和停止次序通常有严格的顺序。此外,由于集群需要持久化保存状态数据所以集群中的Worker节点对应的Pod不管在哪个Node上恢复,都需要挂载原来的Volume,因此这些Pod还需要捆绑具体的PV 针对这种复杂的需求,Kubernetes 提供了StatefulSet这种特殊的副本控制器来解决问题,在Kubernetes1.9版本发布后,StatefulSet才可用于正式生产环境中
在每个Node上调度并且仅仅创建一个Pod副本 这种调度通常用于系统监控相关的Pod,比如主机上的日志采集、主机性能采集等进程需要被部署到集群中的每个节点,并且只能部署一个副本 DaemonSet来解决这种特殊Pod副本控制器
对于批处理作业,需要创建多个Pod副本来协同工作,当这些Pod副本都完成自己的任务时,整个批处理作业就结束了 这种Pod运行且仅运行一次的特殊调度,用常规的RC或者Deployment都无法解决 引入了新的Pod调度控制器Job来解决问题,并继续延伸了定时作业的调度控制器CronJob

与单独的Pod实例不同,由RC、ReplicaSet、Deployment、DaemonSet等控制器创建的Pod副本实例都是归属于这些控制器的,这就产生了一个问题:控制器被删除后,归属于控制器的Pod副本该何去何从?

kubernetes版本 操作
1.9之前 在RC等对象被删除后,它们所创建的Pod副本都不会被删除
1.9以后 这些Pod副本会被一并删除。如果不希望这样做,则可以通过kubectl命令的- cascade=false参数(例如:kubectl delete replicaset my-repset --cascade=false)来取消这一默认特性

02 全自动调度

2.1 功能

Deployment或RC的主要功能之一就是自动部署一个容器应用的多份副本,以及持续监控副本的数量,在集群内始终维持用户指定的副本数量,。

2.2 举例

举例:使用配置文件可以创建一个ReplicaSet,这个ReplicaSet会创建3个Nginx应用的Pod

使用create命令创建之后,查看Deployment的状态:

kubectl get deployments

该状态说明Deployment已创建好所有3个副本,并且所有副本都是最新的可用的。


通过运行kubectl get rskubectl get pods可以查看已创建的ReplicaSet (RS)Pod的信息。

从调度策略上来说,这3个Nginx Pod由系统全自动完成调度。它们各自最终运行在哪个节点上,完全由Master的Scheduler经过一系列算法计算得出,用户无法干预调度过程和结果。

03 定向调度

3.1 Step1- 给Node打上标签

如果要实现定向调度,首先的第一步就是要为Node节点搭上标签(Label),可以使用kubectl label命令:

kubectl label nodes <node-name><label-key>=<label-value>
• 1

例如这里为k8s-node-1节点打上一个zone=north标签,表明它是“北方”的一个节点:

3.2 Step2- Pod指定NodeSelector

然后,在Pod的定义中加上nodeSelector的设置,以redis-master- controller.yaml为例:

3.3 Step3- 验证

运行kubectl create -f命令创建Podscheduler就会将该Pod调度到拥有 “zone=north” 标签的Node上。

使用kubectl get pods-o wide命令可以验证Pod所在的Node

需要注意的是,如果我们指定了PodnodeSelector条件,且在集群中不存在包含相应标签的Node,则即使在集群中还有其他可供使用的Node这个Pod也无法被成功调度

3.4 预定义的标签

除了用户可以自行给Node添加标签,Kubernetes也会给Node预定义一些标签,包括:

  • kubernetes.io/hostname;
  • beta.kubernetes.io/os(从1.14版本开始更新为稳定版,到1.18版本删除);
  • beta.kubernetes.io/arch(从1.14版本开始更新为稳定版,到1.18版本删除);
  • kubernetes.io/os(从1.14版本开始启用);
  • kubernetes.io/arch(从1.14版本开始启用)。

04 node亲和性调度

4.1 亲和性调度分类

目前有两种节点亲和性表达:

表达式 含义
RequiredDuringSchedulingIgnoredDuringExecution 必须满足指定的规则才可以调度Pod到Node上(功能与nodeSelector很像,但是使用的是不同的语法),相当于限制
PreferredDuringSchedulingIgnoredDuringExecution 强调优先满足指定规则,调度器会尝试调度Pod到Node上,但并不强求,相当于软限制

多个优先级规则还可以设置权重(weight)值,以定义执行的先后顺序。

IgnoredDuringExecution的意思是:如果一个Pod所在的节点在Pod运行期间 标签发生了变更,不再符合该Pod的节点亲和性需求,则系统将忽略NodeLabel 的变化,该Pod能继续在该节点上运行

4.2 举例

有如下要求:

  • requiredDuringSchedulingIgnoredDuringExecution:要求只运行在amd64的节点上(beta.kubernetes.io/arch In amd64);
  • preferredDuringSchedulingIgnoredDuringExecution:要求尽量运行在磁盘类型为ssd(disk-type In ssd)的节点上;

则资源文件的定义如下:

apiVersion:vl
kind:Pod
metadata:
  name:with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution: 
        nodeSelectorTerms
        - matchExpressions:
          - key:beta.kubernetes.io/arch 
            operator:In
            values:
            - amd64
      preferredDuringSchedulingIgnoredDuringExecution: 
      - weight:1
        preference:
        matchExpressions:
        - key:disk-type
          operator:In
        values:
        - ssd
  containers:
  - name:with-node-affinity
    image:gcr.io/google containers/pause:2.0

从上面的配置中可以看到In操作符,NodeAffinity语法支持的操作符包括In、NotIn、Exists、DoesNotExist、Gt、Lt。虽然没有节点排斥功能,但是用NotInDoesNotExist就可以实现排斥的功能了。

4.3 注意事项

  • 如果同时定义了nodeSelectornodeAffinity,那么必须两个条件都得到满足,Pod才能最终运行在指定的Node上;
  • 如果nodeAffinity指定了多个nodeSelectorTerms,那么其中一个能匹配成功即可;
  • 如果在nodeSelectorTerms中有多个matchExpressions,则一个节点必须满足所有matchExpressions才能运行该Pod。
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
4月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
444 1
|
11月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
446 25
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
10月前
|
人工智能 Serverless 调度
突破地域限制,实现算力无限供给 —阿里云ACK One注册集群开启多地域Serverless算力调度
本文介绍了阿里云ACK One注册集群多地域Serverless算力调度解决方案,解决传统数据中心在AI时代面临的算力不足问题。方案通过分钟级接入、100%兼容Kubernetes操作及云上Serverless弹性,实现跨地域弹性算力供给,支持高并发请求与模型快速迭代。文中详细描述了快速接入步骤、指定地域调度及动态调度方法,并提供了相关代码示例。该方案助力企业实现AI推理服务的规模化部署,提升商业落地效率。
|
10月前
|
人工智能 Serverless 调度
突破地域限制,实现算力无限供给 -- 阿里云ACK One注册集群开启多地域Serverless算力调度
传统单地域算力难以支撑AI推理场景的高并发实时响应、突发高流量的要求,阿里云容器服务ACK One注册集群推出多地域Serverless算力调度方案完美解决此问题。
|
11月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
11月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
432 12
|
11月前
|
人工智能 运维 Kubernetes
2025 超详细!Lens Kubernetes IDE 多平台下载安装与集群管理教程
Lens 是一款企业级 Kubernetes 可视化操作平台,2025版实现了三大技术革新:AI智能运维(异常检测准确率98.7%)、多云联邦管理(支持50+集群)和实时3D拓扑展示。本文介绍其安装环境、配置流程、核心功能及高阶技巧,帮助用户快速上手并解决常见问题。适用于 Windows、macOS 和 Ubuntu 系统,需满足最低配置要求并前置依赖组件如 kubectl 和 Helm。通过 Global Cluster Hub 实现多集群管理,AI辅助故障诊断提升运维效率,自定义监控看板和插件生态扩展提供更多功能。
|
应用服务中间件 调度 nginx
Kubernetes-项目中pod调度使用法则
前言kubernetes中部署的pod默认根据资源使用情况自动调度到某个节点。可在实际项目的使用场景中都会有更细粒度的调度需求,比如:某些pod调度到指定主机、某几个相关的服务的pod最好调度到一个节点上、Master节点不允许某些pod调度等。
2197 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
1602 0

推荐镜像

更多