Продукты и сервисы
image
Решения 1С
image
Облачные услуги
image
Лаборатория инноваций CorpLab
Продукты CorpCloud
Все услуги CorpCloud
8 (800) 707-04-12

Наш эксперт Михаил Сергеев подготовил подробный материал (в двух форматах: статья и видеоурок), из которого вы узнаете:

  • Что такое Velero и S3;
  • Как установить необходимое ПО;
  • Как развернуть объектное хранилище на базе Minio;
  • Как установить Velero в кластер Kubernetes;
  • О настройке автоматического бэкапа нашего приложения;
  • Защите бэкапа от удаления злоумышленником.


Что такое Velero и S3

Velero – в переводе испанского означает парусная лодка. Это программный продукт с открытым исходным кодом, предназначенный для безопасного бэкапирования (создания резервной копии данных, обычно в сжатом виде), восстановления после сбоев и миграции ресурсов Kubernetes кластера. Официальный сайт программного продукта https://velero.io/, а также весь исходный код доступен на GitHub.

Minio — это сервер хранения объектов с открытым исходным кодом, совместимый с облачным хранилищем Amazon S3.

Объектное хранилище – это технология хранения и управления данными в неструктурированном формате, называемом объектами.

Для бэкапа сущностей Kubernetes-кластера, Velero использует исключительно объектное хранилище. Можно выбрать абсолютно любое S3 хранилище, но в сегодняшнем уроке мы будем использовать хранилище на базе Minio. Преимуществом Minio стала возможность быстро и просто развернуть её на сервере или виртуальной машине, или Kubernetes-кластере, и хранить бэкапы непосредственно у себя. Можете зайти на официальный сайт https://min.io/ и посмотреть по нему документацию и способы установки.

У нас есть уже готовый тестовый Kubernetes-кластер от компании Corpsoft24. Давайте посмотрим, что оно из себя представляет. Сразу предупредим, что мы будем использовать алиасы команд, что прилично ускоряет работу.

Рис.1 Тестовый кластер с нодами.
Рис.1 Тестовый кластер с нодами.

Рис.1 Тестовый кластер с нодами.

#### Kubernetes алиасы
echo "alias k='kubectl'" >> ~/.bashrc
echo "alias kg='kubectl get'" >> ~/.bashrc
echo "alias kgp='kubectl get po'" >> ~/.bashrc
echo "alias kd='kubectl delete -f'" >> ~/.bashrc
echo "alias ka='kubectl apply -f'" >> ~/.bashrc
echo "alias ke='kubectl exec -it'" >> ~/.bashrc
echo "alias k1='kubectl describe'" >> ~/.bashrc
echo "alias kl='kubectl logs'" >> ~/.bashrc
echo "alias kgs='kubectl get svc -A'" >> ~/.bashrc
echo "alias kr='kubectl rollout restart deployment'" >> ~/.bashrc
echo "alias krs='kubectl rollout restart sts'" >> ~/.bashrc
echo "alias kpa='kubectl get po -A'" >> ~/.bashrc
source ~/.bashrc
 
### Docker алиасы
echo "alias d='docker compose up -d'" >> ~/.bashrc
echo "alias ds='docker compose stop'" >> ~/.bashrc
echo "alias dcd='docker compose down'" >> ~/.bashrc
echo "alias d1='docker compose up'" >> ~/.bashrc
echo "alias dr='docker compose stop && docker compose up -d'" >>
~/.bashrc
echo "alias dl='docker compose logs -f'" >> ~/.bashrc
echo "alias dc='docker compose'" >> ~/.bashrc
echo "alias de='docker exec -it'" >> ~/.bashrc
echo "alias dp='docker system prune'" >> ~/.bashrc
echo "alias dps='docker ps --format=\"table {{.Names}}\t{{.Ports}}
\t{{.Status}}\"'" >> ~/.bashrc
echo "alias dff='docker compose logs -f --tail 100'" >> ~/.bashrc
echo "alias db='docker compose build'" >> ~/.bashrc
source ~/.bashrc
Рис.2 Варианты установки Minio.
Рис.2 Варианты установки Minio.

Рис.2 Варианты установки Minio.

Прежде чем настраивать бэкап Minio на Kubernetes-кластере нам необходимо установить S3 хранилище. Для этого мы заходим на сайт https://min.io/ и выбираем один из вариантов установки. Но тут нет того, что нас интересует, потому что такой способ совершенно не годится для установки сервера. Устанавливать его в нашем Kubernetes-кластере мы не будем, поскольку бэкап должен быть отдельно даже у другого провайдера. Не на другой виртуальной машине или другом кластере, а именно у другого провайдера, возможно, даже в другой стране. Поэтому самый простой способ — это взять простую виртуалку и на ней развернуть с помощью Docker, точнее Docker Compose. Вот на самом сайте про docker-compose ничего не сказано, но в репозитории на GitHub у них есть пример, как его развернуть (https://github.com/minio/minio/blob/master/docs/orchestration/docker-compose/docker-compose.yaml).

Рис.3 Пример разворачивания Docker Compose.
Рис.3 Пример разворачивания Docker Compose.

 Рис.3 Пример разворачивания Docker Compose.

