Tìm tên Pod từ PID process trong cluster Kubernetes

Tổng quan

Trong quá trình vận hành hệ thống Kubernetes, đôi khi bạn cần xác định process nào đang gây ra tình trạng sử dụng tài nguyên bất thường. Bài viết này sẽ hướng dẫn cách xác định Pod tương ứng khi biết PID của một process cụ thể.

Các bước thực hiện

Bước 1: Xác định PID của process

Giả sử chúng ta cần kiểm tra các process đang sử dụng GPU:

[root@centos ~]# nvidia-smi
Thu Jun 15 11:34:39 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 4xx.xx.xx    Driver Version: 4xx.xx.xx    CUDA Version: xx.x     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  A100-SXM4-40GB      On   | 00000000:26:00.0 Off |                    0 |
| N/A   30C    P0    65W / 400W |   6474MiB / 40536MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   1  A100-SXM4-40GB      On   | 00000000:2C:00.0 Off |                    0 |
| N/A   30C    P0    55W / 400W |      0MiB / 40536MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   2  A100-SXM4-40GB      On   | 00000000:65:00.0 Off |                    0 |
| N/A   29C    P0    53W / 400W |      0MiB / 40536MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   3  A100-SXM4-40GB      On   | 00000000:6A:00.0 Off |                    0 |
| N/A   29C    P0    52W / 400W |      0MiB / 40536MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   4  A100-SXM4-40GB      On   | 00000000:A2:00.0 Off |                    0 |
| N/A   28C    P0    55W / 400W |      0MiB / 40536MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   5  A100-SXM4-40GB      On   | 00000000:A7:00.0 Off |                    0 |
| N/A   29C    P0    52W / 400W |      0MiB / 40536MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   6  A100-SXM4-40GB      On   | 00000000:E1:00.0 Off |                    0 |
| N/A   30C    P0    53W / 400W |      0MiB / 40536MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   7  A100-SXM4-40GB      On   | 00000000:E7:00.0 Off |                    0 |
| N/A   28C    P0    55W / 400W |      3MiB / 40536MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      9573      C   python                           6471MiB |
+-----------------------------------------------------------------------------+

Từ kết quả trên, ta thấy process Python đang sử dụng GPU có PID là 9573.

Bước 2: Truy xuất container ID từ PID

Kubernetes sử dụng cgroup để quản lý các container. Ta có thể đọc thông tin cgroup của process để lấy container ID:

[root@centos ~]# cat /proc/9573/cgroup
11:hugetlb:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
10:memory:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
9:blkio:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
8:freezer:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
7:perf_event:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
6:net_prio,net_cls:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
5:pids:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
4:cpuset:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
3:devices:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
2:cpuacct,cpu:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1
1:name=systemd:/kubepods/burstable/pod8c3d1a2b-4f51-4e82-9a12-b3c4d5e6f7a8/9f7e6d5c4b3a2e1f0d9c8b7a6e5d4c3b2a1

Trong đường dẫn cgroup, ta có thể thấy container ID nằm ở phần cuối. Để trích xuất container ID, ta sử dụng awk:

[root@centos ~]# cat /proc/9573/cgroup | awk -F '/' '{print $5}' | head -n 1 | cut -b 1-8
9f7e6d5c

Bước 3: Truy xuất tên Pod từ container ID

Sử dụng crictl để lấy thông tin chi tiết của container và trích xuất nhãn Kubernetes:

[root@centos ~]# crictl inspect -o go-template --template='{{index .status.labels "io.kubernetes.pod.name"}}' 9f7e6d5c
ml-training-job-7f8d9e0c5-ab12-34cd-56ef-7890abcdef12

Kết quả trả về là tên Pod đang chạy process với PID 9573.

Tóm tắt

Quy trình gồm 3 bước chính:

  1. Xác định PID của process cần kiểm tra (sử dụng nvidia-smi, top, hoặc ps)
  2. Đọc /proc/<PID>/cgroup để lấy container ID
  3. Sử dụng crictl để truy vấn thông tin Pod từ container ID

Thẻ: Kubernetes Pod PID crictl cgroup

Đăng vào ngày 11 tháng 7 lúc 08:48