确保重要 pod 为 guaranteed 模式

80 阅读5分钟

Guaranteed Pod 的核心判定条件是「Pod 内所有容器的所有已声明计算资源(CPU、内存等),其 requests 与 limits 完全相等」,但还有几个细节补充和可选配置(视你的需求而定),下面逐一拆解清楚:

一、 Guaranteed Pod 完整判定条件(无遗漏)

首先明确:K8s 的 QoS 等级(Guaranteed/Burstable/BestEffort)是针对 Pod 整体 判定的,Guaranteed 的完整条件有 3 点,核心是「requests=limits」,其余是补充约束:

1. 核心条件(必须满足)

对 Pod 内的 所有容器(包括 initContainers 初始化容器、ephemeralContainers 临时容器),每一种声明的计算资源(CPU、memory,若声明了 ephemeral-storage 也需满足),都必须满足: resources.requests.xxx = resources.limits.xxx(数值完全相等)

2. 补充条件 1(隐性满足,无需手动配置)

如果容器 只声明了 limits,未声明 requests,K8s 会 自动将 requests 赋值为与 limits 相等的值,这种情况也满足 Guaranteed 判定。 示例:

# 仅声明 limits,未声明 requests,K8s 自动补全 requests.cpu=1、requests.memory=1Gi,属于 Guaranteed
containers:
- name: app
  image: nginx
  resources:
    limits:
      cpu: "1"
      memory: 1Gi

3. 补充条件 2(无资源声明的特殊情况)

如果容器 完全不声明任何 requests/limits(CPU、memory 都不写),则该容器不影响 QoS 判定;但只要 Pod 内有一个容器声明了资源且未满足「requests=limits」,整个 Pod 就无法被判定为 Guaranteed。

注意:生产环境中,Guaranteed Pod 建议显式声明 requests=limits,避免依赖隐性补全,提高可维护性。

4. 反例(不满足 Guaranteed 的情况)

  • Pod 内有一个容器的 cpu.requests=0.5cpu.limits=1(不相等);
  • 仅声明了 requests,未声明 limits
  • 不同容器的资源对齐状态不一致(一个容器满足,一个容器不满足)。

二、 仅需「Guaranteed QoS 等级」:无需额外配置

如果你的需求只是「让 Pod 被判定为 Guaranteed 等级」(享受 K8s 调度优先、OOM 优先级最低等权益),满足上述资源对齐条件即可,无需任何额外配置,Pod 创建后会自动被标记为 Guaranteed。

示例:标准 Guaranteed Pod 配置(无额外配置,直接生效)

apiVersion: v1
kind: Pod
metadata:
  name: standard-guaranteed-pod
spec:
  # 若有 init 容器,也需满足 requests=limits
  initContainers:
  - name: init-demo
    image: busybox
    command: ["sh", "-c", "echo init done"]
    resources:
      requests:
        cpu: "0.1"
        memory: 256Mi
      limits:
        cpu: "0.1"
        memory: 256Mi
  # 主容器满足 requests=limits
  containers:
  - name: app
    image: nginx:1.25
    resources:
      requests:
        cpu: "1"
        memory: 1Gi
      limits:
        cpu: "1"  # 与 requests 完全相等
        memory: 1Gi  # 与 requests 完全相等
  # 临时容器(若有)也需满足 requests=limits
  ephemeralContainers:
  - name: debug
    image: busybox
    command: ["sh"]
    stdin: true
    tty: true
    resources:
      requests:
        cpu: "0.1"
        memory: 256Mi
      limits:
        cpu: "0.1"
        memory: 256Mi

验证:确认 Pod 为 Guaranteed 等级

创建 Pod 后,通过以下命令验证 QoS 等级:

# 查看 Pod 的 QoS 等级(输出中包含 qosClass: Guaranteed 即生效)
kubectl describe pod standard-guaranteed-pod | grep -i "QoS Class"

三、 需「Guaranteed + cpuset 物理核绑定」:额外配置 kubelet(你的核心需求)

如果你的需求是「Guaranteed Pod 触发 cpuset 物理核硬隔离」(满足业务/管理池分离、避免资源抢占),则 需要额外配置 kubelet 的 CPU 管理策略,仅满足 Guaranteed 是不够的。

1. 额外配置:kubelet 开启 static CPU 管理策略

这是 K8s 原生支持的配置,只有开启 static 策略,kubelet 才会为 Guaranteed Pod 分配 独占的 cpuset 物理核,实现硬隔离(默认 none 策略不会做 cpuset 绑定)。

步骤 1:修改 kubelet 配置文件(/var/lib/kubelet/config.yaml)

# 核心配置:开启 static 策略
cpuManagerPolicy: static
# 可选:关闭按 socket 对齐,支持精细核分配(按需开启)
cpuManagerPolicyOptions:
  alignBySocket: false
# 可选:预留系统 CPU 核,避免挤占管理池
reservedSystemCPUs: "0"
# 可选:reconcile 周期,默认 10s
cpuManagerReconcilePeriod: 10s

步骤 2:重启 kubelet 使配置生效

systemctl daemon-reload
systemctl restart kubelet

2. 关键说明

  • 该配置是 节点级 的(每个节点独立配置),配置后仅对该节点上后续创建的 Guaranteed Pod 生效,已运行的 Pod 无影响;
  • static 策略 仅对 Guaranteed Pod 生效,Burstable/BestEffort Pod 仍按 none 策略处理,不做 cpuset 绑定;
  • 配置生效后,Guaranteed Pod 会被自动分配独占的物理核,无需额外注解,底层通过 cgroup 的 cpuset.cpus 实现隔离。

3. 验证:Guaranteed Pod 已绑定 cpuset 物理核

# 1. 查看 Pod 的 cgroup 路径
POD_CGROUP=$(kubectl describe pod standard-guaranteed-pod | grep -i "Cgroup Path" | awk '{print $3}')

# 2. 查看 Pod 绑定的物理 CPU 核(输出具体核范围即说明 cpuset 绑定生效)
cat /sys/fs/cgroup/cpuset/${POD_CGROUP}/cpuset.cpus

四、 其他可选配置(按需补充,非必须)

1. 配置 nodeSelector/nodeAffinity:绑定指定节点

若需将 Guaranteed Pod 调度到特定节点(如管理池节点),可添加节点选择约束,无额外依赖:

spec:
  nodeSelector:
    node-pool: management-node  # 仅调度到打了该标签的节点

2. 配置 tolerations:容忍节点污点

若目标节点有污点(如管理节点),需添加容忍度才能调度上去:

spec:
  tolerations:
  - key: "pool-type"
    operator: "Equal"
    value: "management"
    effect: "NoSchedule"

3. 配置 resourceQuota:限制命名空间内 Guaranteed Pod 总量

若需控制某个命名空间内的 Guaranteed Pod 总资源,可配置 ResourceQuota,无需额外配置 Pod:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: guaranteed-quota
  namespace: management-pool-ns
spec:
  hard:
    limits.cpu: "4"
    limits.memory: "8Gi"
    pods: "20"

五、 总结

  1. Guaranteed Pod 核心:所有容器的所有声明资源,requests=limits(显式声明或 K8s 自动补全均可);
  2. 仅需 QoS 等级:无需额外配置,满足资源对齐即可;
  3. 需 cpuset 物理核绑定:额外配置 kubelet 的 cpuManagerPolicy=static(节点级);
  4. 其他可选配置(节点绑定、污点容忍、配额限制):按需补充,不影响 Guaranteed 判定和 cpuset 绑定。