diff --git a/content/zh-cn/docs/tasks/administer-cluster/reserve-compute-resources.md b/content/zh-cn/docs/tasks/administer-cluster/reserve-compute-resources.md index eeee1b4138..40916de09f 100644 --- a/content/zh-cn/docs/tasks/administer-cluster/reserve-compute-resources.md +++ b/content/zh-cn/docs/tasks/administer-cluster/reserve-compute-resources.md @@ -1,7 +1,6 @@ --- title: 为系统守护进程预留计算资源 content_type: task -min-kubernetes-server-version: 1.8 weight: 290 --- @@ -38,14 +36,14 @@ Kubernetes 推荐集群管理员按照每个节点上的工作负载密度配置 ## {{% heading "prerequisites" %}} -{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} +{{< include "task-tutorial-prereqs.md" >}} + -你的 kubernetes 服务器版本必须至少是 1.17 版本,才能使用 kubelet -命令行选项 `--reserved-cpus` 设置[显式预留 CPU 列表](#explicitly-reserved-cpu-list)。 +你可以使用 [kubelet 配置文件](/zh-cn/docs/tasks/administer-cluster/kubelet-config-file/)来配置以下 +kubelet [设置](/zh-cn/docs/reference/config-api/kubelet-config.v1beta1/)。 @@ -80,22 +78,21 @@ Kubernetes 节点上的 'Allocatable' 被定义为 Pod 可用计算资源量。 ### Enabling QoS and Pod level cgroups To properly enforce node allocatable constraints on the node, you must -enable the new cgroup hierarchy via the `--cgroups-per-qos` flag. This flag is +enable the new cgroup hierarchy via the `cgroupsPerQOS` setting. This setting is enabled by default. When enabled, the `kubelet` will parent all end-user pods under a cgroup hierarchy managed by the `kubelet`. --> ### 启用 QoS 和 Pod 级别的 cgroups {#enabling-qos-and-pod-level-cgroups} -为了恰当地在节点范围实施节点可分配约束,你必须通过 `--cgroups-per-qos` -标志启用新的 cgroup 层次结构。这个标志是默认启用的。 +为了恰当地在节点范围实施节点可分配约束,你必须通过 `cgroupsPerQOS` +设置启用新的 cgroup 层次结构。这个设置是默认启用的。 启用后,`kubelet` 将在其管理的 cgroup 层次结构中创建所有终端用户的 Pod。 ### Kube 预留值 {#kube-reserved} -- **Kubelet 标志**:`--kube-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]` -- **Kubelet 标志**:`--kube-reserved-cgroup=` +- **KubeletConfiguration 设置**:`kubeReserved: {}`。 + 示例值 `{cpu: 100m, memory: 100Mi, ephemeral-storage: 1Gi, pid=1000}` +- **KubeletConfiguration 设置**:`kubeReservedCgroup: ""` -`kube-reserved` 用来给诸如 `kubelet`、容器运行时、节点问题监测器等 +`kubeReserved` 用来给诸如 `kubelet`、容器运行时等 Kubernetes 系统守护进程记述其资源预留值。 -该配置并非用来给以 Pod 形式运行的系统守护进程预留资源。`kube-reserved` +该配置并非用来给以 Pod 形式运行的系统守护进程预留资源。`kubeReserved` 通常是节点上 `Pod 密度` 的函数。 除了 `cpu`、`内存` 和 `ephemeral-storage` 之外,`pid` 可用来指定为 Kubernetes 系统守护进程预留指定数量的进程 ID。 -要选择性地对 Kubernetes 系统守护进程上执行 `kube-reserved` 保护,需要把 kubelet 的 -`--kube-reserved-cgroup` 标志的值设置为 kube 守护进程的父控制组。 +要选择性地对 Kubernetes 系统守护进程上执行 `kubeReserved` 保护,需要把 kubelet 的 +`kubeReservedCgroup` 设置的值设为 kube 守护进程的父控制组, +并[将 `kube-reserved` 添加到 `enforceNodeAllocatable`](#enforcing-node-allocatable)。 -推荐将 Kubernetes 系统守护进程放置于顶级控制组之下(例如 systemd 机器上的 -`runtime.slice`)。 +推荐将 Kubernetes 系统守护进程放置于顶级控制组之下(例如 systemd 机器上的 `runtime.slice`)。 理想情况下每个系统守护进程都应该在其自己的子控制组中运行。 请参考[这个设计方案](https://git.k8s.io/design-proposals-archive/node/node-allocatable.md#recommended-cgroups-setup), 进一步了解关于推荐控制组层次结构的细节。 -请注意,如果 `--kube-reserved-cgroup` 不存在,Kubelet 将 **不会** 创建它。 +请注意,如果 `kubeReservedCgroup` 不存在,Kubelet 将 **不会** 创建它。 如果指定了一个无效的 cgroup,Kubelet 将会无法启动。就 `systemd` cgroup 驱动而言, 你要为所定义的 cgroup 设置名称时要遵循特定的模式: -所设置的名字应该是你为 `--kube-reserved-cgroup` 所给的参数值加上 `.slice` 后缀。 +所设置的名字应该是你为 `kubeReservedCgroup` 所给的参数值加上 `.slice` 后缀。 ### 系统预留值 {#system-reserved} -- **Kubelet 标志**:`--system-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]` -- **Kubelet 标志**:`--system-reserved-cgroup=` +- **KubeletConfiguration 设置**:`systemReserved: {}`。 + 示例值 `{cpu: 100m, memory: 100Mi, ephemeral-storage: 1Gi, pid=1000}` +- **KubeletConfiguration 设置**:`systemReservedCgroup: ""` -`system-reserved` 用于为诸如 `sshd`、`udev` 等系统守护进程记述其资源预留值。 -`system-reserved` 也应该为 `kernel` 预留 `内存`,因为目前 `kernel` +`systemReserved` 用于为诸如 `sshd`、`udev` 等系统守护进程记述其资源预留值。 +`systemReserved` 也应该为 `kernel` 预留 `内存`,因为目前 `kernel` 使用的内存并不记在 Kubernetes 的 Pod 上。 同时还推荐为用户登录会话预留资源(systemd 体系中的 `user.slice`)。 @@ -217,30 +216,31 @@ daemons. Kubernetes 系统守护进程预留指定数量的进程 ID。 -要想为系统守护进程上可选地实施 `system-reserved` 约束,请指定 kubelet 的 -`--system-reserved-cgroup` 标志值为 OS 系统守护进程的父级控制组。 +要想为系统守护进程上可选地实施 `systemReserved` 约束,请指定 kubelet 的 +`systemReservedCgroup` 设置值为 OS 系统守护进程的父级控制组, +并[将 `system-reserved` 添加到 `enforceNodeAllocatable`](#enforcing-node-allocatable)。 推荐将 OS 系统守护进程放在一个顶级控制组之下(例如 systemd 机器上的 `system.slice`)。 -请注意,如果 `--system-reserved-cgroup` 不存在,`kubelet` **不会** 创建它。 +请注意,如果 `systemReservedCgroup` 不存在,`kubelet` **不会** 创建它。 如果指定了无效的 cgroup,`kubelet` 将会失败。就 `systemd` cgroup 驱动而言, 你在指定 cgroup 名字时要遵循特定的模式: -该名字应该是你为 `--system-reserved-cgroup` 参数所设置的值加上 `.slice` 后缀。 +该名字应该是你为 `systemReservedCgroup` 参数所设置的值加上 `.slice` 后缀。 -**Kubelet 标志**: `--reserved-cpus=0-3` -**KubeletConfiguration 标志**:`reservedSystemCPUs: 0-3` +**KubeletConfiguration 设置**:`reservedSystemCPUs:`。示例值 `0-3` -`reserved-cpus` 旨在为操作系统守护程序和 Kubernetes 系统守护程序预留一组明确指定编号的 CPU。 -`reserved-cpus` 适用于不打算针对 cpuset 资源为操作系统守护程序和 Kubernetes +`reservedSystemCPUs` 旨在为操作系统守护程序和 Kubernetes 系统守护程序预留一组明确指定编号的 CPU。 +`reservedSystemCPUs` 适用于不打算针对 cpuset 资源为操作系统守护程序和 Kubernetes 系统守护程序定义独立的顶级 cgroups 的系统。 -如果 Kubelet **没有** 指定参数 `--system-reserved-cgroup` 和 `--kube-reserved-cgroup`, -则 `reserved-cpus` 的设置将优先于 `--kube-reserved` 和 `--system-reserved` 选项。 +如果 Kubelet **没有** 指定参数 `kubeReservedCgroup` 和 `systemReservedCgroup`, +则 `reservedSystemCPUs` 的设置将优先于 `kubeReservedCgroup` 和 `systemReservedCgroup` 选项。 ### 驱逐阈值 {#eviction-Thresholds} -**Kubelet 标志**:`--eviction-hard=[memory.available<500Mi]` +**KubeletConfiguration 设置**: +`evictionHard: {memory.available: "100Mi", nodefs.available: "10%", nodefs.inodesFree: "5%", imagefs.available: "15%"}`。 +示例值: `{memory.available: "<500Mi"}` 节点级别的内存压力将导致系统内存不足,这将影响到整个节点及其上运行的所有 Pod。 节点可以暂时离线直到内存已经回收为止。为了防止系统内存不足(或减少系统内存不足的可能性), kubelet 提供了[资源不足](/zh-cn/docs/concepts/scheduling-eviction/node-pressure-eviction/)管理。 驱逐操作只支持 `memory` 和 `ephemeral-storage`。 -通过 `--eviction-hard` 标志预留一些内存后,当节点上的可用内存降至预留值以下时, +通过 `evictionHard` 设置预留一些内存后,当节点上的可用内存降至预留值以下时, `kubelet` 将尝试驱逐 Pod。 如果节点上不存在系统守护进程,Pod 将不能使用超过 `capacity-eviction-hard` 所指定的资源量。 因此,为驱逐而预留的资源对 Pod 是不可用的。 @@ -321,13 +321,14 @@ kubelet 提供了[资源不足](/zh-cn/docs/concepts/scheduling-eviction/node-pr ### 实施节点可分配约束 {#enforcing-node-allocatable} -**Kubelet 标志**:`--enforce-node-allocatable=pods[,][system-reserved][,][kube-reserved]` +**KubeletConfiguration 设置**:`enforceNodeAllocatable: [pods]`。 +示例值:`[pods,system-reserved,kube-reserved]` 调度器将 'Allocatable' 视为 Pod 可用的 `capacity`(资源容量)。 @@ -337,35 +338,35 @@ by evicting pods whenever the overall usage across all pods exceeds 'Allocatable'. More details on eviction policy can be found on the [node pressure eviction](/docs/concepts/scheduling-eviction/node-pressure-eviction/) page. This enforcement is controlled by -specifying `pods` value to the kubelet flag `--enforce-node-allocatable`. +specifying `pods` value to the KubeletConfiguration setting `enforceNodeAllocatable`. --> `kubelet` 默认对 Pod 执行 'Allocatable' 约束。 无论何时,如果所有 Pod 的总用量超过了 'Allocatable',驱逐 Pod 的措施将被执行。 有关驱逐策略的更多细节可以在[节点压力驱逐](/zh-cn/docs/concepts/scheduling-eviction/pod-priority-preemption/)页找到。 -可通过设置 kubelet `--enforce-node-allocatable` 标志值为 `pods` 控制这个措施。 +可将 KubeletConfiguration `enforceNodeAllocatable` 设置为 `pods` 值来控制这个措施。 -可选地,通过在同一标志中同时指定 `kube-reserved` 和 `system-reserved` 值, -可以使 `kubelet` 强制实施 `kube-reserved` 和 `system-reserved` 约束。 -请注意,要想执行 `kube-reserved` 或者 `system-reserved` 约束, -需要对应设置 `--kube-reserved-cgroup` 或者 `--system-reserved-cgroup`。 +可选地,通过在同一设置中同时指定 `kube-reserved` 和 `system-reserved` 值, +可以使 `kubelet` 强制实施 `kubeReserved` 和 `systemReserved` 约束。 +请注意,要想执行 `kubeReserved` 或者 `systemReserved` 约束, +需要对应设置 `kubeReservedCgroup` 或者 `systemReservedCgroup`。 ## 一般原则 {#general-guidelines} @@ -373,32 +374,32 @@ resources if `kube-reserved` is enforced. [Guaranteed 的 Pod](/zh-cn/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed) 一样对待。 系统守护进程可以在与其对应的控制组中出现突发资源用量,这一行为要作为 Kubernetes 部署的一部分进行管理。 -例如,`kubelet` 应该有它自己的控制组并和容器运行时共享 `kube-reserved` 资源。 -不过,如果执行了 `kube-reserved` 约束,则 kubelet 不可出现突发负载并用光节点的所有可用资源。 +例如,`kubelet` 应该有它自己的控制组并和容器运行时共享 `kubeReserved` 资源。 +不过,如果执行了 `kubeReserved` 约束,则 kubelet 不可出现突发负载并用光节点的所有可用资源。 -在执行 `system-reserved` 预留策略时请加倍小心,因为它可能导致节点上的关键系统服务出现 CPU 资源短缺、 +在执行 `systemReserved` 预留策略时请加倍小心,因为它可能导致节点上的关键系统服务出现 CPU 资源短缺、 因为内存不足而被终止或者无法在节点上创建进程。 建议只有当用户详尽地描述了他们的节点以得出精确的估计值, 并且对该组中进程因内存不足而被杀死时,有足够的信心将其恢复时, -才可以强制执行 `system-reserved` 策略。 +才可以强制执行 `systemReserved` 策略。 * 作为起步,可以先针对 `pods` 上执行 'Allocatable' 约束。 -* 一旦用于追踪系统守护进程的监控和告警的机制到位,可尝试基于用量估计的方式执行 `kube-reserved` 策略。 -* 随着时间推进,在绝对必要的时候可以执行 `system-reserved` 策略。 +* 一旦用于追踪系统守护进程的监控和告警的机制到位,可尝试基于用量估计的方式执行 `kubeReserved` 策略。 +* 随着时间推进,在绝对必要的时候可以执行 `systemReserved` 策略。 ## 示例场景 {#example-scenario} 这是一个用于说明节点可分配(Node Allocatable)计算方式的示例: * 节点拥有 `32Gi` `memory`、`16 CPU` 和 `100Gi` `Storage` 资源 -* `--kube-reserved` 被设置为 `cpu=1,memory=2Gi,ephemeral-storage=1Gi` -* `--system-reserved` 被设置为 `cpu=500m,memory=1Gi,ephemeral-storage=1Gi` -* `--eviction-hard` 被设置为 `memory.available<500Mi,nodefs.available<10%` +* `kubeReserved` 被设置为 `{cpu: 1000m, memory: 2Gi, ephemeral-storage: 1Gi}` +* `systemReserved` 被设置为 `{cpu: 500m, memory: 1Gi, ephemeral-storage: 1Gi}` +* `evictionHard` 被设置为 `{memory.available: "<500Mi", nodefs.available: "<10%"}` -当没有执行 `kube-reserved` 和/或 `system-reserved` 策略且系统守护进程使用量超过其预留时, +当没有执行 `kubeReserved` 和/或 `systemReserved` 策略且系统守护进程使用量超过其预留时, 如果节点内存用量高于 31.5Gi 或 `storage` 大于 90Gi,kubelet 将会驱逐 Pod。 -