【问题标题】:Programmatically find overcommitted Kubernetes nodes以编程方式查找过度使用的 Kubernetes 节点
【发布时间】:2020-01-01 17:15:48
【问题描述】:

我希望能够以编程方式查询 Kubernetes 以查找过度使用的节点。

如果我执行kubectl describe nodes,我会得到人类可读的输出,包括我所追求的资源使用信息,例如

Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource                   Requests              Limits
  --------                   --------              ------
  cpu                        786m (40%)            5078m (263%)
  memory                     8237973504500m (74%)  13742432Ki (126%)

但是,kubectl describe 不支持 JSON 或 YAML 输出,并且kubectl get nodes -ojson 不包括分配的资源统计信息。有没有其他方法可以访问这些信息?

【问题讨论】:

  • @dzof31 不,它不是重复的。这个问题涉及以编程方式查找过度使用的 Kubernetes 节点,除了kubectl describe 之外,可能还有其他方法。事实上,您会注意到,您链接的问题的公认答案并不能解决这个问题。
  • @dzof31 除非有一个特定的 API 答案来获取 describe nodes 的资源值

标签: kubernetes kubectl


【解决方案1】:

您可以将输出写入文件吗?

kubectl describe > output.txt

【讨论】:

  • kubectl describe 的输出不适合机器处理(不是说不能做,但是会很黑,很脆,除非没有其他选项。)
【解决方案2】:

如果您使用 --v=6 选项运行任何 kubectl 命令,输出将包括构成输出的 kubernetes API 调用。

kubectl describe nodes NODE 的情况下,您会看到有一个 api/v1/pods 请求过滤节点上的 pod 并删除一些“未运行”状态

I0828 13:44:29.310208   55233 round_trippers.go:438] GET https://kubernetes.docker.internal:6443/api/v1/pods?fieldSelector=spec.nodeName%3Ddocker-desktop%2Cstatus.phase%21%3DFailed%2Cstatus.phase%21%3DSucceeded 200 OK in 4 milliseconds

如果您使用~/.kube/config 文件中的身份验证信息完成此请求,您应该能够获得输出。在这种情况下,使用jq 将输出过滤到具有CA/Cert/Key auth(base64 解码)的容器规范的resources 组件。

curl --cacert ~/.kube/docker-desktop.ca \
 --cert ~/.kube/docker-desktop.cert \
 --key ~/.kube/docker-desktop.key \
 https://kubernetes.docker.internal:6443/api/v1/pods?fieldSelector=spec.nodeName%3Ddocker-desktop%2Cstatus.phase%21%3DFailed%2Cstatus.phase%21%3DSucceeded \
| jq '.items[].spec.containers[].resources'
{}
{}
{
  "limits": {
    "memory": "170Mi"
  },
  "requests": {
    "cpu": "100m",
    "memory": "70Mi"
  }
}
{
  "limits": {
    "memory": "170Mi"
  },
  "requests": {
    "cpu": "100m",
    "memory": "70Mi"
  }
}
{}
{
  "requests": {
    "cpu": "250m"
  }
}
{
  "requests": {
    "cpu": "200m"
  }
}
{}
{
  "requests": {
    "cpu": "100m"
  }
}
{}
{}

如果您经常进入此级别,使用kubernetes API clients 之一运行这些调用和过滤器通常会更容易。

【讨论】:

  • 我还应该注意,kubectl top 将为您提供节点内存的瞬时值,如果您安装了 heapster 或 metrics-server 并且 kubelet 设置正确以使用 cgroups。这是从节点上的当前 cgroups 收集的,因此节点的“实际使用”值比节点承诺的值更多。
  • 我有一个answer over here,详细说明了两种内存跟踪的区别
猜你喜欢
  • 1970-01-01
  • 2015-11-14
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2021-12-11
  • 1970-01-01
  • 2017-11-25
相关资源
最近更新 更多