Получить pod по pid в kubernetes

В предыдущем посте мы получали pid для пода. Также может возникнуть обратная задача: найти имя под по pid процесса на хосте.

Cначала ищем uid пода. В зависимости от cgroups driver можно получить два варианта:

cgroupfs:

root@kube1:~# grep -R --include=tasks /sys/fs/cgroup/cpu/ -e 3269137
/sys/fs/cgroup/cpu/kubepods/burstable/pod2622bcf3-ee02-4bec-8987-d5e0c4f0683a/c590095fc0cf1348430ca6e31e83f8c6a6881e2f8874e7f2b2c4223c55d53c63/tasks:3269137

systemd:

root@kube2:~# grep -R --include=tasks /sys/fs/cgroup/cpu/ -e 170735
/sys/fs/cgroup/cpu/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod0fab7fef_8df4_4f58_a59c_342c81488230.slice/cri-containerd-f8cfce689b0076e7e4a047e71ba53cea9944c40173c7490f471855a792d26dec.scope/tasks:170735

Ну или ещё можно проще найти cgroups по pid:

grep cpu -m 1 /proc/3269137/cgroup
9:cpuset:/kubepods/burstable/pod2622bcf3-ee02-4bec-8987-d5e0c4f0683a/c590095fc0cf1348430ca6e31e83f8c6a6881e2f8874e7f2b2c4223c55d53c63

отфильтровываем лишнее:

root@kube2:~#  grep -R --include=tasks /sys/fs/cgroup/cpu/ -e 170735 | \
  sed -E 's/.*pod([^/.]{2,}).*/\1/' | tr '_' '-'
0fab7fef-8df4-4f58-a59c-342c81488230

Можем найти имя пода через поиск uid в jsonpath

$ kubectl get po -A --field-selector="spec.nodeName=kube1" \
  -o jsonpath="{range .items[?(@.metadata.uid=='0fab7fef-8df4-4f58-a59c-342c81488230')]}{.metadata.name} {.metadata.namespace}{end}"
calico-node-ldkpk kube-system