【发布时间】:2020-11-17 14:45:43
【问题描述】:
有没有办法让 kubectl exec 命令被历史命令记录在 pod 中? 我想通过监控历史命令来收集容器上执行的所有命令。
示例:
kubectl exec podname -n namespace -c container -- bash -c "ls" ==> 可以用历史命令记录吗?
【问题讨论】:
标签: bash shell kubernetes kubectl
有没有办法让 kubectl exec 命令被历史命令记录在 pod 中? 我想通过监控历史命令来收集容器上执行的所有命令。
示例:
kubectl exec podname -n namespace -c container -- bash -c "ls" ==> 可以用历史命令记录吗?
【问题讨论】:
标签: bash shell kubernetes kubectl
为了了解此行为的完整背景,需要澄清几件事:
首先,kubectl exec 是 docker exec 的简洁 API-based(警告:Medium 成员的故事)包装器。
这是必不可少的,因为这意味着它将使用 Kubernetes API 将您的命令中继到 Docker。这意味着在这种情况下,与 shell 相关的任何行为都与 Docker 如何在容器中实现命令执行直接相关,并且与 kubectl 没有太大关系。
要记住的第二件事是命令本身:history,这是一个 shell 功能,而不是单独的二进制文件。
实现取决于所使用的shell,但通常它会将命令历史缓存在内存中,然后在会话关闭后将其写入历史文件。可以使用 history features“强制”执行此操作,但可能会因 shell 实现而异,并且在使用 docker exec 命令时可能不是统一、可靠的方法。
考虑到这些事情,并且您的请求似乎旨在监控容器中执行的操作,也许更好的方法是使用 Linux audit 到 record commands executed by users。
这不仅不依赖于上述几点,它writes logs to a file 还允许您使用您的Kubernetes logging strategy 来挑选它们,将它们导出到您用作日志接收器的任何地方,便于后续检查。
【讨论】:
history 由于命令的性质及其对 shell 实现的依赖而没有保留。 history,如通常使用的那样,与 docker exec 一起表现不可靠,因此,审计方法。