温馨提示×

Kubernetes在CentOS上的资源管理技巧

小樊
33
2025-11-16 04:12:59
栏目: 智能运维

Kubernetes 在 CentOS 上的资源管理技巧

一 基础配置与节点规划

  • 关闭 Swap:临时执行 swapoff -a,并在 /etc/fstab 中注释 swap 行,避免 kubelet 异常。
  • 内核与网络:启用桥接流量进入 iptables,创建 /etc/sysctl.d/k8s.conf,设置 net.bridge.bridge-nf-call-ip6tables=1net.bridge.bridge-nf-call-iptables=1,执行 sysctl -p
  • 容器运行时:优先使用 containerdCRI-O,网络插件建议 Calico/Flannel,为后续资源调度与网络策略打好基础。
  • 节点规划:结合应用负载为节点配置合适的 CPU/内存/存储,控制平面节点关注稳定性,计算节点关注可扩展与资源密度。

二 工作负载资源配置

  • 为容器设置 requests/limits,示例:
    apiVersion: v1
    kind: Pod
    metadata:
      name: example-pod
    spec:
      containers:
      - name: app
        image: nginx:alpine
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
    
  • 原则:为关键业务设置明确的 requests 以保障调度与稳定性;为所有容器设置 limits 防止资源争抢;内存为硬性限制,超限会被 OOMKilled;CPU 为可压缩资源,超限会被限流。
  • 验证:使用 kubectl describe pod <pod-name> 查看 Limits/Requests 是否生效。

三 命名空间与准入控制

  • 资源配额 ResourceQuota:限制命名空间总体资源用量,示例:
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: ns-quota
      namespace: prod
    spec:
      hard:
        requests.cpu: "4"
        requests.memory: "8Gi"
        limits.cpu: "8"
        limits.memory: "16Gi"
    
  • 限制范围 LimitRange:为未显式声明的容器设置默认 requests/limits,示例:
    apiVersion: v1
    kind: LimitRange
    metadata:
      name: default-limits
      namespace: prod
    spec:
      limits:
      - default:
          memory: "512Mi"
          cpu: "500m"
        defaultRequest:
          memory: "256Mi"
          cpu: "250m"
        type: Container
    
  • Pod 优先级与抢占:定义 PriorityClass 保障关键业务在资源紧张时可优先调度,示例:
    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: high-priority
    value: 1000000
    globalDefault: false
    description: "高优先级业务"
    
    在 Pod 中引用:spec.priorityClassName: high-priority

四 调度与弹性伸缩

  • 亲和性与反亲和性:控制 Pod 分布,提升容错与资源隔离,示例:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/e2e-az-name
              operator: In
              values: ["e2e-az1","e2e-az2"]
    
  • 污点与容忍:为专用节点打污点,仅允许特定 Pod 调度,示例:
    # 节点打污点
    kubectl taint nodes <node> key=value:NoSchedule
    # Pod 容忍
    tolerations:
    - key: "key"
      operator: "Equal"
      value: "value"
      effect: "NoSchedule"
    
  • 弹性伸缩:
    • HPA(基于指标扩缩副本):
      apiVersion: autoscaling/v2
      kind: HorizontalPodAutoscaler
      metadata:
        name: app-hpa
        namespace: prod
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: app
        minReplicas: 2
        maxReplicas: 10
        metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 60
      
    • VPA(基于历史用量调整 requests/limits):部署 VPA 控制器后创建 VPA 对象,设置 updatePolicy.updateMode: "Auto" 实现自动更新(建议与滚动更新配合)。
    • Cluster Autoscaler:与云厂商或本地资源池联动,在节点资源不足时自动扩容节点。

五 监控 日志 与 GPU 管理

  • 监控与告警:部署 Prometheus + Grafana 监控节点/Pod 的 CPU/内存/网络/存储 指标,配置 Alertmanager 规则对异常使用率、节点 NotReady、Pod OOM 等进行告警。
  • 日志管理:使用 EFK(Elasticsearch/Fluentd/Kibana)ELK 集中收集与分析容器日志,便于定位资源瓶颈与异常。
  • GPU 资源:安装 NVIDIA Device Plugin 后,在 Pod 中请求 GPU,示例:
    resources:
      limits:
        nvidia.com/gpu: 1
    
    确保节点已安装 NVIDIA 驱动 与容器运行时 GPU 支持。

0