Є у нас VictoriaMetrics і VictoriaLogs, працюють на AWS Elastic Kubernetes Service.
Мажорні апгрейди EKS ми робимо через створення нового кластеру, а тому з’явилась задача перенесення даних моніторингу зі старого інстансу VMSingle на новий.
Для VictoriaMetrics можемо використати vmctl
, яка через API старого і нового інстансу може мігрувати дані працюючи в ролі проксі між двома інстансами.
З VictoriaLogs ситуація поки що дещо складніша і наразі є два варіанти – далі їх подивимось.
Отже, що маємо:
- старий Kubernetes cluster EKS 1.30
- новий Kubernetes cluster EKS 1.33
Деплоїться нашим власним Helm-чартом, який через dependencies встановлює victoria-metrics-k8s-stack та victoria-logs-single, плюс пачка різних додаткових сервісів типу PostgreSQL Exporter.
Зміст
Міграція метрик VictoriaMetrics
Запуск vmctl
vmctl
підтримує міграцію як з VMSinlge на VMClutser, так і навпаки, або просто між інстансами VMSinlge => VMSinlge, або VMClutser => VMClutser.
В нашому випадку це просто два інстанси VMSingle.
Встановити vmctl
можна встановити локально у поді з VMSingle, див. How to build, але так як CLI все одно працює через API – то простіше створити окремий Pod, і все робити з нього. Docker-образ доступний тут – victoriametrics/vmctl.
Так як entrypoint
для цього образу заданий в /vmctl-prod
, то аби просто зайти в контейнер – передамо --command
, запустимо в циклі ping
та sleep
, і далі спокійно з консолі будемо робити все, що нам треба:
$ kubectl run vmctl-pod --image=victoriametrics/vmctl --restart=Never --command -- /bin/sh -c "while true; echo ping; do sleep 5; done" pod/vmctl-pod created
На якому саме кластері запускати в принципі різниці нема.
Підключаємось в Pod:
$ kk exec -ti vmctl-pod -- sh / #
Перевіримо:
/ # /vmctl-prod vm-native --help NAME: vmctl vm-native - Migrate time series between VictoriaMetrics installations via native binary format USAGE: vmctl vm-native [command options] [arguments...] OPTIONS: -s Whether to run in silent mode. If set to true no confirmation prompts will appear. (default: false) ...
Запуск міграції
Kubernetes Pod з vmctl
буде працювати в ролі проксі між source та destination, тому повинен мати стабільний нетворк.
Крім того, якщо мігруєте великий об’єм даних – то подивіться в бік опції --vm-concurrency
для запуску міграції в кілька паралельних потоків, при цьому кожен воркер буде додатково використовувати CPU/Memory.
В документації також описані можливі проблеми з лімітами – див. Migrating data from VictoriaMetrics, і корисно глянути розділ Migration tips.
Також рекомендується додати фільтр --vm-native-filter-match='{__name__!~"vm_.*"}'
аби не переносити метрики, які відносяться до самої VictoriaMetrics, бо це може призвести до data collision – появи дублікатів тайм-серій.
Хоча в моєму випадку у нас через VMAgent до всіх метрик додається метрика з іменем кластеру:
... vmagent: enabled: true spec: externalLabels: cluster: "eks-ops-1-33" ...
Якщо для VMSingle задані resources.limits
– краще їх відключити або збільшити, і збільшити реквести, бо я ловив 504 та Pod Eviction.
І можливо є сенс винести VMSingle на окрему WorkerNode, бо в нашому випадку для моніторингу використовуються t3
, ще й Spot.
Що і куди мігруємо:
- source: VMSingle на EKS 1.30
- ендпоінт
vmsingle.monitoring.1-30.ops.example.co
- ендпоінт
- destination: VMSingle на EKS 1.33
- ендпоінт
vmsingle.monitoring.1-33.ops.example.co
- ендпоінт
З нашого поду з vmctl
перевіряємо доступ до обох ендпоінтів:
/ # apk add curl / # curl -X GET -I https://vmsingle.monitoring.1-30.ops.example.co HTTP/2 400 / # curl -X GET -I https://vmsingle.monitoring.1-33.ops.example.co HTTP/2 200
І запускаємо міграцію за весь період – не пам’ятаю, коли саме цей кластер було створено, нехай буде січень 2023:
/ # /vmctl-prod vm-native \ > --vm-native-src-addr=https://vmsingle.monitoring.1-30.ops.example.co/ \ > --vm-native-dst-addr=https://vmsingle.monitoring.1-33.ops.example.co \ > --vm-native-filter-match='{__name__!~"vm_.*"}' \ > --vm-native-filter-time-start='2023-01-01' VictoriaMetrics Native import mode ...
Процес пішов:
Ресурси на source – память до 5-6 гігабайт піднімалась:
На destination було трохи більше CPU, але менше пам’яті:
І завершення – зайняло 6 годин, але це я робив без --vm-concurrency
:
... 2025/06/23 19:07:29 Import finished! 2025/06/23 19:07:29 VictoriaMetrics importer stats: time spent while importing: 6h30m8.537582366s; total bytes: 16.5 GB; bytes/s: 705.9 kB; requests: 6882; requests retries: 405; 2025/06/23 19:07:29 Total time: 6h30m8.541808518s
Тепер на новому кластері маємо графіки за місяць, хоча кластер створений тиждень тому:
Якщо міграція зафейлилась
Спочатку перевіряємо запит – треба знайти старі метрики на новому кластері.
Перевіряємо на новому кластері використовуючи лейблу cluster
– корисна штука:
$ curl -s 'http://localhost:8429/prometheus/api/v1/series' -d 'match[]={cluster="eks-ops-1-30"}' | jq ... { "__name__": "yace_cloudwatch_targetgroupapi_requests_total", "cluster": "eks-ops-1-30", "job": "yace-exporter", "instance": "yace-service:5000", "prometheus": "ops-monitoring-ns/vm-k8s-stack" } ...
Документація з видалення метрик і взагалі роботі з VictoriaMetrics API – How to delete or replace metrics in VictoriaMetrics і Deletes time series from VictoriaMetrics.
Виконуємо запит на /api/v1/admin/tsdb/delete_series
:
$ curl -s 'http://localhost:8429/api/v1/admin/tsdb/delete_series' -d 'match[]={cluster="eks-ops-1-30"}
Перевіряємо:
$ curl -s 'http://localhost:8429/prometheus/api/v1/series' -d 'match[]={cluster="eks-ops-1-30"}' | jq { "status": "success", "data": [] }
Тепер можна повторити міграцію.
Інший варіант – додати опцію dedup.minScrapeInterval=1ms
, тоді VictoriaMetrics сама видалить дублікати, але я цей варіант не тестив.
Міграція VictoriaLogs
З VictoriaLogs ситуація трохи складніша, бо vlogscli поки що (сподіваюсь, додадуть) не має якоїсь опції для переносу даних як в vmctl
.
І тут є проблема:
- якщо в VictoriaLogs на новому кластері ще нема ніяких даних – то можна просто скопіювати старі даних з
rsync
в PVC нового інстансу VictoriaLogs- аналогічно, якщо дані є, але нема overlapping днів, бо дані в VictoriaLogs storage зберігаються в каталогах по дням, і їм можна спокійно переносити
- але якщо дані є, та/або дні дублюються – то поки що єдиний варіант це запускати два інстанси VictoriaLogs: один зі старими даними, один з новими, а перед ними мати інстанс
vlselect
Коли додадуть Object Storage – то буде простіше, і це вже є в Roadmap. Тоді можна буде просто все тримати в AWS S3, як це у нас зараз в Grafana Loki.
Варіант 1: копіювання даних з rsync
Отже перший варіант – якщо в новому інстансі VictoriaLogs даних нема, або нема записів в одні і ті ж дні на обох інстансах – старому і новому.
Тут ми можемо просто скопіювати дані, і вони будуть доступні на новому Kubernetes-кластері.
Я робив з rsync, але можна спробувати зробити з утилітами типу korb
.
Перевіримо де зберігаються логи в VictoriaLogs Pod:
$ kk describe pod atlas-victoriametrics-vmlogs-new-server-0 Name: atlas-victoriametrics-vmlogs-new-server-0 ... Containers: vlogs: ... Args: --storageDataPath=/storage ... Mounts: /storage from server-volume (rw) ... Volumes: server-volume: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: server-volume-atlas-victoriametrics-vmlogs-new-server-0 ReadOnly: false ...
І зміст директорії /storage
:
~ $ ls -l /storage/partitions/ total 32 drwxrwsr-x 4 1000 2000 4096 Jun 16 00:00 20250616 drwxrwsr-x 4 1000 2000 4096 Jun 17 00:00 20250617 drwxrwsr-x 4 1000 2000 4096 Jun 18 00:00 20250618 drwxrwsr-x 4 1000 2000 4096 Jun 19 00:00 20250619 drwxrwsr-x 4 1000 2000 4096 Jun 20 00:00 20250620 drwxr-sr-x 4 1000 2000 4096 Jun 21 00:00 20250621 drwxr-sr-x 4 1000 2000 4096 Jun 22 00:00 20250622 drwxr-sr-x 4 1000 2000 4096 Jun 23 00:00 20250623
Але в самому поді нема ані rsync
, ані SSH, і ми навіть не можемо їх встановити:
~ $ rsync sh: rsync: not found ~ $ apk add rsync ERROR: Unable to lock database: Permission denied ERROR: Failed to open apk database: Permission denied ~ $ su su: must be suid to work properly ~ $ sudo -s sh: sudo: not found ~ $ ssh sh: ssh: not found
Тому просто зробимо rsync
зі старого EC2 на новий.
Як знайти потрібний каталог на хості – писав в Kubernetes: знайти каталог з mounted volume в Pod на хості.
Налаштування доступу SSH на EC2 в EKS – AWS: Karpenter та SSH для Kubernetes WorkerNodes.
Перевіряємо Pod на старому кластері – знаходимо його EC2 та Container ID:
$ kk describe pod atlas-victoriametrics-vmlogs-new-server-0 | grep 'Node\|Container' Node: ip-10-0-39-190.ec2.internal/10.0.39.190 Containers: Container ID: containerd://db9fa73a4d37045b0338ae48438f9815e4f6f92c3fd6546604ca5d1338f19844 ...
Підключаємось на WorkerNode:
$ ssh -i ~/.ssh/eks_ec2 [email protected]
В mounts[]
знаходимо каталог для /storage
:
[root@ip-10-0-39-190 ec2-user]# crictl inspect db9fa73a4d37045b0338ae48438f9815e4f6f92c3fd6546604ca5d1338f19844 | jq ... "mounts": [ { "containerPath": "/storage", "gidMappings": [], "hostPath": "/var/lib/kubelet/pods/5192e1f9-20ea-49c6-99ed-775af5e44183/volumes/kubernetes.io~csi/pvc-43c427fa-b05c-45b8-8bdb-92b00bff3496/mount", ...
Перевіряємо зміст:
[root@ip-10-0-39-190 ec2-user]# ll /var/lib/kubelet/pods/5192e1f9-20ea-49c6-99ed-775af5e44183/volumes/kubernetes.io~csi/pvc-43c427fa-b05c-45b8-8bdb-92b00bff3496/mount total 24 drwxrwsr-x 3 ec2-user 2000 4096 Nov 19 2024 cache -rw-rw-r-- 1 ec2-user 2000 0 Jun 20 19:20 flock.lock drwxrws--- 2 root 2000 16384 Sep 4 2024 lost+found drwxrwsr-x 10 ec2-user 2000 4096 Jun 25 00:25 partitions
Нам тут треба тільки дані з каталогу partitions
.
Повторюємо для VictoriaLogs на новому кластері, правда Amazon Linux 2023 не має critctl
– втім, є ctr
.
Перевіряємо Linux Namespaces для контейнерів:
[root@ip-10-0-41-247 ec2-user]# ctr ns ls NAME LABELS k8s.io
Перевіряємо контейнер з ctr containers info
:
[root@ip-10-0-41-247 ec2-user]# ctr -n k8s.io containers info 9fd6fefaec92ab76093651239f6e177686e7c7dd012d53d4bf2e6820260aa884 ... { "destination": "/storage", "type": "bind", "source": "/var/lib/kubelet/pods/4b2f179d-9ada-403e-9680-b76e3507563f/volumes/kubernetes.io~csi/pvc-da384ead-50e8-425f-b3b0-47c35f3a5155/mount", ...
І зміст /var/lib/kubelet/pods/4b2f179d-9ada-403e-9680-b76e3507563f/volumes/kubernetes.io~csi/pvc-da384ead-50e8-425f-b3b0-47c35f3a5155/mount
:
[root@ip-10-0-41-247 ec2-user]# ll /var/lib/kubelet/pods/4b2f179d-9ada-403e-9680-b76e3507563f/volumes/kubernetes.io~csi/pvc-da384ead-50e8-425f-b3b0-47c35f3a5155/mount total 20 -rw-rw-r--. 1 ec2-user 2000 0 Jun 25 12:18 flock.lock drwxrws---. 2 root 2000 16384 Jun 10 09:41 lost+found drwxrwsr-x. 10 ec2-user 2000 4096 Jun 25 00:32 partitions
Зверніть увагу на UID юзерів та групи даних, мають бути однакові – ec2-user(1000)
та група 2000
на обох EC2 інстансах.
На старому кластері створюємо SSH-ключ і перевіряємо підключення на EC2 нового кластеру:
[root@ip-10-0-39-190 ec2-user]# ssh -i .ssh/eks [email protected] ... [ec2-user@ip-10-0-41-247 ~]$
ОК, є.
Тепер на обох інстансах встановлюємо rsync
:
[root@ip-10-0-39-190 ec2-user]# yum -y install rsync
Про всяк випадок – можна забекапити дані на новому інстансі – або снапшот EBS, або з tar
.
І ще нюанс – з retention period, добре, що згадав – він у нас всього 7 днів. Тому якщо скопіювати дані зараз – то старі логи видаляться.
Міняємо:
... retentionPeriod: 30d ...
На новому інстансі зробимо каталог, куди будемо переносити дані (можна і відразу в каталог PVC):
[root@ip-10-0-41-247 ec2-user]# mkdir vmlogs
І зі старого запускаємо rsync
на новий інстанс в $HOME/vmlogs
:
[root@ip-10-0-39-190 ec2-user]# rsync -avz --progress -e "ssh -i .ssh/eks" \ > /var/lib/kubelet/pods/5192e1f9-20ea-49c6-99ed-775af5e44183/volumes/kubernetes.io~csi/pvc-43c427fa-b05c-45b8-8bdb-92b00bff3496/mount/partitions/ \ > [email protected]:/home/ec2-user/vmlogs/ ...
Тут:
-a
: архівний режим (зберігає права, час create/modify та структуру)-v
: verbose режим-z
: компресія даних--progress
: відобразити прогрес-e
: команда з ssh-ключем
Першим аргументом задаємо локальну директорію, другим – куди копіюємо.
І для source вказуємо “/
” в кінці .../mount/partitions/
– скопіювати зміст, а не саму папку.
Якщо витикають помилки з permission denied – додаємо --rsync-path="sudo rsync"
.
Передача завершена:
... sent 2,483,902,797 bytes received 189,037 bytes 20,614,869.99 bytes/sec total size is 2,553,861,458 speedup is 1.03
Перевіряємо дані на новому інстансі:
[root@ip-10-0-41-247 ec2-user]# ll vmlogs/ total 0 drwxrwsr-x. 4 ec2-user ec2-user 35 Jun 18 00:00 20250618 drwxrwsr-x. 4 ec2-user ec2-user 35 Jun 19 00:00 20250619 drwxrwsr-x. 4 ec2-user ec2-user 35 Jun 20 00:00 20250620 drwxr-sr-x. 4 ec2-user ec2-user 35 Jun 21 00:00 20250621 drwxr-sr-x. 4 ec2-user ec2-user 35 Jun 22 00:00 20250622 drwxr-sr-x. 4 ec2-user ec2-user 35 Jun 23 00:00 20250623 drwxr-sr-x. 4 ec2-user ec2-user 35 Jun 24 00:00 20250624 drwxr-sr-x. 4 ec2-user ec2-user 35 Jun 25 00:00 20250625
Ну і тут власне я зіткнувся з проблемою overlapping data:
[root@ip-10-0-41-247 ec2-user]# cp -r vmlogs/* /var/lib/kubelet/pods/84a4ecd3-21a0-4eec-bebc-078a5105bf86/volumes/kubernetes.io~csi/pvc-da384ead-50e8-425f-b3b0-47c35f3a5155/mount/partitions/ cp: overwrite '/var/lib/kubelet/pods/84a4ecd3-21a0-4eec-bebc-078a5105bf86/volumes/kubernetes.io~csi/pvc-da384ead-50e8-425f-b3b0-47c35f3a5155/mount/partitions/20250618/datadb/parts.json'?
Питав розробників про варіант з JSON merge – але це не спрацює.
Якщо ж дані не перетинаються – то просто копіюємо дані і рестартимо Pod з VictoriaLogs.
В моєму випадку довелось робити трошки інакше.
Варіант 2: запуск двох VMLogs + vlselect
Отже, якщо у нас є дані за одні і ті ж дні на старому і новому інстансах VictoriaLogs – то робимо таким чином:
- на новому EKS-кластері створюємо другий інстанс VMLogs
- в його PVC копіюємо дані зі старого кластеру
- додаємо Pod з
vlselect
- для
vlselect
вказуємо два source – обидва інстанси VMLogs - і потім для Grafana VictoriaLogs data source використовуємо URL сервісу
vlselect
Можна було б просто додати vlselect
, і роутити запити на старий кластер – але нам треба старий кластер видаляти.
vlselect
vs VMLogs
Фактично vlselect
це той самий бінарний файл, що і VictoriaLogs, що дуже спрощую нам весь сетап – див. документацію VictoriaLogs cluster:
Note that all the VictoriaLogs cluster components –
vlstorage
,vlinsert
andvlselect
– share the same executable –victoria-logs-prod
.
Тому ми просто можемо взяти ще один чарт victoria-logs-single, і все запускати з нього.
І насправді ми будемо будувати такий собі “VictoriaLogs cluster на мінімалках”:
- наш поточний інстанс VictoriaLogs буде грати роль
vlinsert
таvlstorage
– туди пишуться нові логи нового кластеру - новий інстанс VictoriaLogs буде грати роль
vlstorage
– в ньому ми будемо зберігати дані зі старого кластеру - третій інстанс VictoriaLogs буде грати роль
vlselect
– він буде ендпоінтом для Grafana, і буде робити API-запити з пошуком логів з обох інстансів VictoriaLogs
Helm chart update
Я поки не готовий запускати повноцінну версію VictoriaLogs cluster, тому просто додамо ще парочку dependencies в наш поточний Helm chart.
Редагуємо Chart.yaml
:
... dependencies: ... - name: victoria-logs-single version: ~0.11.2 repository: https://victoriametrics.github.io/helm-charts alias: vmlogs-new - name: victoria-logs-single version: ~0.11.2 repository: https://victoriametrics.github.io/helm-charts alias: vmlogs-old - name: victoria-logs-single version: ~0.11.2 repository: https://victoriametrics.github.io/helm-charts alias: vlselect ...
Тут деплоїмо три чарти (точніше, чарт один – просто з різними values, див. Helm: multiple деплой одного чарта з Chart’s dependency), і кожному задаємо власний alias
:
vmlogs-new
: поточний інстанс VMLogs на новому EKS кластеріvmlogs-old
: новий інстанс, в який будемо переносити дані зі старого EKS кластеруvlselect
: буде нашим новим ендпоінтом для пошуку логів
Єдиний момент, що під час деплою може бути помилка через довжину імен подів, бо я спочатку задав надто довгі імена в alias
:
... Pod "atlas-victoriametrics-victoria-logs-single-old-server-0" is invalid: metadata.labels: Invalid value: "atlas-victoriametrics-victoria-logs-single-old-server-77cf9cd79d": must be no more than 63 characters ...
Що треба перевірити в дефолтному values.yaml
чарту victoria-logs-single
:
... persistentVolume: # -- Create/use Persistent Volume Claim for server component. Use empty dir if set to false enabled: true size: 10Gi ... ingress: # -- Enable deployment of ingress for server component enabled: false ...
Для інстансу vlselect
додаємо storageNode
, де через кому вказуємо ендпоінти обох VictoriaLogs, і при потребі задаємо параметри для persistentVolume
:
... vmlogs-new: server: persistentVolume: enabled: true storageClassName: gp2-retain size: 30Gi retentionPeriod: 14d vmlogs-old: server: persistentVolume: enabled: true storageClassName: gp2-retain size: 30Gi retentionPeriod: 14d vlselect: server: extraArgs: storageNode: atlas-victoriametrics-vmlogs-new-server:9428,atlas-victoriametrics-vmlogs-old-server:9428 ...
Деплоїмо стек, і перевіряємо Pods:
$ kk get pod | grep 'vmlogs\|vlselect' atlas-victoriametrics-vlselect-server-0 1/1 Running 0 19h atlas-victoriametrics-vmlogs-new-server-0 1/1 Running 0 76s atlas-victoriametrics-vmlogs-old-server-0 1/1 Running 0 76s
Сервіси:
$ kk get svc | grep 'vmlogs\|vlselect' atlas-victoriametrics-vlselect-server ClusterIP None <none> 9428/TCP 22h atlas-victoriametrics-vmlogs-new-server ClusterIP None <none> 9428/TCP 42s atlas-victoriametrics-vmlogs-old-server ClusterIP None <none> 9428/TCP 42s
Тепер у нас Promtail на новому кластері продовжує писати в atlas-victoriametrics-vmlogs-new-server
, а atlas-victoriametrics-vmlogs-old-server
у нас пустий інстанс VMLogs.
Можемо перевірити доступ до логів через інстанс vlselect
:
$ kk port-forward svc/atlas-victoriametrics-vlselect-server 9428
Перенос даних зі старого кластеру
Далі, власне, просто повторюємо те, що робили вище – знаходимо каталог PVC, і копіюємо туди дані зі старого кластеру.
Цього разу спочатку собі на робочу машину, а потім звідси вже в Kubernetes:
[setevoy@setevoy-work ~] $ mkdir vmlogs_back
Поки писав, VictoriaLogs на старому кластері вже переїхав на новий EC2, тому шукаємо дані заново.
Переключаємо kubectl
на старий кластер, і шукаємо Pod:
$ kk describe pod atlas-victoriametrics-victoria-logs-single-server-0 | grep 'Node\|Container' Node: ip-10-0-38-72.ec2.internal/10.0.38.72 Containers: Container ID: containerd://c168d4487282dd7d868aadcfcd1840e4e15cfd360f56f542a98b77978f91e252 ...
Підключаємось, знаходимо директорію:
[root@ip-10-0-38-72 ec2-user]# crictl inspect c168d4487282dd7d868aadcfcd1840e4e15cfd360f56f542a98b77978f91e252 ... "mounts": [ { "containerPath": "/storage", "gidMappings": [], "hostPath": "/var/lib/kubelet/pods/f84ef4b9-272f-437e-9f98-649e1707ed09/volumes/kubernetes.io~csi/pvc-43c427fa-b05c-45b8-8bdb-92b00bff3496/mount", ...
Встановлюємо там rsync
, і копіюємо дані на робочу машину:
$ rsync -avz --progress -e "ssh -i .ssh/eks_ec2" \ > --rsync-path="sudo rsync" \ > [email protected]:/var/lib/kubelet/pods/f84ef4b9-272f-437e-9f98-649e1707ed09/volumes/kubernetes.io~csi/pvc-43c427fa-b05c-45b8-8bdb-92b00bff3496/mount/partitions/ \ > /home/setevoy/vmlogs_back/ ...
Перевіряємо в себе:
$ ll ~/vmlogs_back/ total 32 drwxrwsr-x 4 setevoy setevoy 4096 Jun 19 03:00 20250619 drwxrwsr-x 4 setevoy setevoy 4096 Jun 20 03:00 20250620 drwxrwsr-x 4 setevoy setevoy 4096 Jun 21 03:00 20250621 ...
Тепер переносимо все на новий кластер, там де Pod atlas-victoriametrics-vmlogs-old-server-0
.
Переключаємо kubectl
на новий кластер, знаходимо WorkerNode і Container ID:
$ kd atlas-victoriametrics-vmlogs-old-server-0 | grep 'Node\|Container' Node: ip-10-0-36-143.ec2.internal/10.0.36.143 Containers: Container ID: containerd://f10118b10afab75c43e03adcc0644af5caa8654687cd81e59cdf15bd8c32cb31 ...
Логінимось і знаходимо директорію:
[root@ip-10-0-36-143 ec2-user]# ctr -n k8s.io containers info f10118b10afab75c43e03adcc0644af5caa8654687cd81e59cdf15bd8c32cb31 ... { "destination": "/storage", "type": "bind", "source": "/var/lib/kubelet/pods/297b75ec-63fa-4061-bb23-7a6a120da939/volumes/kubernetes.io~csi/pvc-c7373468-f247-4596-b2e2-87852aad71bb/mount", ...
Перевіряємо – там має бути пусто:
drwxr-sr-x. 2 ec2-user 2000 4096 Jun 26 13:14 partitions [root@ip-10-0-36-143 ec2-user]# ls -l /var/lib/kubelet/pods/297b75ec-63fa-4061-bb23-7a6a120da939/volumes/kubernetes.io~csi/pvc-c7373468-f247-4596-b2e2-87852aad71bb/mount/partitions/ total 0
Встановлюємо там rsync
і копіюємо дані з локальної директорії /home/setevoy/vmlogs_back/
на новий EKS кластер:
$ rsync -avz --progress -e "ssh -i .ssh/eks_ec2" --rsync-path="sudo rsync" \ > /home/setevoy/vmlogs_back/ \ > [email protected]:/var/lib/kubelet/pods/297b75ec-63fa-4061-bb23-7a6a120da939/volumes/kubernetes.io~csi/pvc-c7373468-f247-4596-b2e2-87852aad71bb/mount/partitions/ ...
Перевіряємо дані там:
[root@ip-10-0-36-143 ec2-user]# ls -l /var/lib/kubelet/pods/297b75ec-63fa-4061-bb23-7a6a120da939/volumes/kubernetes.io~csi/pvc-c7373468-f247-4596-b2e2-87852aad71bb/mount/partitions/ total 32 drwxrwsr-x. 4 ec2-user ec2-user 4096 Jun 19 00:00 20250619 drwx--S---. 2 root ec2-user 4096 Jun 26 13:39 20250620 drwx--S---. 2 root ec2-user 4096 Jun 26 13:39 20250621 drwx--S---. 2 root ec2-user 4096 Jun 26 13:39 20250622 drwx--S---. 2 root ec2-user 4096 Jun 26 13:39 20250623 ...
Міняємо юзера і групу:
[root@ip-10-0-36-143 ec2-user]# chown -R ec2-user:2000 /var/lib/kubelet/pods/297b75ec-63fa-4061-bb23-7a6a120da939/volumes/kubernetes.io~csi/pvc-c7373468-f247-4596-b2e2-87852aad71bb/mount/partitions/ [root@ip-10-0-36-143 ec2-user]# ls -l /var/lib/kubelet/pods/297b75ec-63fa-4061-bb23-7a6a120da939/volumes/kubernetes.io~csi/pvc-c7373468-f247-4596-b2e2-87852aad71bb/mount/partitions/ total 32 drwxrwsr-x. 4 ec2-user 2000 4096 Jun 19 00:00 20250619 drwxrwsr-x. 4 ec2-user 2000 4096 Jun 20 00:00 20250620 ...
Перезапускаємо Pod atlas-victoriametrics-vmlogs-old-server-0
.
Перевірка даних
І пошукаємо щось.
Спочатку щось про ноду hostname: "ip-10-0-36-143.ec2.internal"
на новому кластері – це має прийти з інстансу atlas-victoriametrics-vmlogs-new-server-0
, тобто зі старого інстансу на новому Kubernetes-кластері:
А тепер якусь ноду зі старого кластера:
Готово.