温馨提示×

centos k8s部署的资源如何分配

小樊
52
2026-01-08 06:00:56
栏目: 智能运维

CentOS 上 Kubernetes 资源分配实操指南

一 核心概念与 QoS

  • 资源模型:为每个容器设置 requests(调度依据)与 limits(运行上限);CPU 为可压缩资源(超限会被限流),内存为不可压缩资源(超限会被 OOMKilled)。建议为所有容器显式设置 requests/limits,避免“无请求”导致调度不均与资源抢占。
  • QoS 等级:
    • Guaranteed:CPU 与内存的 requests 与 limits 均设置且相等,节点紧张时最不易被驱逐。
    • Burstable:至少一种资源设置了 requests(常见为 CPU 或内存)。
    • BestEffort:未设置任何 requests/limits,资源紧张时优先被驱逐。
  • 命名空间治理:用 ResourceQuota 限制命名空间总资源,用 LimitRange 设置默认/最小/最大 requests/limits,防止“漏配”。

二 节点与 kubelet 资源配置

  • 系统预留与可分配量:为节点设置 kube-reserved / system-reserved,并配置 eviction-hard(如基于内存压力阈值)避免系统组件与内核 OOM 竞争;节点可分配资源计算为:Capacity − 系统预留 − 驱逐阈值
  • 控制 DaemonSet 资源:日志、监控、网络插件等 DaemonSet 会常驻节点,需为其设置合理 requests/limits,计入节点可分配资源基线。
  • 基础环境要点(CentOS):关闭 Swapswapoff -a 并注释 /etc/fstab 中的 swap 行)、设置 vm.swappiness=0;启用桥接流量进入 iptables/IP6tables(net.bridge.bridge-nf-call-iptables=1net.bridge.bridge-nf-call-ip6tables=1);时钟同步(chrony/timedatectl set-ntp true)。

三 工作负载资源配置示例

  • 容器级 requests/limits(Pod/Deployment 通用)
apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  containers:
  - name: app
    image: nginx:1.25
    resources:
      requests:
        memory: "128Mi"
        cpu: "250m"
      limits:
        memory: "256Mi"
        cpu: "500m"
  • 命名空间配额(ResourceQuota)
apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-a-quota
  namespace: team-a
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
  • 默认与约束(LimitRange,避免漏配)
apiVersion: v1
kind: LimitRange
metadata:
  name: default-lr
  namespace: default
spec:
  limits:
  - default:
      cpu: "200m"
      memory: "256Mi"
    defaultRequest:
      cpu: "100m"
      memory: "128Mi"
    type: Container
  • 水平伸缩(HPA,基于 CPU 利用率)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: app-hpa
  namespace: team-a
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60
  • GPU 专用资源(NVIDIA)
apiVersion: v1
kind: Pod
metadata:
  name: gpu-demo
spec:
  containers:
  - name: cuda
    image: nvidia/cuda:12.2.0-base
    resources:
      limits:
        nvidia.com/gpu: 1   # 申请 1 张 GPU

前置:部署 NVIDIA Device Plugin(如 kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.13.0/nvidia-device-plugin.yml)。

四 调度与拓扑优化

  • 定向与亲和/反亲和:使用 nodeSelector / nodeAffinity / podAffinity / podAntiAffinity 将负载调度到更合适的节点,或对关键服务进行分散,提升稳定性与资源隔离。
  • 拓扑分布约束:使用 podTopologySpreadConstraints(如设置 maxSkew)让关键服务副本在节点间更均衡,降低单点风险。
  • 示例(反亲和分散到不同节点)
affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values: ["nginx"]
        topologyKey: kubernetes.io/hostname
  • 建议:对延迟敏感服务优先选择高性能磁盘/网卡节点;有状态/数据密集服务通过反亲和分散到不同节点。

五 容量规划 监控与排障

  • 监控与指标:部署 Metrics Server,使用 Prometheus + Grafana 观测节点/Pod 的 CPU、内存、网络、磁盘 IO;关注 节点 Allocatable/Allocated、Pod OOMKilled/Throttled、HPA 触发与扩缩容时延。
  • 容量与驱逐:结合压测/线上观测设定 requests/limits(requests 取“常态稳定需求”,limits 取“峰值并留有余量”);合理设置 kubelet eviction-hard/memory.available,避免节点 OOM 与抖动。
  • 弹性扩展:常态流量用 HPA 水平扩展;季节性/大促活动可结合 VPA 做“右-sizing”,并配合灰度/金丝雀发布降低风险。
  • 常用验证命令:
    • 查看节点资源与可分配量:kubectl describe node <node-name>
    • 查看集群资源使用:kubectl top nodes / kubectl top pods -A
    • 检查 Pod 事件与状态:kubectl describe pod <pod-name> -n <ns>
    • 验证配额与限制:kubectl get resourcequota -n <ns> -o yamlkubectl get limitrange -n <ns> -o yaml
    • 快速校验 HPA:kubectl get hpa <hpa-name> -n <ns>
  • 进阶:如需更灵活的外设/专用资源分配,可评估 DRA(Dynamic Resource Allocation) 的成熟度与集群版本支持。

0