0
点赞
收藏
分享

微信扫一扫

K8s Pod调度基础

一、Pod调度的基本概念

Pod:Kubernetes中最基本的可部署对象,代表集群中的一个应用实例。一个Pod可以包含一个或多个容器,这些容器共享存储、网络资源,且被设计为紧密协作。Pod是Kubernetes调度的最小单元。

节点(Node):Kubernetes集群中的工作机器,可以是物理机或虚拟机。节点负责运行Pod,并提供计算资源(如CPU和内存)和网络资源。

调度器(Scheduler):Kubernetes的组件之一,负责根据调度策略将新创建的Pod分配到集群中的某个节点上运行。

二、Pod调度的过程

Pod调度的过程主要分为两个阶段:筛选打分

  1. 筛选阶段:调度器检查所有的节点,以确定哪些节点具备运行该Pod所需的资源(如CPU、内存)和其他要求(如节点选择器标签)。只有满足Pod资源需求和其他约束条件的节点才会进入下一阶段。
  2. 打分阶段:对于通过筛选的节点,调度器会根据一系列标准(如节点亲和性、资源利用率等)为每个节点评分。最后,调度器会选择得分最高的节点来运行Pod。如果存在多个得分最高的节点,调度器会随机选择一个。

三、Pod调度的策略

Kubernetes提供了多种调度策略,以满足不同的应用场景和需求。以下是一些常见的调度策略:

  1. 资源需求与限制:Pod规格中可以指定所需的最小资源(如CPU和内存)。只有满足这些要求的节点才会被考虑作为Pod的运行地点。
  2. 节点选择器(Node Selector):允许Pod指定应该在具有特定标签的节点上运行。通过在Pod规格中指定nodeSelector,可以限制Pod的调度范围。
  3. 节点亲和性(Node Affinity):是节点选择器的扩展,提供了更丰富的表达式,允许指定更复杂的规则集合。节点亲和性可以是硬性的(必须满足)或软性的(尽量满足)。
  4. 污点(Taints)与容忍(Tolerations):节点可以设置污点以阻止某些Pod在其上运行,除非这些Pod具有匹配的容忍设置。污点和容忍是Kubernetes中一对强大的功能,用于确保Pod只在适当的节点上运行。
  5. Pod亲和性与反亲和性:允许Pod指定它们倾向或避免与特定的其他Pod共同调度。这有助于优化Pod的布局,提高应用的性能和可靠性。

