Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota
引言
在 Kubernetes 集群中,计算资源(CPU、内存)是有限的,而应用的需求是动态多变的。如何让 Pod 精准地运行在最合适的硬件节点上?如何根据业务的峰谷自动扩缩容?如何防止某个核心业务因资源超卖而拖垮整个集群?这些都是云原生架构中必须解决的核心痛点。
本文将结合底层原理与大量的实战演练,深入拆解 K8s 的调度机制(Node 亲和、污点容忍、节点维护)、资源监控基础设施(Metrics Server)、自动伸缩利器(HPA 及其行为策略)以及命名空间级别的资源配额管控(ResourceQuota/LimitRange),带你全面构建一个稳定、高效的 K8s 资源管理体系。
### 文章目录
- [Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [引言](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [@toc](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [一、Pod 调度控制策略深度解析](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [1.1 nodeName(最暴力的强制绑定)](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [1.2 nodeSelector(基于标签的硬性约束)](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [1.3 亲和性(Affinity)深度实践](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [二、高级调度机制:Taint 与 Toleration](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [2.1 污点的三种 Effect](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [2.2 多污点与多容忍的匹配逻辑](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [三、集群节点维护:Cordon 与 Drain](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [3.1 cordon(标记不可调度)](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [3.2 drain(驱逐节点)](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [四、Metrics Server 与 HPA 自动伸缩](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [4.1 Metrics Server 部署与避坑](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [4.2 HPA 基于 CPU 压测扩缩容](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [4.3 HPA 基于内存压测与 OOMKilled](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [4.4 HPA 精细管控行为(Behavior)](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [五、资源配额与限制:Quota 与 Limits](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [5.1 ResourceQuota 命名空间配额](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [5.2 LimitRange 默认值与边界](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
- [5.3 Request 与 Limits 的底层原理](#文章目录 Kubernetes 资源调度与弹性伸缩:Schedule、Metric、HPA 与 Quota 引言 @[toc] 一、Pod 调度控制策略深度解析 1.1 nodeName(最暴力的强制绑定) 1.2 nodeSelector(基于标签的硬性约束) 1.3 亲和性(Affinity)深度实践 二、高级调度机制:Taint 与 Toleration 2.1 污点的三种 Effect 2.2 多污点与多容忍的匹配逻辑 三、集群节点维护:Cordon 与 Drain 3.1 cordon(标记不可调度) 3.2 drain(驱逐节点) 四、Metrics Server 与 HPA 自动伸缩 4.1 Metrics Server 部署与避坑 4.2 HPA 基于 CPU 压测扩缩容 4.3 HPA 基于内存压测与 OOMKilled 4.4 HPA 精细管控行为(Behavior) 五、资源配额与限制:Quota 与 Limits 5.1 ResourceQuota 命名空间配额 5.2 LimitRange 默认值与边界 5.3 Request 与 Limits 的底层原理)
一、Pod 调度控制策略深度解析
Kubernetes 的默认调度器会自动为 Pod 寻找节点,但在特定业务场景下,我们需要人为干预。
1.1 nodeName(最暴力的强制绑定)
nodeName 直接指定节点名称,完全绕过调度器。
具体配置:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webapp
name: webapp
spec:
replicas: 2
template:
spec:
# 添加nodeName配置
nodeName: worker32.xianyu.cloud
containers:
- image: hub.xianyu.cloud/library/nginx
name: nginx
现象观察:
text
NAME READY STATUS NODE
webapp-55c6b896bc-ns9m5 1/1 Running worker32.xianyu.cloud
webapp-55c6b896bc-qr892 1/1 Running worker32.xianyu.cloud
如果指定的节点不存在或资源不足,Pod 将不会运行,并报 OutOfmemory 错误。
1.2 nodeSelector(基于标签的硬性约束)
nodeSelector 通过匹配节点的 Label 决定调度位置。
操作演示:
bash
# 1. 查看节点标签
kubectl get node --show-labels
# 2. 给 worker31 打上 SSD 标签
kubectl label node worker31.xianyu.cloud disktype=ssd
具体配置:
yaml
spec:
# 添加 nodeSelector
nodeSelector:
disktype: ssd
containers:
- image: hub.xianyu.cloud/library/nginx
name: nginx
现象观察 :两个 Pod 均被调度到了 worker31。如果删除节点标签,此时不会触发重新部署 ;只有删除 Deployment 的 nodeSelector(kubectl patch deployment webapp --type json -p '[{"op":"remove","path":"/spec/template/spec/nodeSelector"}]'),才会自动触发重新部署,Pod 将重新均衡到多个节点。
1.3 亲和性(Affinity)深度实践
nodeSelector 只能做等值匹配,Affinity 支持硬性(Required)和软性(Preferred)策略。
节点亲和性:
yaml
spec:
affinity:
nodeAffinity:
# 硬性要求:节点必须带有 CPU=L1 或 CPU=L2 的标签
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: CPU
operator: In
values: [L1, L2]
# 软性偏好:节点如果有 MEM=L2 的标签,得分权重更高(权重1-100)
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: MEM
operator: In
values: [L2]
现象观察:
- 节点未打标签时:Pod 为
Pending。 - 给
worker31打CPU=L1标签后:Pod 被调度到worker31。 - 给
worker32也打上CPU=L2后重新部署:Pod 均衡调度到两个节点。 - 给
worker32打上MEM=L2后重新部署:因为软性偏好,Pod 全部优先调度到了worker32。
Pod 间亲和与反亲和(高可用必配) :
具体配置:确保同一个应用的多个副本必须分散在不同物理节点上。
yaml
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: [store]
topologyKey: "kubernetes.io/hostname"
现象观察 :由于集群只有 2 个 worker 节点,当你创建 3 个副本时,前两个分别运行在 worker31 和 worker32,第 3 个处于 Pending 状态。事件日志会提示:didn't match pod anti-affinity rules。
二、高级调度机制:Taint 与 Toleration
污点是节点主动拒绝 Pod,容忍度是 Pod 声明能接受的污点。
2.1 污点的三种 Effect
NoSchedule:硬性限制,未容忍的 Pod 无法调度。PreferNoSchedule:软性限制,尽量避开。NoExecute:驱逐。已在此节点且未容忍的 Pod 会被立刻踢走。
操作演示:给节点打上污点。
bash
kubectl taint nodes worker31.xianyu.cloud CPU=L1:NoSchedule
kubectl taint nodes worker32.xianyu.cloud CPU=L2:NoSchedule
具体配置:Pod 声明容忍度。
yaml
spec:
tolerations:
- key: "CPU"
operator: "Equal"
value: "L1" # 如果写L3,将无法调度
effect: "NoSchedule"
现象观察 :如果写容忍 L3,Pod 状态为 Pending,事件提示:0/3 nodes are available: 1 node(s) had untolerated taint {CPU: L1}, 1 node(s) had untolerated taint {CPU: L2}...。改成 L1 后,Pod 成功分配到 worker31。
2.2 多污点与多容忍的匹配逻辑
当节点有多个污点(CPU=L1:NoSchedule、CPU=L1:NoExecute、MEM=L2:NoSchedule),Pod 必须配置对应的所有容忍度才能调度成功。漏掉任何一个污点的容忍度,都会导致 Pod 无法运行。
三、集群节点维护:Cordon 与 Drain
3.1 cordon(标记不可调度)
bash
kubectl cordon worker31.xianyu.cloud
kubectl get nodes
# worker31.xianyu.cloud Ready,SchedulingDisabled <none> 9d v1.30.2
此时新建的 Pod 会自动避开该节点。
3.2 drain(驱逐节点)
bash
# 默认情况下会报错,因为不能直接删除 DaemonSet 控制的 Pod
kubectl drain worker31.xianyu.cloud
# error: cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore)
# 正确姿势:
kubectl drain worker31.xianyu.cloud --ignore-daemonsets
# 输出:
# evicting pod xianyu/web-59b9bb7664-jkb5q
# node/worker31.xianyu.cloud evicted
维护完成后,使用 kubectl uncordon worker31.xianyu.cloud 恢复调度。
四、Metrics Server 与 HPA 自动伸缩
4.1 Metrics Server 部署与避坑
kubectl top 依赖 Metrics Server 采集 Kubelet 数据。
核心排错 :因为 K8s 是自签证书,必须修改部署 YAML 增加启动参数 - --kubelet-insecure-tls,否则 Pod 会不断 CrashLoopBackOff。
验证是否成功:
text
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master30.xianyu.cloud 97m 4% 1328Mi 35%
worker31.xianyu.cloud 49m 2% 912Mi 24%
4.2 HPA 基于 CPU 压测扩缩容
操作演示:创建 HPA(最少 2 个,最多 5 个,CPU 目标 80%)。
bash
kubectl autoscale deployment web --max=5 --min=2 --cpu-percent=80
必须为 Pod 指定 requests,否则 HPA 的 TARGETS 会显示 cpu: <unknown>/80%。
yaml
resources:
limits:
cpu: 100m
memory: 200Mi
压测与现象观察:
bash
# 开启 100 并发,总请求数 300000
ab -n 300000 -c 100 http://10.100.255.92/
观察过程(每 20 秒左右触发一次扩容):
- 初始状态:
cpu: 100%/80%,REPLICAS为 2。 - 触发扩容:
REPLICAS变 3,新建 Pod。 - 持续负载:
REPLICAS变 4,再变 5。 - 停止压测:负载降低,受冷却窗口影响,稍后自动缩减回 2。
4.3 HPA 基于内存压测与 OOMKilled
实战环境:挂载 200M 大文件,让 Nginx 返回大响应体。
yaml
volumeMounts:
- name: big-file
mountPath: /usr/share/nginx/html
volumes:
- name: big-file
hostPath:
path: /www
HPA 配置:
yaml
metrics:
- resource:
name: memory
target:
type: Utilization
averageUtilization: 60
type: Resource
压测现象 :使用 ab 压测 http://<ip>/big.img。内存飙升触发扩容,REPLICAS 从 2 依次升至 5。如果压测过于猛烈,超过 Limits 限制,Pod 会触发 OOM:
text
NAME READY STATUS RESTARTS AGE
web-88cff78bb-2b7vh 0/1 OOMKilled 1 (2s ago) 3s
4.4 HPA 精细管控行为(Behavior)
通过 behavior 字段控制扩缩容的节奏。
平滑扩容(scaleUp):
yaml
behavior:
scaleUp:
stabilizationWindowSeconds: 60 # 稳定 60 秒确认持续高负载才扩容
policies:
- type: Percent
value: 20
periodSeconds: 30 # 每 30s 最多扩容 20%
- type: Pods
value: 4
periodSeconds: 30 # 每 30s 最多新增 4 个
selectPolicy: Min # 保守扩容
激进缩容(scaleDown):
yaml
scaleDown:
stabilizationWindowSeconds: 30 # 负载下降 30 秒即开始缩容
policies:
- type: Percent
value: 100
periodSeconds: 15 # 每 15s 允许直接缩容 100%
selectPolicy: Max
五、资源配额与限制:Quota 与 Limits
5.1 ResourceQuota 命名空间配额
具体配置:
yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: myquota
spec:
hard:
pods: "2"
requests.cpu: 1000m
requests.memory: "2048Mi"
现象观察:当部署 3 个副本时,因为配额限制最多 2 个 Pod,第 3 个 Pod 创建失败,Deployment 事件中会报错:
text
Error creating: pods "web-96d5df5c8-xg6c9" is forbidden: exceeded quota: myquota, requested: pods=1, used: pods=2, limited: pods=2
5.2 LimitRange 默认值与边界
具体配置:
yaml
apiVersion: v1
kind: LimitRange
metadata:
name: mylimit
spec:
limits:
- type: Container
max:
cpu: 1
memory: 1024Mi
min:
cpu: 100m
memory: 128Mi
default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 200m
memory: 256Mi
核心约束 :min <= defaultRequest <= default <= max。
- 未指定 resources :Pod 自动注入
default为 limits,defaultRequest为 requests。压测 CPU 时,kubectl top显示稳定在501m左右。 - 只指定 limits 且大于 max :直接报错
maximum cpu usage per Container is 1, but limit is 1100m。 - 只指定 limits 且在范围内:requests 自动等于 limits。
- 只指定 requests 且在范围内:limits 自动取 default 值。
5.3 Request 与 Limits 的底层原理
- requests:调度依据,保障 Pod 能拿到的最低资源。
- limits :Cgroup 限制。
- CPU 超限:进程变慢,不会被杀。
- 内存超限 :触发 OOM Killer ,Pod 状态变
OOMKilled并重启。
- QoS 等级:节点资源吃紧时,优先驱逐 BestEffort(无 requests/limits)的 Pod,最后驱逐 Guaranteed(requests 严格等于 limits)的 Pod。