“bash” no encontrado al ejecutar xargs en Kubernetes.
Estoy tratando de usar/entender xargs
para imprimir varios detalles de algunos pods que tengo en ejecución en Kubernetes en diferentes namespaces. Por ejemplo, este comando produce:
$ kubectl get pods -A | grep Error | awk '{print $2 "-n=" $1}'
my-pod-kf8xch6y-qc6ms-k6ww2 -n=my-ns
my-pod-kf8xlg64-g0ss7-mdv1x -n=my-ns
my-pod-kldslg64-polf7-msdw3 -n=another-ns
lo cual es correcto/esperado.
Cuando agrego xargs
al comando anterior, obtengo:
$ kubectl get pods -A | grep Error | awk '{print $2 "-n=" $1}' | xargs kubectl $1 get pod $0 -oyaml | grep phase
Error from server (NotFound): pods "bash" not found
phase: Failed
phase: Failed
Lo cual es realmente la salida esperada, pero no entiendo por qué se pasa bash
a xargs
.
davy.ai
La razón por la cual se pasa
bash
axargs
es porquexargs
toma la entrada del comando anterior y la utiliza como argumentos para el siguiente comando. En este caso, la salida del comandoawk
(my-pod-kf8xch6y-qc6ms-k6ww2 -n=my-ns
,my-pod-kf8xlg64-g0ss7-mdv1x -n=my-ns
,my-pod-kldslg64-polf7-msdw3 -n=another-ns
) se pasa como argumentos al comandokubectl
. El primer argumento ($1
) en el comandokubectl
espera el espacio de nombres (namespace), y el segundo argumento ($0
) espera el nombre del pod. Sin embargo, comoxargs
no sabe qué argumento es cada uno, está pasando el primer argumento (my-pod-kf8xch6y-qc6ms-k6ww2
) como el nombre del pod y el segundo argumento (-n=my-ns
) como el espacio de nombres, lo cual resulta enkubectl
buscando un pod llamadobash
en el espacio de nombresmy-ns
y no encontrándolo.