在执行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语句来解析单元并相应地乘以值。有点模糊,但不太可能失败或需要更改。