Ubuntu上Kubernetes资源调度策略
Kubernetes的资源调度策略是其核心功能之一,旨在将Pod高效、合理地分配到Ubuntu节点上,确保资源充分利用、应用性能稳定及集群可靠性。这些策略涵盖资源需求定义、节点选择规则、调度阶段流程、高级优化机制等多个维度,以下是具体内容:
Pod通过resources.requests(资源请求)和resources.limits(资源限制)明确其对计算资源(CPU、内存)的需求,是调度的基础。
cpu: "250m"、memory: "128Mi"),调度器会确保节点有足够的可用资源(如CPU≥250m、内存≥128Mi)才会将Pod调度到该节点。cpu: "500m"、memory: "256Mi"),当Pod尝试突破限制时,Kubernetes会通过OOM Killer终止内存溢出的进程,或通过CPU throttling限制CPU使用率(如限制为50%),防止资源滥用。LimitRange为命名空间设置默认的requests/limits(如未指定则自动应用),避免用户未配置导致的资源混乱。Kubernetes调度器采用“预选+优选”的两阶段模型,确保Pod被分配到合适的Ubuntu节点:
nodeSelector.zone=us-west-1,则只有带该标签的Ubuntu节点会被保留);NotReady状态;Taint(污点,需Pod有对应Toleration容忍)。NodeResourcesBalancedAllocation插件):优先选择CPU、内存利用率均衡的节点,避免资源碎片;LeastRequestedPriority插件):优先选择当前负载低的节点;NodeAffinity插件):优先选择符合Pod亲和性规则的节点(如“与同服务的其他Pod在同一节点”)。通过**亲和性(Affinity)和反亲和性(Anti-Affinity)**规则,优化Pod在Ubuntu节点上的分布,提升性能或可靠性:
kubernetes.io/os: linux)的配置:affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
支持requiredDuringScheduling(必须满足)和preferredDuringScheduling(优先满足)两种模式。通过污点和容忍机制,控制哪些Pod可以调度到Ubuntu节点:
kubectl taint nodes node1 key=value:NoSchedule),表示该节点“拒绝”调度无对应容忍的Pod(如Master节点通常设置此污点,防止普通Pod调度过来)。tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoSchedule"),允许Pod调度到带对应污点的节点。通过ResourceQuota限制命名空间内所有Pod的资源使用总量,防止某个团队或应用过度占用Ubuntu节点资源。例如:
apiVersion: v1
kind: ResourceQuota
metadata:
name: ubuntu-quota
spec:
hard:
requests.cpu: "4" # 命名空间内所有Pod的CPU总requests不超过4核
requests.memory: "16Gi" # 内存总requests不超过16Gi
limits.cpu: "8" # CPU总limits不超过8核
limits.memory: "32Gi" # 内存总limits不超过32Gi
pods: "20" # Pod数量不超过20个
需配合LimitRange使用,确保Pod的资源请求在合理范围内(如未指定requests的Pod自动应用默认值)。
通过以下机制实现资源动态调整,应对流量波动:
requests和limits(如增加CPU或内存),适合长期运行的应用(如数据库)。需注意:VPA与HPA不建议同时用于同一资源维度(如CPU)。针对Ubuntu系统的特性,可通过以下方式优化资源调度性能:
cpuManagerPolicy: static将容器绑定到特定CPU核心,减少内存访问延迟,提升性能。vm.swappiness降低交换空间使用、net.core.somaxconn增加TCP连接队列长度),优化容器运行环境。ubuntu:22.04替代ubuntu:latest),减少镜像大小和启动时间,降低资源消耗。