除了上述基本的调度策略外,Kubernetes还提供了一些高级功能以支持更复杂的调度需求:

  1. 自定义调度策略:可以通过编写自定义调度器来实现更复杂的调度逻辑。自定义调度器可以与默认的kube-scheduler共存,为特定的Pod或应用提供定制化的调度方案。
  2. 优先级和抢占:Pod可以设置优先级,较高优先级的Pod可以抢占较低优先级Pod的位置。这对于确保关键任务始终有足够资源非常重要。
  3. 多调度器:Kubernetes支持在集群中部署多个调度器,每个调度器可以负责调度不同类型的Pod。这提高了调度的灵活性和可扩展性。
  4. Replication Controller 和 ReplicaSet
  • Replication Controller(复制控制器,RC):确保 Pod 副本数达到期望值,自动替换失败、删除或终止的 Pod,类似于进程管理程序,但监视的是多个节点上的多个 Pod。使用示例包括编辑和创建 ReplicationController 文件、删除 Pod 并查看状态以及删除 ReplicationController。
  • ReplicaSet(复制集,RS):是下一代 Replication Controller,支持基于集合的标签选择器,主要用于 Deployment 协调创建、删除和更新 Pod,一般建议使用 Deployment 来自动管理 ReplicaSet,除非自定义的 Pod 不需要更新或有其他编排等。定义 ReplicaSet 的实例包括编辑和创建 RS 文件以及删除 RS。
  • 标签与标签选择器:标签是用来标识 K8S 对象的一组附加在其上的键值对,通过标签可以方便地筛选或排除一组对象。标签选择器可以用来选择一组对象,APIServer 支持基于等式的标签选择器与基于集合的标签选器。
  1. 无状态应用管理 Deployment
  • 定义:无状态服务对单次请求的处理不依赖其他请求,多个服务实例对于同一个用户请求的响应结果是完全一致的,多服务实例之间没有依赖关系,在 k8s 控制器中动态启停无状态服务的 pod 不会对其它的 pod 产生影响。Deployment 被设计用来管理无状态服务的 pod,每个 pod 完全一致。
  • 创建 Deployment:编写 Deployment 文件,使用 kubectl create 创建此 Deployment,查看 Deployment 的状态,使用 rollout 查看整个 Deployment 的创建过程状态,查看这个 Deployment 对应的 RS,查看此 Deployment 创建的 pod。
  • 更新 Deployment:对 Deployment 文件的配置文件或者镜像版本进行更新后,Deployment 会创建新的 RepliccaSet,之后会对管理的 Pod 进行滚动升级,包括更新 pod 的 image、查看更新过程、查看此时的 RS 以及通过 describe 查看 deployment 的详细信息。
  • 回滚 deployment:当更新的版本不稳定或者配置不合理时,可以对其进行回滚操作,包括多更新几次 deployment、查看更新历史、查看某次更新的详情、回滚到指定版本以及回滚到上次版本。
  • 扩容 deployment:调整 pod 的副本数并查看。
  • 暂停和恢复 deployment 更新:可以暂停更新,然后对 deployment 进行相关的操作,最后统一开始更新。
  • 删除 Deployment:使用 kubectl delete 删除。
  1. 有状态应用管理 StatefulSet
  • 定义:StatefulSet 常用于部署有状态的且需要有序启动的应用程序,为每个 Pod 维护了一个标识,Pod 是根据相同规范创建的,但不可互换,每个 pod 都有一个持久的标识符,在重新调度时也会被保留。有状态服务需要在本地存储持久化数据,实例之间请求结果可能存在不一致,分布式节点实例之间有依赖的拓扑关系,如果 K8S 停止分布式集群中任一实例 pod,就可能会导致数据丢失或者集群的 crash。
  • 编写 statefulSet 资源文件:定义一个 statefulSet 资源文件,包括一个服务和一个 StatefulSet,创建 statefulSet,查看 statefilset 状态和群集状态。
  • statefulset 扩容:将副本数修改为 3 并查看。
  • 缩容:通过动态监听和修改副本数进行缩容,并查看最终结果。
  • 非级联删除 statefulset:采用非级联删除时,StatefulSet 的 Pod 不会被删除,需要手动删除对应的持久卷声明。
  • 级联删除 statefulset:级联删除时,StatefulSet 和它的 Pod 都会被删除。
  1. 守护进程集 DaemonSet
  • 定义:DaemonSet 确保全部(或符合条件)的节点上运行一个 Pod 副本,当有新的节点加入集群时,也会为他们新增一个 Pod,当节点从集群中移除时,这些 Pod 会被回收,删除 DaemonSet 将会删除它创建的所有的 Pod。
  • 定义一个 DaemonSet:包括 apiVersion、kind、metadata 和 spec 等部分。
  • 创建 DaemonSet:创建命名空间并创建 DaemonSet。
  • 查看 DaemonSet:使用 kubectl get ds 查看。
  • 查看 pod 所在的节点:使用 kubectl get pod 查看。
  • 删除 DaemonSet:使用 kubectl delete ds 删除。
  1. CronJob
  • 定义:Cronjob 用于以时间为基准的周期性地执行任务,和 Linux 系统上的 CronJob 一样。
  • 创建 CronJob:编辑 Cronjob 文件,创建 Cronjob,查看 Cronjob 以及生成的 pod 和 pod 的执行日志,最后删除 Cronjob。
举报

相关推荐

0 条评论