如何将 CPU 和内存请求和限制值表达在一个一致的单位中?

How to express the CPU and memory request and limit values in one consistent unit?

当执行 kubectl describe nodes 命令时,它们 CPU 和内存请求和限制值可以以不同的单位出现,听起来令人难以置信。

在下面的例子中:

  example                     example-85cdb9b4cc-xvpn2              500m (2%)     2 (8%)       256Mi (0%)       512Mi (0%)        2d
  example                     example-zk-0                          1 (4%)        2 (8%)       2Gi (3%)         4Gi (7%)          7d8h
  example                     example-6f54cd4967-jzhxp              2 (8%)        0 (0%)       1500M (2%)       1500M (2%)        2d

我们可以看到 CPU 值有 2 个不同的单位:

500m 
1 which translates as 1000m

内存值有 3 个不同的单位:

M
Gi
Mi

这使得在这些值上编写脚本变得不必要的麻烦。

有没有什么办法可以用一个一致的单位来表示这些值?

无法让 kubectl describe 执行此操作,这是有道理的,因为 describe 是供人类使用的,但我也无法通过 kubectl get -o json 找到执行此操作的方法,这很烦人。 k8s Go 库有一个 resource 包,它可以操纵资源值,这可能是可靠地编写涉及 k8s 的任何脚本的最佳选择 API.

如果您对使用 Go(或其他带有 k8s API 库的语言)不感兴趣,我 运行 通过一个名为 kube-resource-unit-converter which uses that package to normalize units. It doesn't work so well for millicore values, so I opened a PR 的小工具来添加一个 -m 用于打印资源的毫值的标志。将它与 jq 混合,你可以很容易地在脚本中使用它:

# for a container with a 600m cpu limit
$ kubectl get pods -o json | jq -r '.items[0].spec.containers[0].resources.limits.cpu' | ./kube-resource-unit-converter -m
600

或者,我在 DataDog 中看到的一种方法是使用一个 case 语句来解析单元并相应地乘以值。有点笨拙,但不太可能失败或需要更改。