CPU和内存的请求值和限制值如何用一个一致的单位表示?



在执行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这样做,这是有意义的,因为描述是为人类消费的,但是我也没有办法从kubectl get -o json中找到这一点,这很烦人。k8s Go库有一个可以操作资源值的资源包,这可能是可靠地编写涉及k8s API的任何脚本的最佳选择。

如果您对使用Go(或其他带有k8s API库的语言)不感兴趣,我确实遇到了一个名为kube-resource-unit-converter的小工具,它使用该包来规范化单元。它不能很好地处理毫数值,所以我打开了一个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语句来解析单元并相应地乘以值。有点模糊,但不太可能失败或需要更改。

最新更新