使用 xargs 从命名空间中的所有 pod 获取日志

pla*_*oom 2 shell kubernetes kubectl

是否有办法从运行 awk 和 xargs 组合等动态命令的特定命名空间中的 pod 获取所有日志?

 kubectl get pods | grep Running | awk '{print $1}' | xargs kubectl logs | grep value
Run Code Online (Sandbox Code Playgroud)

我已尝试上面的命令,但它失败了,就像kubectl logs缺少 pod 名称一样:

错误:预期为“日志 [-f] [-p] (POD | 类型/名称) [-c CONTAINER]”。POD 或 TYPE/NAME 是日志命令的必需参数请参阅“kubectl logs -h”以获取帮助和示例

您对如何从 Running pod 获取所有日志有什么建议吗?

lar*_*sks 5

想想你的管道正在做什么:

该命令将单个kubectl logspod 名称作为参数,但通过使用您可以向它传递多个pod 名称。自由使用命令来调试管道;如果我当前的命名空间中有这些 pod:xargsecho

$ kubectl get pods -o custom-columns=name:.metadata.name
name
c069609c6193930cd1182e1936d8f0aebf72bc22265099c6a4af791cd2zkt8r
catalog-operator-6b8c45596c-262w9
olm-operator-56cf65dbf9-qwkjh
operatorhubio-catalog-48kgv
packageserver-54878d5cbb-flv2z
packageserver-54878d5cbb-t9tgr
Run Code Online (Sandbox Code Playgroud)

然后运行这个命令:

kubectl get pods | grep Running | awk '{print $1}' | xargs echo kubectl logs
Run Code Online (Sandbox Code Playgroud)

生产:

kubectl logs catalog-operator-6b8c45596c-262w9 olm-operator-56cf65dbf9-qwkjh operatorhubio-catalog-48kgv packageserver-54878d5cbb-flv2z packageserver-54878d5cbb-t9tgr
Run Code Online (Sandbox Code Playgroud)

为了做你想做的事,你需要安排kubectl logs使用一个参数多次调用。您可以通过添加-n1xargs命令行来做到这一点。保留echo命令,运行:

kubectl get pods | grep Running | awk '{print $1}' | xargs -n1 echo kubectl logs
Run Code Online (Sandbox Code Playgroud)

让我们:

kubectl logs catalog-operator-6b8c45596c-262w9
kubectl logs olm-operator-56cf65dbf9-qwkjh
kubectl logs operatorhubio-catalog-48kgv
kubectl logs packageserver-54878d5cbb-flv2z
kubectl logs packageserver-54878d5cbb-t9tgr
Run Code Online (Sandbox Code Playgroud)

这样看起来比较合理。如果我们删除 echo 并运行:

kubectl get pods | grep Running | awk '{print $1}' | xargs -n1 kubectl logs | grep value
Run Code Online (Sandbox Code Playgroud)

然后你就会得到你想要的结果。您可能需要添加--prefix参数,kubectl logs以便知道哪个 pod 生成了匹配:

kubectl get pods | grep Running | awk '{print $1}' | xargs -n1 kubectl logs --prefix | grep value
Run Code Online (Sandbox Code Playgroud)

与您的问题没有直接关系,但您可能会失去它grep

kubectl get pods | awk '/Running/ {print $1}' | xargs -n1 kubectl logs --prefix | grep value
Run Code Online (Sandbox Code Playgroud)

甚至失去awk

kubectl get pods --field-selector=status.phase==Running -o name | xargs -n1 kubectl logs --prefix | grep value
Run Code Online (Sandbox Code Playgroud)