В этом гайде мы рассмотрим 2 способа как легко перенести данные в Persistent Volume из одного Kubernetes кластера в другой без сложных манипуляций и промежуточных скачиваний с помощью Tuna туннелей. Гайд подойдет для любых типов данных, это может быть Wordpress приложение или каталог с картинками, бэкапами, в общем что угодно.

Копирование через HTTP по pull модели
Этот способ больше подходит если у вас не очень много больших файлов. Для примера я создал вот такое простое приложение.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: tuna-example-from
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tuna-example-from
spec:
replicas: 1
selector:
matchLabels:
app: tuna-example-from
template:
metadata:
labels:
app: tuna-example-from
spec:
containers:
- name: buildpack-from
image: buildpack-deps:latest
command: ["sleep"]
args: ["infinity"]
volumeMounts:
- name: data-volume
mountPath: /data
- name: tuna-example-from
image: yuccastream/tuna:latest
command: ["tuna"]
args: ["http", "-f", "/data"]
env:
- name: TUNA_TOKEN
value: "tt_***"
volumeMounts:
- name: data-volume
mountPath: /data
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: tuna-example-from
Как видно идея в том, что мы добавляем sidecar контейнер с tuna и монтируем в него тот же каталог, а затем запускаем файл сервер. После запуска в логах контейнера tuna-example-from вы увидите ссылку на скачивание, а также её можно посмотреть в личном кабинете.
INFO[07:36:54] Welcome to Tuna
INFO[07:36:54] Forwarding https://6llv70-tuna-dev.ru.tuna.am -> fs:///data

В кластере назначения разворачиваем аналогичное приложение и если в образе есть curl илиwget — то просто скачиваем файлики, если нет — то аналогично подключаем sidecar контейнер с тем-же buildpack-deps.
Копирование через SSH по push модели
Второй способ более гибкий, так как можно передавать большое количество файлов с помощью scp или rsync или в целом получить ssh доступ. Тут подключаем sidecar контейнер с tuna и монтируем в него тот же каталог но уже в кластере назначения.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: tuna-example-to
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tuna-example-to
spec:
replicas: 1
selector:
matchLabels:
app: tuna-example-to
template:
metadata:
labels:
app: tuna-example-to
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: data-volume
mountPath: /data
- name: tuna-example-to
image: yuccastream/tuna:latest
command: ["tuna"]
args: ["ssh"]
env:
- name: TUNA_TOKEN
value: "tt_***"
volumeMounts:
- name: data-volume
mountPath: /data
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: tuna-example-to
После запуска в логах контейнера tuna-example-to вы увидите хост, порт и пароль (если вы не доверяете паролям, можно подключаться по ключу) для подключения по ssh.
INFO[07:58:51] Welcome to Tuna
INFO[07:58:52] Connection instruction:
INFO[07:58:52] 1. echo "[ru.tuna.am]:22728 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILBqySWPWwNp391U7WxnrJ0usiUsUA3mSRCsmEhWp4xU" >> ~/.ssh/known_hosts
INFO[07:58:52] 2. ssh -p 22728 ru.tuna.am
INFO[07:58:52] 3. ru.tuna.am's password: xxtwku6flilpy13d
INFO[07:58:52] Available for connection via keys for me and my team
INFO[07:58:52] Waiting for client connections...
В исходном кластере или вообще где угодно, где есть ssh-client запускаем копирование.
$ scp -P 22728 *.jpg ru.tuna.am:/data
Warning: Permanently added '[ru.tuna.am]:22728' (ED25519) to the list of known hosts.
ahmed-cTPBm3vP5Xk-unsplash.jpg 100% 2893KB 5.4MB/s 00:00
daniel-gomez-FCVMPabu16w-unsplash.jpg 100% 440KB 2.2MB/s 00:00
david-clode-4RwSPLee_h4-unsplash.jpg 100% 1954KB 9.3MB/s 00:00
francesco-ungaro-My9N8KrYGuI-unsplash.jpg 100% 1565KB 7.7MB/s 00:00
ingmar-Mk3AqH8hqGQ-unsplash.jpg 100% 7895KB 15.1MB/s 00:00
octavian-rosca-e3OSaoc7EuE-unsplash.jpg 100% 382KB 2.1MB/s 00:00
pascal-debrunner-mhVlYssLoWE-unsplash.jpg 100% 4222KB 10.9MB/s 00:00
В логах tuna-example-to вы увидите это подключение.
INFO[08:00:27] Handling sFTP session user=jidckii
INFO[08:00:32] sFTP session closed user=jidckii
Очевидно наличие встроенного SSH сервера не ограничивает вас просто передачей файлов, можно подключиться, что-то поправить, переименовать или даже запустить скрипт.
Заключение
Справедливо заметить это лишь 1 кейс где Tuna может помочь вам в разработке или эксплуатации. Вы также можете:
Публиковать приложения без Ingress также просто с помощью sidecar контейнера.
Опубликовать доступ к TCP приложениям, например базы данных без создания LB, особенно актуально если ваш кластер не в облаке, а на Bare Metal.
Опубликовать в Kubernetes по scp какие то классические/легаси приложения, например тот же Wordpress.
И это лишь краткий список кейсов, которые можно придумать.
На этом у меня всё, спасибо что дочитали до конца ?
Тут я хочу напомнить, что Tuna — это платформа для разработчиков и их команд, нацеленная на ускорение разработки, упрощение командного взаимодействия и безопасность.
Контакты
Если возникли вопросы, можете задать их нам по почте info@tuna.am, тут в коментариях или нашем чате в telegram.
zradeg
sidecar же...
jidckii Автор
Спасибо, поправил.