Kubernetes: знайти каталог з mounted volume в Pod на хості

Автор |  10/03/2025
 

Маємо AWS Elastic Kubernetes Service, на якому розгорнуто стек VictoriaMetrics (див. VictoriaMetrics: створення Kubernetes monitoring stack з власним Helm-чартом).

Треба перенести дані зі старого поду VMSingle на новий, на новому кластері, а для цього треба знайти ці дані на EC2.

Note: щодо міграції даних VMSingle, то для неї є утиліта vmctl, десь в чернетках лежить пост, як буду робити наступну міграцію – то допишу

Перевірка VMSingle Kubernetes Pod

Перевіряємо дані VMSingle Kubernetes Pod – знаходимо його EC2-інстанс, відповідний Container ID та Mounts:

$ kk describe pod vmsingle-vm-k8s-stack-67d585c9cd-jt4f7
Name:             vmsingle-vm-k8s-stack-67d585c9cd-jt4f7
...
Node:             ip-10-0-46-247.ec2.internal/10.0.46.247
...
Containers:
  vmsingle:
    Container ID:  containerd://57398c3184cd229be564b140f32a9214b38a507137522904eab6ae38b676432a
...
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5xmmq (ro)
      /victoria-metrics-data from data (rw)
...

Підключаємось на сервер (див. AWS: Karpenter та SSH для Kubernetes WorkerNodes):

$ ssh -i .ssh/hOS/atlas-eks-ec2 [email protected]
[ec2-user@ip-10-0-46-247 ~]$ sudo -s
[root@ip-10-0-46-247 ec2-user]#

Але звичного docker CLI тут нема, бо з версії 1.24 у вже ContainerD замість dockershim (див. All you need to know about moving to containerd on Amazon EKS):

[root@ip-10-0-46-247 ec2-user]# docker
bash: docker: command not found

Для роботи з containerd маємо утиліту crictl (Container Runtime Interface CTL):

[root@ip-10-0-46-247 ec2-user]# crictl 
NAME:
   crictl - client for CRI

USAGE:
   crictl [global options] command [command options] [arguments...]

COMMANDS:
   attach              Attach to a running container
   create              Create a new container
   exec                Run a command in a running container
   version             Display runtime version information
   images, image, img  List images
   inspect             Display the status of one or more containers
   inspecti            Return the status of one or more images
   ...

Варіант 1: використання crictl inspect та hostPath

Використовуючи Container ID із kubectl describe pod отримаємо інформацію про цей контейнер на хості і про його mounts:

[root@ip-10-0-46-247 ec2-user]# crictl inspect 57398c3184cd229be564b140f32a9214b38a507137522904eab6ae38b676432a
...
    "mounts": [
      {
        "containerPath": "/victoria-metrics-data",
        "gidMappings": [],
        "hostPath": "/var/lib/kubelet/pods/7b2b0205-8c7e-430f-995b-a45cd79ecb9f/volumes/kubernetes.io~csi/pvc-ed3831bc-56a2-4660-9aef-b47cd252edac/mount",
...

Перевіряємо каталог з hostPath за EC2:

[root@ip-10-0-46-247 ec2-user]# ll /var/lib/kubelet/pods/7b2b0205-8c7e-430f-995b-a45cd79ecb9f/volumes/kubernetes.io~csi/pvc-ed3831bc-56a2-4660-9aef-b47cd252edac/mount
total 40
drwxr-xr-x 6 root root  4096 Oct  1 00:51 cache
drwxr-xr-x 4 root root  4096 Dec  4  2023 data
-rw-r--r-- 1 root root     0 Oct  1 00:52 flock.lock
drwxr-xr-x 6 root root  4096 Sep 29 04:00 indexdb
drwx------ 2 root root 16384 Dec  4  2023 lost+found
drwxr-xr-x 2 root root  4096 Dec  4  2023 metadata
drwxr-xr-x 2 root root  4096 Dec  4  2023 snapshots
drwxr-xr-x 3 root root  4096 Oct  1 00:52 tmp

Варіант 2: з /proc/PID/root

Інший варіант – через PID процесу який ми теж бачили в crictl inspect – в данному випадку це буде 57398c3184cd229be564b140f32a9214b38a507137522904eab6ae38b676432a:

...
  "info": {
    ...
    "pid": 6933,
    ...
    "config": {
      "metadata": {
        "name": "vmsingle"
      },
...

Тоді на хості можемо перевірити /proc/<PID>/root:

[root@ip-10-0-46-247 ec2-user]# ll /proc/6933/root/victoria-metrics-data/
total 40
drwxr-xr-x 6 root root  4096 Oct  1 00:51 cache
drwxr-xr-x 4 root root  4096 Dec  4  2023 data
-rw-r--r-- 1 root root     0 Oct  1 00:52 flock.lock
drwxr-xr-x 6 root root  4096 Sep 29 04:00 indexdb
drwx------ 2 root root 16384 Dec  4  2023 lost+found
drwxr-xr-x 2 root root  4096 Dec  4  2023 metadata
drwxr-xr-x 2 root root  4096 Dec  4  2023 snapshots
drwxr-xr-x 3 root root  4096 Oct  1 00:52 tmp

Готово. Тепер можна зробити rsync цього каталогу на новий Kubernetes WorkerNode.