【发布时间】:2018-08-07 00:45:47
【问题描述】:
我正在尝试测量在 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/* 视图中可用)。
我还考虑在同一个 pod 中使用一个额外的容器,因为 pod 的容器共享同一个主机(甚至是同一个父 cgroup),但我不知道我是否可以访问父 cgroup 统计信息同级容器。额外的容器很有吸引力,因为无论如何我都必须使用一个额外的“无操作”容器——主进程是一次性的,一旦完成就退出,使容器停止并且它的所有统计信息都丢失了。额外的容器允许我保持父 cgroup 活动并获取其统计信息(额外容器添加的内存/cpu 是恒定的且可以忽略不计,因此父统计信息与直接获取容器统计信息一样好)。
有没有办法让 pod 中的容器看到父 cgroup(或根 cgroup)?或者,是否有另一种方法可以快速检索这些统计信息,而无需在我发现容器已完成运行后等待超过 1-2 秒?
注意,我还考虑了在运行一次性作业、获取统计信息然后退出的脚本中“包装”工作流程的选项。不幸的是,这取决于“知道”如何运行该一次性工作——而且我并不总是具备这些知识,因为“工作”在一个不属于我的容器映像中,并且 pod 规范不一定包括一个运行命令。如果 pod 规范没有指定命令,它将运行容器的默认入口点,并且通过访问 Kuberenetes API 是不可见的(这就是我得到的全部)。
【问题讨论】:
标签: kubernetes