温馨提示×

Kubernetes在Ubuntu上的资源限制怎么设置

小樊
37
2025-11-17 00:15:20
栏目: 智能运维

Kubernetes 在 Ubuntu 上的资源限制设置指南

一 核心概念与生效机制

  • 在 Kubernetes 中,资源限制通过为容器设置 requests(调度所需的最小资源)与 limits(运行时上限)实现。调度器依据 requests 选择节点;kubelet 与内核通过 cgroup 强制执行 limits。其中,CPU 限制以 CFS 节流方式执行,内存限制由内核 OOM Killer 在超限时终止容器。若只设置 limits 而未设置 requests,且未启用准入默认,Kubernetes 会将 limits 的值同时作为 requests。自 v1.32 起可在 Pod 级别声明资源请求/限制(Alpha,默认关闭,当前支持 cpu/memory)。

二 在 Pod 或容器级别设置

  • Deployment/Pod YAML 的容器 spec 中使用 resources 字段即可,单位为:cpu(核,支持毫核 1000m=1 核)memory(字节,如 Mi/Gi)。示例:
apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  containers:
  - name: app
    image: nginx:1.25
    resources:
      requests:
        cpu: "250m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "256Mi"
  • 说明:上述设置与节点是否为 Ubuntu 无关,属于集群通用配置;调度与限额由 kube-scheduler/kubelet 在节点上实施。

三 命名空间级别统一策略

  • 使用 LimitRange 为命名空间设置默认请求/限制,以及最小/最大值,未显式声明时自动注入默认值,并做硬性边界校验:
apiVersion: v1
kind: LimitRange
metadata:
  name: default-mem-cpu
  namespace: dev
spec:
  limits:
  - type: Container
    default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "100m"
      memory: "128Mi"
    min:
      cpu: "100m"
      memory: "64Mi"
    max:
      cpu: "2"
      memory: "1Gi"
  • 使用 ResourceQuota 限制命名空间资源总量(如总 CPU/内存、Pod 数量等),超出后拒绝新建:
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: dev
spec:
  hard:
    pods: "10"
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
  • 提示:LimitRange/ResourceQuota 对存量 Pod 不生效,只对后续创建的对象生效;如需让存量 Pod 受新规则约束,需滚动更新工作负载。

四 节点级别资源保护与驱逐

  • Ubuntu 上通常通过 kubelet 参数为系统与 Kubernetes 组件预留资源,并配置节点压力驱逐阈值,避免节点被“打满”导致不稳定。常见做法(示例值可按需调整):
    • 编辑 kubelet 服务环境(常见路径:/etc/systemd/system/kubelet.service.d/10-kubeadm.conf),在 KUBELET_KUBECONFIG_ARGSKUBELET_EXTRA_ARGS 中加入:
--system-reserved=cpu=500m,memory=1Gi
--kube-reserved=cpu=500m,memory=1Gi
--eviction-hard=memory.available<500Mi,nodefs.available<10%,imagefs.available<15%
--eviction-minimum-reclaim=memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi
--node-status-update-frequency=10s
--eviction-pressure-transition-period=20s
  • 使配置生效并重启 kubelet:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
  • 含义要点:
    • system-reserved/kube-reserved:为 OS 进程/Kubernetes 组件预留资源,提升节点稳定性。
    • eviction-hard:当节点可用资源低于阈值(如 memory.available<500Mi)触发驱逐,释放资源。
    • eviction-minimum-reclaim:每次回收至少释放的资源量,避免频繁驱逐震荡。
    • 常见可监控的驱逐信号还包括 nodefs.available、nodefs.inodesFree、imagefs.available 等。

五 验证与最佳实践

  • 验证方式
    • 查看节点可分配与已分配资源:kubectl describe node <node-name>(关注 Allocatable/Allocated resources)。
    • 查看 Pod 事件与状态:kubectl describe pod <pod-name>(是否因配额/限额/驱逐失败)。
    • 观察容器实际用量:kubectl top pod <pod-name> --containers
    • 在节点上核对 cgroup 限额(以实际容器为准):例如查看内存限制
      • cat /sys/fs/cgroup/memory/kubepods/burstable/pod<uid>/<container-id>/memory.limit_in_bytes
  • 最佳实践
    • 始终为生产负载设置合理的 requests/limits,避免仅设 limits 导致调度偏差或 OOM 风险。
    • 结合 HPA/VPA 做弹性与垂直伸缩,配合 Cluster Autoscaler 自动扩缩节点。
    • 使用 Goldilocks 等工具基于历史用量给出 requests/limits 建议,并持续观测与调优。

0