我试图衡量在Kubernetes下作为Pod运行的单发进程的资源使用情况。从技术上讲,我需要的东西类似于在/sys/fs/cgroup/memory/..../$container_id/meory.max_usage_in_bytes
和/sys/fs/cgroup/cpu/..../$container_id/cpuacct.usage
中可以找到的东西(....
代表父cgroup路径,无论K8s设置为哪个路径,通常是kubepods/burstable/$pod_uid
)
我知道一些数据可以通过cAdvisor API获得(该API内置在每个节点的kubelet
进程中,并且可以通过kube-proxy访问),但是cAdvisor数据延迟了大约10 -20秒,我没有选择保持Pod并保持其活动状态(并占用调度资源)的时间如此之久,因为监视下的进程本身的寿命很短,并且在内存中保留的时间足够长,因此cAdvisor刷新将使群集上的资源需求几乎翻倍。
请注意,我无法控制在Pod的(单个)容器中运行的过程,启动Pod的命令直接从Kubernetes API到达,而不会受到任何方式的影响,因此我可以不要在容器本身中运行任何代码来获取统计信息(这些信息确实在容器自己的/sys/fs/cgroup/*
视图中可用)。
我还考虑过在同一容器中使用其他容器,因为容器的容器共享相同的主机(甚至是相同的父cgroup),但是我不知道是否可以从中访问父cgroup统计信息一个同级容器。额外的容器很有吸引力,因为无论如何我都必须使用一个额外的“ no-op”容器-主要过程是一次性操作,一旦完成就退出,从而使容器停止运行并失去所有统计信息。额外的容器使我能够保持父cgroup的活动并获取其统计信息(额外容器添加的内存/ cpu常数且可以忽略,因此父统计与直接获取容器统计一样好)。
有没有一种方法可以允许容器中的容器查看父cgroup(或根cgroup)?或者,是否还有另一种方法可以快速检索这些统计信息,而不必等到我发现容器已完成运行之后再等待1-2秒以上?
注意,我还考虑了在运行单发作业,获取统计信息然后才退出的脚本中“包装”工作流程的选项。不幸的是,这取决于“知道”如何一次完成一项工作,而且我并不总是具有该知识,因为“这项工作”位于不是我的容器映像中,并且pod规范不一定包括要运行的命令。如果pod规范未指定命令,它将运行容器的默认入口点,并且无法通过访问Kuberenetes API(我所拥有的所有API)来看到它。
答案 0 :(得分:0)
根据documentation,cAdvisor每秒收集一次指标,然后每分钟发送一次到存储库。延迟也可以与存储库所在的存储的设置有关。它还具有自己的API,您可以在其中查看保存在内存中的当前指标。因此,可以从那里收集有关每个节点的信息。
直接从文件中收集信息不是正确的方法,因为在许多节点上浏览许多容器可能会花费很多时间。但是有可能,例如,您可以在特权模式下的每个节点上使用一个装有/sys/fs/cgroup
的容器,并从那里收集信息。
您可以尝试使用Kubernetes Metrics Server,它是资源使用情况数据的群集范围的聚合器。从Kubernetes 1.8开始,可以通过Metrics API在Kubernetes中使用资源使用率指标,例如容器CPU和内存使用率。这些指标可以由用户直接访问(例如,使用kubectl top
命令),也可以由集群中的控制器使用,例如,水平Pod自动缩放器,以做出决定。