k8s 常用调度策略使用详解

本文详细探讨了k8s的四大调度策略:定向调度(NodeName、NodeSelector)、亲和性调度(NodeAffinity、PodAffinity、PodAntiAffinity)、污点调度和容忍调度。通过实例操作,解释了如何使用这些策略来控制Pod的调度位置,包括如何打标签、设置污点和容忍,以及各种调度策略的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

通过之前的学习,我们了解到k8s集群中最小工作单位是pod,对于k8s集群来说,一个pod的完整生命周期是由一系列调度策略来控制,这些调度策略具体是怎么工作的呢?本文将详细讨论下这个问题。

二、k8s调度策略简介

默认情况下,k8s集群中某个Pod在哪个Node节点运行,是由Scheduler组件采用相应的算法计算出来的。这个过程是不受人工控制的,从下图中通过Scheduler的位置也可以看出来;

但在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?这就要求了解kubernetes对Pod的调度规则;

三、k8s 四大调度策略

k8s提供了常用的4大调度规则,如下:

  • 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出;
  • 定向调度:NodeName、NodeSelector;
  • 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity;
  • 污点(容忍)调度:Taints、Toleration;

接下来,将结合实际操作对每种调度策略做详细的说明;

</

### Kubernetes 探针类型详解 Kubernetes 提供了三种主要的探针类型,用于监控容器的健康状态并决定是否需要重启或重新调度容器。这些探针包括 `livenessProbe`、`readinessProbe` 和 `startupProbe`。 - **Liveness Probe** Liveness 探针用于判断容器是否正在运行。如果探针检测到容器不健康,则 Kubernetes 将杀死该容器,并根据 Pod 的重启策略决定是否重新启动它。这种探针主要用于防止容器进入“死锁”状态[^5]。 - **Readiness Probe** Readiness 探针用于判断容器是否准备好为请求提供服务。如果探针检测到容器未准备好,则 Kubernetes 会将该 Pod 从 Service 的负载均衡池中移除,直到容器再次变为“Ready”状态。这有助于避免向尚未准备好的容器发送流量。 - **Startup Probe** Startup 探针用于判断容器中的应用程序是否已成功启动。如果提供了 startup 探针,则所有 liveness 和 readiness 探针都会在 startup 探针成功之前被忽略。这对于启动时间较长的应用程序非常有用,可以避免过早地判断容器不健康[^5]。 ### Kubernetes 控制器类型详解 Kubernetes 提供了多种控制器类型来管理 Pod 的生命周期和行为。以下是常见的控制器类型: - **ReplicaSet** ReplicaSet 确保指定数量的 Pod 副本始终处于运行状态。它是 Deployment 的底层实现机制,通常用户直接使用 Deployment 而非 ReplicaSet。ReplicaSet 通过标签选择器来跟踪和管理 Pod 实例[^4]。 - **Deployment** Deployment 是一种更高层次的抽象,用于管理 ReplicaSet 和 Pod。它提供了声明式的方式来更新应用程序,并支持滚动更新、回滚等功能。Deployment 是目前最常用的控制器类型之一。 - **StatefulSet** StatefulSet 是为了解决有状态应用的需求而设计的控制器。与 Deployment 不同,StatefulSet 为每个 Pod 提供稳定的网络标识符和持久化存储。适用于数据库、分布式系统等场景[^4]。 - **DaemonSet** DaemonSet 确保集群中的每个节点(或特定节点)上都运行一个 Pod 副本。通常用于日志收集、监控代理等场景。DaemonSet 的 Pod 会随着节点的增加或减少自动调整数量。 - **Job 和 CronJob** - **Job**:用于运行一次性任务,确保其完成一定次数的任务执行。例如批量处理任务。 - **CronJob**:类似于 Linux 的 cron 任务,用于按计划运行任务。它可以根据设定的时间表定期创建 Job 实例。 - **Controller Operator** Operator 是一种特殊的控制器,通常由第三方开发,用于管理和扩展 Kubernetes 的功能。例如 MySQL Operator 或 Jenkins Operator 可以自动化数据库或 CI/CD 系统的部署和管理[^3]。 ```yaml # 示例:一个简单的 Deployment 配置 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 ``` ### 总结 Kubernetes 的探针类型(Liveness、Readiness 和 Startup)帮助维护容器的健康状态和服务可用性,而控制器类型(如 Deployment、StatefulSet、DaemonSet 等)则负责管理 Pod 的生命周期和扩展性。两者结合使用,能够构建高可用性和自动化的应用程序环境。
评论 97
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码农叔叔

谢谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值