[zh-cn] Updated reserve-compute-resources.md

This commit is contained in:
windsonsea 2022-08-16 09:54:21 +08:00
parent 59cd910ec5
commit b9481b9d1e
1 changed files with 50 additions and 65 deletions

View File

@ -29,10 +29,10 @@ on each node.
--> -->
Kubernetes 的节点可以按照 `Capacity` 调度。默认情况下 pod 能够使用节点全部可用容量。 Kubernetes 的节点可以按照 `Capacity` 调度。默认情况下 pod 能够使用节点全部可用容量。
这是个问题,因为节点自己通常运行了不少驱动 OS 和 Kubernetes 的系统守护进程。 这是个问题,因为节点自己通常运行了不少驱动 OS 和 Kubernetes 的系统守护进程。
除非为这些系统守护进程留出资源,否则它们将与 pod 争夺资源并导致节点资源短缺问题。 除非为这些系统守护进程留出资源,否则它们将与 Pod 争夺资源并导致节点资源短缺问题。
`kubelet` 公开了一个名为 'Node Allocatable' 的特性,有助于为系统守护进程预留计算资源。 `kubelet` 公开了一个名为 'Node Allocatable' 的特性,有助于为系统守护进程预留计算资源。
Kubernetes 推荐集群管理员按照每个节点上的工作负载密度配置 “Node Allocatable” Kubernetes 推荐集群管理员按照每个节点上的工作负载密度配置 'Node Allocatable'
## {{% heading "prerequisites" %}} ## {{% heading "prerequisites" %}}
@ -43,8 +43,7 @@ the kubelet command line option `--reserved-cpus` to set an
[explicitly reserved CPU list](#explicitly-reserved-cpu-list). [explicitly reserved CPU list](#explicitly-reserved-cpu-list).
--> -->
你的 kubernetes 服务器版本必须至少是 1.17 版本,才能使用 kubelet 你的 kubernetes 服务器版本必须至少是 1.17 版本,才能使用 kubelet
命令行选项 `--reserved-cpus` 设置 命令行选项 `--reserved-cpus` 设置[显式预留 CPU 列表](#explicitly-reserved-cpu-list)。
[显式预留 CPU 列表](#explicitly-reserved-cpu-list)。
<!-- steps --> <!-- steps -->
@ -62,11 +61,11 @@ of `kubectl describe node` in the CLI.
Resources can be reserved for two categories of system daemons in the `kubelet`. Resources can be reserved for two categories of system daemons in the `kubelet`.
--> -->
## 节点可分配 {#node-allocatable} ## 节点可分配资源 {#node-allocatable}
![节点容量](/images/docs/node-capacity.svg) ![节点容量](/images/docs/node-capacity.svg)
Kubernetes 节点上的 'Allocatable' 被定义为 pod 可用计算资源量。 Kubernetes 节点上的 'Allocatable' 被定义为 Pod 可用计算资源量。
调度器不会超额申请 'Allocatable'。 调度器不会超额申请 'Allocatable'。
目前支持 'CPU'、'memory' 和 'ephemeral-storage' 这几个参数。 目前支持 'CPU'、'memory' 和 'ephemeral-storage' 这几个参数。
@ -85,7 +84,7 @@ under a cgroup hierarchy managed by the `kubelet`.
--> -->
### 启用 QoS 和 Pod 级别的 cgroups {#enabling-qos-and-pod-level-cgroups} ### 启用 QoS 和 Pod 级别的 cgroups {#enabling-qos-and-pod-level-cgroups}
为了恰当在节点范围实施节点可分配约束,你必须通过 `--cgroups-per-qos` 为了恰当在节点范围实施节点可分配约束,你必须通过 `--cgroups-per-qos`
标志启用新的 cgroup 层次结构。这个标志是默认启用的。 标志启用新的 cgroup 层次结构。这个标志是默认启用的。
启用后,`kubelet` 将在其管理的 cgroup 层次结构中创建所有终端用户的 Pod。 启用后,`kubelet` 将在其管理的 cgroup 层次结构中创建所有终端用户的 Pod。
@ -112,7 +111,7 @@ be configured to use the `systemd` cgroup driver.
### 配置 cgroup 驱动 {#configuring-a-cgroup-driver} ### 配置 cgroup 驱动 {#configuring-a-cgroup-driver}
`kubelet` 支持在主机上使用 cgroup 驱动操作 cgroup 层次结构。 `kubelet` 支持在主机上使用 cgroup 驱动操作 cgroup 层次结构。
驱动通过 `--cgroup-driver` 标志配置。 驱动通过 `--cgroup-driver` 标志进行配置。
支持的参数值如下: 支持的参数值如下:
@ -121,8 +120,7 @@ be configured to use the `systemd` cgroup driver.
* `systemd` 是可选的驱动,使用 init 系统支持的资源的瞬时切片管理 * `systemd` 是可选的驱动,使用 init 系统支持的资源的瞬时切片管理
cgroup 沙箱。 cgroup 沙箱。
取决于相关容器运行时的配置,操作员可能需要选择一个特定的 cgroup 驱动 取决于相关容器运行时的配置,操作员可能需要选择一个特定的 cgroup 驱动来保证系统正常运行。
来保证系统正常运行。
例如,如果操作员使用 `containerd` 运行时提供的 `systemd` cgroup 驱动时, 例如,如果操作员使用 `containerd` 运行时提供的 `systemd` cgroup 驱动时,
必须配置 `kubelet` 使用 `systemd` cgroup 驱动。 必须配置 `kubelet` 使用 `systemd` cgroup 驱动。
@ -143,16 +141,16 @@ kubernetes system daemons.
--> -->
### Kube 预留值 {#kube-reserved} ### Kube 预留值 {#kube-reserved}
- **Kubelet 标志**: `--kube-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]` - **Kubelet 标志**`--kube-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]`
- **Kubelet 标志**: `--kube-reserved-cgroup=` - **Kubelet 标志**`--kube-reserved-cgroup=`
`kube-reserved` 用来给诸如 `kubelet`、容器运行时、节点问题监测器等 `kube-reserved` 用来给诸如 `kubelet`、容器运行时、节点问题监测器等
kubernetes 系统守护进程记述其资源预留值。 Kubernetes 系统守护进程记述其资源预留值。
该配置并非用来给以 Pod 形式运行的系统守护进程留资源。`kube-reserved` 该配置并非用来给以 Pod 形式运行的系统守护进程留资源。`kube-reserved`
通常是节点上 `pod 密度` 的函数。 通常是节点上 `Pod 密度` 的函数。
除了 `cpu``内存` 和 `ephemeral-storage` 之外,`pid` 可用来指定为 除了 `cpu``内存` 和 `ephemeral-storage` 之外,`pid` 可用来指定为
kubernetes 系统守护进程预留指定数量的进程 ID。 Kubernetes 系统守护进程预留指定数量的进程 ID。
<!-- <!--
To optionally enforce `kube-reserved` on kubernetes system daemons, specify the parent To optionally enforce `kube-reserved` on kubernetes system daemons, specify the parent
@ -165,14 +163,13 @@ system daemon should ideally run within its own child control group. Refer to
[the design proposal](https://git.k8s.io/design-proposals-archive/node/node-allocatable.md#recommended-cgroups-setup) [the design proposal](https://git.k8s.io/design-proposals-archive/node/node-allocatable.md#recommended-cgroups-setup)
for more details on recommended control group hierarchy. for more details on recommended control group hierarchy.
--> -->
要选择性地对 kubernetes 系统守护进程上执行 `kube-reserved` 保护,需要把 kubelet 的 要选择性地对 Kubernetes 系统守护进程上执行 `kube-reserved` 保护,需要把 kubelet 的
`--kube-reserved-cgroup` 标志的值设置为 kube 守护进程的父控制组。 `--kube-reserved-cgroup` 标志的值设置为 kube 守护进程的父控制组。
推荐将 kubernetes 系统守护进程放置于顶级控制组之下(例如 systemd 机器上的 推荐将 Kubernetes 系统守护进程放置于顶级控制组之下(例如 systemd 机器上的
`runtime.slice`)。 `runtime.slice`)。
理想情况下每个系统守护进程都应该在其自己的子控制组中运行。 理想情况下每个系统守护进程都应该在其自己的子控制组中运行。
请参考 请参考[这个设计方案](https://git.k8s.io/design-proposals-archive/node/node-allocatable.md#recommended-cgroups-setup)
[这个设计方案](https://git.k8s.io/design-proposals-archive/node/node-allocatable.md#recommended-cgroups-setup)
进一步了解关于推荐控制组层次结构的细节。 进一步了解关于推荐控制组层次结构的细节。
<!-- <!--
@ -195,8 +192,8 @@ with `.slice` appended.
--> -->
### 系统预留值 {#system-reserved} ### 系统预留值 {#system-reserved}
- **Kubelet 标志**: `--system-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]` - **Kubelet 标志**`--system-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]`
- **Kubelet 标志**: `--system-reserved-cgroup=` - **Kubelet 标志**`--system-reserved-cgroup=`
<!-- <!--
`system-reserved` is meant to capture resource reservation for OS system daemons `system-reserved` is meant to capture resource reservation for OS system daemons
@ -214,8 +211,8 @@ daemons.
使用的内存并不记在 Kubernetes 的 Pod 上。 使用的内存并不记在 Kubernetes 的 Pod 上。
同时还推荐为用户登录会话预留资源systemd 体系中的 `user.slice`)。 同时还推荐为用户登录会话预留资源systemd 体系中的 `user.slice`)。
除了 `cpu``内存` 和 `ephemeral-storage` 之外,`pid` 可用来指定为 除了 `cpu``内存` 和 `ephemeral-storage` 之外,`pid` 可用来指定为
kubernetes 系统守护进程预留指定数量的进程 ID。 Kubernetes 系统守护进程预留指定数量的进程 ID。
<!-- <!--
To optionally enforce `system-reserved` on system daemons, specify the parent To optionally enforce `system-reserved` on system daemons, specify the parent
@ -246,7 +243,7 @@ with `.slice` appended.
<!-- <!--
### Explicitly Reserved CPU List ### Explicitly Reserved CPU List
--> -->
### 显式留的 CPU 列表 {#explicitly-reserved-cpu-list} ### 显式留的 CPU 列表 {#explicitly-reserved-cpu-list}
{{< feature-state for_k8s_version="v1.17" state="stable" >}} {{< feature-state for_k8s_version="v1.17" state="stable" >}}
@ -264,8 +261,8 @@ If the Kubelet **does not** have `--system-reserved-cgroup` and `--kube-reserved
the explicit cpuset provided by `reserved-cpus` will take precedence over the CPUs the explicit cpuset provided by `reserved-cpus` will take precedence over the CPUs
defined by `--kube-reserved` and `--system-reserved` options. defined by `--kube-reserved` and `--system-reserved` options.
--> -->
`reserved-cpus` 旨在为操作系统守护程序和 kubernetes 系统守护程序保留一组明确指定编号的 `reserved-cpus` 旨在为操作系统守护程序和 Kubernetes 系统守护程序预留一组明确指定编号的 CPU。
CPU。`reserved-cpus` 适用于不打算针对 cpuset 资源为操作系统守护程序和 kubernetes `reserved-cpus` 适用于不打算针对 cpuset 资源为操作系统守护程序和 Kubernetes
系统守护程序定义独立的顶级 cgroups 的系统。 系统守护程序定义独立的顶级 cgroups 的系统。
如果 Kubelet **没有** 指定参数 `--system-reserved-cgroup``--kube-reserved-cgroup` 如果 Kubelet **没有** 指定参数 `--system-reserved-cgroup``--kube-reserved-cgroup`
`reserved-cpus` 的设置将优先于 `--kube-reserved``--system-reserved` 选项。 `reserved-cpus` 的设置将优先于 `--kube-reserved``--system-reserved` 选项。
@ -280,14 +277,12 @@ system daemon, kubernetes daemons and interrupts/timers to the explicit cpuset
defined by this option, other mechanism outside Kubernetes should be used. defined by this option, other mechanism outside Kubernetes should be used.
For example: in Centos, you can do this using the tuned toolset. For example: in Centos, you can do this using the tuned toolset.
--> -->
此选项是专门为电信/NFV 用例设计的,在这些用例中不受控制的中断或计时器可能会 此选项是专门为电信/NFV 用例设计的,在这些用例中不受控制的中断或计时器可能会影响其工作负载性能。
影响其工作负载性能。 你可以使用此选项为系统或 Kubernetes 守护程序以及中断或计时器显式定义 cpuset
你可以使用此选项为系统或 kubernetes 守护程序以及中断或计时器显式定义 cpuset 这样系统上的其余 CPU 可以专门用于工作负载,因不受控制的中断或计时器的影响得以降低。
这样系统上的其余 CPU 可以专门用于工作负载,因不受控制的中断或计时器的影响得以 要将系统守护程序、Kubernetes 守护程序和中断或计时器移动到此选项定义的显式
降低。
要将系统守护程序、kubernetes 守护程序和中断或计时器移动到此选项定义的显式
cpuset 上,应使用 Kubernetes 之外的其他机制。 cpuset 上,应使用 Kubernetes 之外的其他机制。
例如:在 Centos 系统中,可以使用 tuned 工具集来执行此操作。 例如:在 CentOS 系统中,可以使用 tuned 工具集来执行此操作。
<!-- <!--
### Eviction Thresholds ### Eviction Thresholds
@ -311,14 +306,13 @@ available for pods.
**Kubelet 标志**`--eviction-hard=[memory.available<500Mi]` **Kubelet 标志**`--eviction-hard=[memory.available<500Mi]`
节点级别的内存压力将导致系统内存不足,这将影响到整个节点及其上运行的所有 Pod。 节点级别的内存压力将导致系统内存不足,这将影响到整个节点及其上运行的所有 Pod。
节点可以暂时离线直到内存已经回收为止。 节点可以暂时离线直到内存已经回收为止。为了防止系统内存不足(或减少系统内存不足的可能性),
为了防止或减少可能性系统内存不足kubelet 提供了 kubelet 提供了[资源不足](/zh-cn/docs/concepts/scheduling-eviction/node-pressure-eviction/)管理。
[资源不足](/zh-cn/docs/concepts/scheduling-eviction/node-pressure-eviction/)管理。
驱逐操作只支持 `memory``ephemeral-storage` 驱逐操作只支持 `memory``ephemeral-storage`
通过 `--eviction-hard` 标志预留一些内存后,当节点上的可用内存降至留值以下时, 通过 `--eviction-hard` 标志预留一些内存后,当节点上的可用内存降至留值以下时,
`kubelet` 将尝试驱逐 Pod。 `kubelet` 将尝试驱逐 Pod。
如果节点上不存在系统守护进程Pod 将不能使用超过 `capacity-eviction-hard` 如果节点上不存在系统守护进程Pod 将不能使用超过 `capacity-eviction-hard`指定的资源量。
指定的资源量。因此,为驱逐而预留的资源对 Pod 是不可用的。 因此,为驱逐而预留的资源对 Pod 是不可用的。
<!-- <!--
### Enforcing Node Allocatable ### Enforcing Node Allocatable
@ -343,8 +337,7 @@ specifying `pods` value to the kubelet flag `--enforce-node-allocatable`.
--> -->
`kubelet` 默认对 Pod 执行 'Allocatable' 约束。 `kubelet` 默认对 Pod 执行 'Allocatable' 约束。
无论何时,如果所有 Pod 的总用量超过了 'Allocatable',驱逐 Pod 的措施将被执行。 无论何时,如果所有 Pod 的总用量超过了 'Allocatable',驱逐 Pod 的措施将被执行。
有关驱逐策略的更多细节可以在 有关驱逐策略的更多细节可以在[节点压力驱逐](/zh-cn/docs/concepts/scheduling-eviction/pod-priority-preemption/)页找到。
[节点压力驱逐](/zh-cn/docs/concepts/scheduling-eviction/pod-priority-preemption/)页找到。
可通过设置 kubelet `--enforce-node-allocatable` 标志值为 `pods` 控制这个措施。 可通过设置 kubelet `--enforce-node-allocatable` 标志值为 `pods` 控制这个措施。
<!-- <!--
@ -373,13 +366,11 @@ resources if `kube-reserved` is enforced.
## 一般原则 {#general-guidelines} ## 一般原则 {#general-guidelines}
系统守护进程一般会被按照类似 系统守护进程一般会被按照类似
[Guaranteed pods](/zh-cn/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed) [Guaranteed 的 Pod](/zh-cn/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed)
一样对待。 一样对待。
系统守护进程可以在与其对应的控制组中出现突发资源用量,这一行为要作为 系统守护进程可以在与其对应的控制组中出现突发资源用量,这一行为要作为 Kubernetes 部署的一部分进行管理。
kubernetes 部署的一部分进行管理。
例如,`kubelet` 应该有它自己的控制组并和容器运行时共享 `kube-reserved` 资源。 例如,`kubelet` 应该有它自己的控制组并和容器运行时共享 `kube-reserved` 资源。
不过,如果执行了 `kube-reserved` 约束,则 kubelet 不可出现突发负载并用光 不过,如果执行了 `kube-reserved` 约束,则 kubelet 不可出现突发负载并用光节点的所有可用资源。
节点的所有可用资源。
<!-- <!--
Be extra careful while enforcing `system-reserved` reservation since it can lead Be extra careful while enforcing `system-reserved` reservation since it can lead
@ -389,8 +380,8 @@ recommendation is to enforce `system-reserved` only if a user has profiled their
nodes exhaustively to come up with precise estimates and is confident in their nodes exhaustively to come up with precise estimates and is confident in their
ability to recover if any process in that group is oom-killed. ability to recover if any process in that group is oom-killed.
--> -->
在执行 `system-reserved` 预留策略时请加倍小心,因为它可能导致节点上的 在执行 `system-reserved` 预留策略时请加倍小心,因为它可能导致节点上的关键系统服务出现 CPU 资源短缺、
关键系统服务出现 CPU 资源短缺、因为内存不足而被终止或者无法在节点上创建进程。 因为内存不足而被终止或者无法在节点上创建进程。
建议只有当用户详尽地描述了他们的节点以得出精确的估计值, 建议只有当用户详尽地描述了他们的节点以得出精确的估计值,
并且对该组中进程因内存不足而被杀死时,有足够的信心将其恢复时, 并且对该组中进程因内存不足而被杀死时,有足够的信心将其恢复时,
才可以强制执行 `system-reserved` 策略。 才可以强制执行 `system-reserved` 策略。
@ -402,8 +393,7 @@ ability to recover if any process in that group is oom-killed.
* If absolutely necessary, enforce `system-reserved` over time. * If absolutely necessary, enforce `system-reserved` over time.
--> -->
* 作为起步,可以先针对 `pods` 上执行 'Allocatable' 约束。 * 作为起步,可以先针对 `pods` 上执行 'Allocatable' 约束。
* 一旦用于追踪系统守护进程的监控和告警的机制到位,可尝试基于用量估计的 * 一旦用于追踪系统守护进程的监控和告警的机制到位,可尝试基于用量估计的方式执行 `kube-reserved` 策略。
方式执行 `kube-reserved` 策略。
* 随着时间推进,在绝对必要的时候可以执行 `system-reserved` 策略。 * 随着时间推进,在绝对必要的时候可以执行 `system-reserved` 策略。
<!-- <!--
@ -413,8 +403,7 @@ down utilization of node system daemons, but that is not a priority as of now.
So expect a drop in `Allocatable` capacity in future releases. So expect a drop in `Allocatable` capacity in future releases.
--> -->
随着时间推进和越来越多特性被加入kube 系统守护进程对资源的需求可能也会增加。 随着时间推进和越来越多特性被加入kube 系统守护进程对资源的需求可能也会增加。
以后 kubernetes 项目将尝试减少对节点系统守护进程的利用,但目前这件事的优先级 以后 Kubernetes 项目将尝试减少对节点系统守护进程的利用,但目前这件事的优先级并不是最高。
并不是最高。
所以,将来的发布版本中 `Allocatable` 容量是有可能降低的。 所以,将来的发布版本中 `Allocatable` 容量是有可能降低的。
<!-- discussion --> <!-- discussion -->
@ -433,7 +422,7 @@ Here is an example to illustrate Node Allocatable computation:
这是一个用于说明节点可分配Node Allocatable计算方式的示例 这是一个用于说明节点可分配Node Allocatable计算方式的示例
* 节点拥有 `32Gi` `memeory``16 CPU` 和 `100Gi` `Storage` 资源 * 节点拥有 `32Gi` `memory`、`16 CPU` 和 `100Gi` `Storage` 资源
* `--kube-reserved` 被设置为 `cpu=1,memory=2Gi,ephemeral-storage=1Gi` * `--kube-reserved` 被设置为 `cpu=1,memory=2Gi,ephemeral-storage=1Gi`
* `--system-reserved` 被设置为 `cpu=500m,memory=1Gi,ephemeral-storage=1Gi` * `--system-reserved` 被设置为 `cpu=500m,memory=1Gi,ephemeral-storage=1Gi`
* `--eviction-hard` 被设置为 `memory.available<500Mi,nodefs.available<10%` * `--eviction-hard` 被设置为 `memory.available<500Mi,nodefs.available<10%`
@ -448,19 +437,15 @@ or if overall disk usage exceeds 88Gi If all processes on the node consume as
much CPU as they can, pods together cannot consume more than 14.5 CPUs. much CPU as they can, pods together cannot consume more than 14.5 CPUs.
--> -->
在这个场景下,'Allocatable' 将会是 14.5 CPUs、28.5Gi 内存以及 `88Gi` 本地存储。 在这个场景下,'Allocatable' 将会是 14.5 CPUs、28.5Gi 内存以及 `88Gi` 本地存储。
调度器保证这个节点上的所有 Pod 的内存 `requests` 总量不超过 28.5Gi 调度器保证这个节点上的所有 Pod 的内存 `requests` 总量不超过 28.5Gi,存储不超过 '88Gi'。
存储不超过 '88Gi'。 当 Pod 的内存使用总量超过 28.5Gi 或者磁盘使用总量超过 88Gi 时kubelet 将会驱逐它们。
当 Pod 的内存使用总量超过 28.5Gi 或者磁盘使用总量超过 88Gi 时, 如果节点上的所有进程都尽可能多地使用 CPU则 Pod 加起来不能使用超过 14.5 CPUs 的资源。
kubelet 将会驱逐它们。
如果节点上的所有进程都尽可能多地使用 CPU则 Pod 加起来不能使用超过
14.5 CPUs 的资源。
<!-- <!--
If `kube-reserved` and/or `system-reserved` is not enforced and system daemons If `kube-reserved` and/or `system-reserved` is not enforced and system daemons
exceed their reservation, `kubelet` evicts pods whenever the overall node memory exceed their reservation, `kubelet` evicts pods whenever the overall node memory
usage is higher than 31.5Gi or `storage` is greater than 90Gi. usage is higher than 31.5Gi or `storage` is greater than 90Gi.
--> -->
当没有执行 `kube-reserved` 和/或 `system-reserved` 策略且系统守护进程 当没有执行 `kube-reserved` 和/或 `system-reserved` 策略且系统守护进程使用量超过其预留时,
使用量超过其预留时,如果节点内存用量高于 31.5Gi 或 `storage` 大于 90Gi 如果节点内存用量高于 31.5Gi 或 `storage` 大于 90Gikubelet 将会驱逐 Pod。
kubelet 将会驱逐 Pod。