Установим необходимое ПО

Нода (англ. node) – сервер со специальным программным обеспечением, который может быть представлен компьютером или другой вычислительной техникой.

По системным требованиям необходимо развернуть дублирование на 4 нодах (удалённых серверах), которые будут располагаться в разных регионах. Это необходимо для повышения отказоустойчивости. Также в системных требованиях указано, что установка должна производиться на диск с разделом XFS.

Рис.4 Системные требования Minio.
Рис.4 Системные требования Minio.

Рис.4 Системные требования Minio.

XFS диск для S3:

fdisk /dev/sda
partprobe
pvcreate /dev/sda1
vgcreate s3vg /dev/sda1
lvcreate -l 100%FREE -n s3lv s3vg
mkfs.xfs /dev/mapper/s3vg-s3lv
mkdir /s3
chmod 777 /s3
echo "/dev/mapper/s3vg-s3lv /s3 xfs defaults,nofail 0 0" >> /etc/
fstab
mount -a

Также необходимо будет установить caddy-proxy ( https://caddyserver.com/).

# Установка Caddy-proxy
mkdir -p /app/caddy-proxy
cd /app/caddy-proxy
mkdir data
chmod 777 data
docker network create caddy
cat << \EOF > docker-compose.yml
version: "3.7"
services:
caddy:
image: lucaslorentz/caddy-docker-proxy:latest
restart: always
ports:
- 80:80
- 443:443
environment:
- CADDY_INGRESS_NETWORKS=caddy
networks:
- caddy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/data
restart: always
networks:
caddy:
external: true
EOF

В идеале бэкап должен храниться у другого провайдера, даже, возможно в другой стране. Поэтому самый простой способ – взять простую виртуалку и там развернуть необходимое программное обеспечение.

После установки Caddy-proxy установим Minio. Для установки нужно минимум 8 дисков и 4 ноды. Можно это сделать на разных виртуальных машинах, но в данном примере всё сделаем на одной.

Всё ПО мы устанавливаем на отдельной виртуальной машине с другим провайдером, поскольку проблемы у провайдера зачастую влияют на целостность бэкапа.

# Установка Minio
mkdir -p /s3/minio
cd /s3/minio
mkdir data1-1 data1-2 data2-1 data2-2 data3-1 data3-2 data4-1
data4-2
chmod -R 777 data1-1 data1-2 data2-1 data2-2 data3-1 data3-2
data4-1 data4-2
cat << \EOF > docker-compose.yml
version: '3.7'
x-minio-common: &minio-common
 image: quay.io/minio/minio:RELEASE.2022-12-12T19-27-27Z
command: server --console-address ":9001" http://minio{1...4}/
data{1...2}
environment:
MINIO_ROOT_USER: cs24
MINIO_ROOT_PASSWORD: 3nDPUk1GpfrWHn7kw1p9
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/
live"]
interval: 30s
timeout: 20s
retries: 3
labels:
caddy_0.@denied.not: "remote_ip 95.217.236.3 194.126.162.13"
caddy_1.@denied.not: "remote_ip 95.217.236.3 194.126.162.13"
caddy_0.abort: "@denied"
caddy_1.abort: "@denied"
caddy_0: s3adm.194.126.161.151.sslip.io
caddy_1: s3.194.126.161.151.sslip.io
caddy_0.reverse_proxy: "{{upstreams http 9001}}"
caddy_1.reverse_proxy: "{{upstreams http 9000}}"
services:
minio1:
<<: *minio-common
hostname: minio1
volumes:
- ./data1-1:/data1
- ./data1-2:/data2
networks:
- caddy
minio2:
<<: *minio-common
hostname: minio2
volumes:
- ./data2-1:/data1
- ./data2-2:/data2
networks:
- caddy
minio3:
<<: *minio-common
hostname: minio3
volumes:
- ./data3-1:/data1
- ./data3-2:/data2
networks:
- caddy
minio4:
<<: *minio-common
hostname: minio4
volumes:
 - ./data4-1:/data1
- ./data4-2:/data2
networks:
- caddy
networks:
caddy:
external: true
EOF
Access Key: BZFsMymTjWwKuL8g
Secret Key: 0iG0dcYHRIucmMTzsyNzEPLekL8uL9G0
Рис.5 Добавление диска на 150 Гб.
Рис.5 Добавление диска на 150 Гб.

Рис.5 Добавление диска на 150 Гб.
Рис.6 Проверка старта.
Рис.6 Проверка старта.

Рис.6 Проверка старта.

Развернём объектное хранилище на базе Minio

Всё успешно запущено (4 ноды и Caddy). Сначала проверим Caddy-proxy. Когда мы указали там домен и запустили наши контейнеры, то Caddy-proxy сделал запрос в Let’s Encrypt и создал нам сертификаты. Сертификаты он скачивает в паку Data. Сертификатов будет 2: один для API, второй для админки (s3adm). Вместе с сертификатом создаётся и ключ (s3adm.194.126.161.151.sslip.io.key).

Зайдём в админку через браузер и проверим генерацию сертификата от Let’s Encrypt на указанный нами домен. Нужно будет авторизоваться через логин (cs24) и пароль (3nDPUk1GpfrWHn7kw1p9). Авторизация прошла успешно. Изучим интерфейс админки, позволяющий смотреть различные метрики и логи.

Рис.7 Получение сертификата S3.
Рис.7 Получение сертификата S3.

Рис.7 Получение сертификата S3.

Хотим обратить внимание, что с помощью Сaddy мы сделали whitelist (список IP-адресов с которых можно зайти в админку).

Проверяем работу whitelist, сменив через VPN наш IP-адрес. Обновляем страницу и пробуем повторно зайти в админку. В целях безопасности ваших данных рекомендуем максимально ограничить доступ к админке. Например, заходить через VPN только с одного определённого IP-адреса.

Затем в админке создаём Bucket, необходимый для заливки наших бэкапов из кластера Kubernetes с помощью Velero. Под разные задачи можно создавать разные бакеты.

Рис.8 Создание Bucket.
Рис.8 Создание Bucket.

Рис.8 Создание Bucket.

Установим Velero в кластер Kubernetes

Для начала убедимся, что наш сервер имеет доступ к нашему S3 (можно проверить командой Curl). Запрос успешно прошёл. Если сделать запрос с другого сервера, то он не пройдёт.

Теперь займёмся установкой Velero, перейдя на их официальный сайт (https://velero.io). С его помощью мы сможем не только создавать бэкапы Kubernetes-кластера но и перенести их из одного кластера в другой, защитить данные от всевозможных угроз. Если нажать «скачать Velero» то нас перенесёт на GitHub, где описаны различные изменения в каждой версии программы. Давайте скачаем, как нам рекомендует официальный сайт, бинарную версию установщика. Мы уже заранее подготовили скрипт для установки Velero.

Рис.9 Установка Velero.
Рис.9 Установка Velero.

Рис.9 Установка Velero.

# Установка Velero
cd /tmp
wget https://github.com/vmware-tanzu/velero/releases/download/
v1.10.0/velero-v1.10.0-linux-amd64.tar.gz
tar -zxvf velero-v1.10.0-linux-amd64.tar.gz
mv velero-v1.10.0-linux-amd64/velero /usr/local/bin/
mkdir /home/ms/velero -p
cd /home/ms/velero
cat << \EOF > credentials-velero
[default]
aws_access_key_id=BZFsMymTjWwKuL8g
aws_secret_access_key=0iG0dcYHRIucmMTzsyNzEPLekL8uL9G0
EOF
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.5.3 \
--bucket k8s \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--backup-location-config
region=minio,s3ForcePathStyle="true",s3Url=https://
s3.194.126.161.151.sslip.io
sleep 5;
kubectl patch -n velero backupstoragelocation default --type merge
-p '{"spec":{"config":{"publicUrl":"https://
s3.194.126.161.151.sslip.io"}}}'

Настройка автоматического бэкапа нашего приложения

Теперь попробуем забэкапить наш Kubernetes-кластер. Бэкап происходит по специальным меткам, которые устанавливаются вручную.

Рис.10 Успешное создание бэкапа.
Рис.10 Успешное создание бэкапа.

Рис.10 Успешное создание бэкапа.

После создания бэкапа проверяем отчёт, все ли данные были в него включены. Затем переходим в нашу админку S3, нажимаем обновить. Увидим 9 объектов объёмом 55 Кб. Далее проверяем, где находятся резервные данные. Системой была создана папка backups (полный путь k8s/backups/prodapp), где в сжатом виде содержатся сами бэкапы.

Затем проверяем работоспособность получившейся системы. Для этого имитируем сбой, удалив часть файлов, после чего нас уже не пускает в приложение.

Для восстановления зададим команду velero restore, затем добавляем creat. После ввода velero restore будет выдана подсказка с вариантами дальнейших действий. Затем добавляем из бэкапа (--from-backup) и название нашего бэкапа (prodapp).

Полная команда будет выглядеть как: «velero restore creat --from-backup prodapp».

Запустится восстановление данных, останется только его дождаться. Время восстановления зависит от используемого оборудования, включая ширину интернет-канала и объёма восстанавливаемых данных.

Для проверки восстановления данных из бэкапа запустим браузер и обновим страницу. Приложение успешно восстановилось в том же кластере. Кстати, возможно удалить приложение в одном, а восстановить в другом кластере, тем самым сделав быстрый переезд на другой кластер.

Мы сделали разовый бэкап, но есть возможность сделать резервное копирование постоянным, автоматизировав его. Задав команду: «velero schedule creat prodapp daily –schedule=”0 2 ***” –selector app=production» чтобы понимать, что это дневное задание.

На случай взлома сервера и удаления бэкапов, можно включить в админке защиту от удаления.

Связаться с нами
Проконсуль­тируем и поможем с выбором услуг
Заявка успешно отправлена
Наш менеджер свяжется с вами в ближайшее время
Связаться с нами
Проконсуль­тируем и поможем с выбором услуг
Заявка успешно отправлена
Наш менеджер свяжется с вами в ближайшее время