温馨提示×

centos下k8s资源如何分配

小樊
44
2025-12-19 18:56:56
栏目: 智能运维

CentOS 下 Kubernetes 资源分配实践指南

一 核心概念与 QoS

  • 资源模型:为每个容器设置requests(调度所需的最小资源)与limits(允许使用的最大资源),调度器依据 requests 选择节点,kubelet 依据 limits 做运行时约束。CPU 为可压缩资源,内存为不可压缩资源。
  • QoS 等级:
    • Guaranteed:CPU 与内存的 requests 与 limits 均设置且相等,节点资源紧张时最不易被驱逐。
    • Burstable:至少有一种资源设置了 requests(常见为 CPU 或内存),稳定性与弹性介于 Guaranteed 与 BestEffort 之间。
    • BestEffort:未设置任何 requests/limits,资源紧张时优先被驱逐。
  • 建议:生产关键负载尽量使用 Guaranteed;通用服务使用 Burstable 并合理设置 requests;批处理/尽力而为任务可用 BestEffort

二 在 Pod 与容器上设置资源

  • 最小可用示例(为容器设置 requests/limits,避免无约束导致节点资源被抢占):
apiVersion: v1
kind: Pod
metadata:
  name: demo
spec:
  containers:
  - name: app
    image: nginx:1.25
    resources:
      requests:
        cpu: "250m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "256Mi"
  • 命名空间默认与约束(避免“漏配”与资源滥用):
# 默认请求/限制(未显式设置时使用)
apiVersion: v1
kind: LimitRange
metadata:
  name: default-lr
  namespace: default
spec:
  limits:
  - default:
      cpu: "200m"
      memory: "256Mi"
    defaultRequest:
      cpu: "100m"
      memory: "128Mi"
    type: Container

# 命名空间总配额(防止团队/项目超额)
apiVersion: v1
kind: ResourceQuota
metadata:
  name: ns-quota
  namespace: default
spec:
  hard:
    pods: "20"
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
  • 验证命令:
    • 查看节点资源与已分配量:kubectl describe node <node-name>
    • 查看命名空间配额:kubectl get resourcequota -n <ns> -o yaml
    • 查看 Pod 资源字段:kubectl get pod <pod> -o yaml

三 调度与拓扑优化

  • 节点亲和/反亲和(将负载调度到更合适的节点,或避免单点拥塞):
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: disk
          operator: In
          values: ["ssd"]
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values: ["nginx"]
        topologyKey: kubernetes.io/hostname
  • 拓扑分布约束(如 maxSkew)可进一步提升容错与资源分布均衡。
  • 建议:对延迟敏感服务优先选择高性能磁盘/网卡节点;有状态服务通过反亲和分散到不同节点。

四 弹性伸缩与集群规模

  • Pod 水平伸缩(HPA,基于指标自动扩缩副本数):
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-nginx
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60
  • 集群自动扩缩(Cluster Autoscaler):当节点资源不足时自动新增节点,需与云厂商或本地扩容器集成。
  • 前提:部署 Metrics Server,否则 kubectl top 与 HPA 指标不可用。

五 监控 容量规划与 GPU 特殊资源

  • 监控与告警:部署 Prometheus + Grafana 观测节点/Pod 的 CPU、内存、网络、磁盘 IO;结合日志(如 EFK/ELK)定位异常。
  • 容量规划与驱逐阈值:
    • 节点可分配资源 = 节点总资源 − 系统预留(kube-reserved、system-reserved、eviction-threshold)。
    • 合理设置 kubelet 的 eviction-hard/memory.availablecpu.cfs_quota_period 等,避免节点 OOM 与抖动。
    • 定期用 kubectl top nodeskubectl describe node 校准 requests/limits 与实际使用。
  • GPU 等特殊资源:
    • 部署 NVIDIA Device Plugin 后,可在 Pod 中按扩展资源申请:resources.limits: { nvidia.com/gpu: "1" }
    • 结合节点污点与容忍度(Taints/Tolerations)实现 GPU 专属节点池。

0