Перейти к основному содержимому

Подготовка S3 хранилища Monq

Существующее S3 хранилище

Проверить возможность:

  • Записи и чтения в хранилище;
  • Подключения к порту S3 с рабочих нод.

Запомнить параметры подключения, они будут использованы в релизе Monq 9.3:

  • s3.host: "garage.in.monq.local";
  • s3.port: "3900";
  • s3.bucket: "monq";
  • s3.region: "production";
  • s3.users.bucket_user.access_key: "< check ${garage_access_key} >";
  • s3.users.bucket_user.secret_key: "< check ${garage_secret_key} >".

Внимание! Значение вышеуказанных переменных заполнены с учетом текущего примера.

S3 хранилище отсутствует

Предполагается, что monq развернут по документации.

Список переменных, используемых по тексту:

  • ${infra_domain} - dns зона для инфраструктурных компонентов
  • ${registry_address} - адрес репозитория контейнеров в формате адрес:порт без указания протокола
  • ${infra_namespace} - kubernetes namespace для запуска инфраструктурных компонентов

Задаем значения, например:

infra_domain="in.monq.local"
registry_address="registry.in.monq.local:5000"
infra_namespace="infra"

DNS

Существует 4 сценария:

  1. Для demo vm, развернутой из ISO образа необходимо добавить A запись в hosts:

    echo "127.0.0.1 garage.${infra_domain}" >> /etc/hosts
  2. Для инсталляций развернутых с помощью документации и в которых развертывание garage планируется без HA необходимо создать на внешнем DNS сервере запись для хоста garage вида garage.${infra_domain}, запись должна разрешаться в IP сервера на котором будет развернут garage.

  3. Для инсталляций развернутых с помощью документации, в которых развертывание garage планируется без HA и задействован кластерный DNS необходимо создать на кластерном DNS сервере запись для хоста garage вида garage.${infra_domain}, запись должна разрешаться в IP сервера на котором будет развернут garage. Более детально см кластерный dns.

  4. Для инсталляций развернутых с помощью документации где garage будет развернут в HA ничего делать не нужно, подключение к s3 будет выполняться в kubernetes кластере по внутренним доменным именам.

Импорт контейнеров СПО

⚠️ Внимание! Команды выполняются на одном из серверов где был установлен discli.

Выполнить импорт образов контейнеров используемого СПО в container registry:

discli copy dxflrs/garage:v2.3.0 ${registry_address}/dxflrs/garage:v2.3.0

В случае если планируется HA инсталляция, импортировать дополнительные образы:

discli copy busybox:stable ${registry_address}/busybox:stable

Загрузка helm chart

⚠️ Внимание! Команды выполняются на сервере master.

В случае если планируется инсталляция без HA, скачать helm chart:

mkdir -p offline/charts/
helm repo add monq https://helm.monq.ru/charts
helm repo update # Error: chart "garage" matching 1.0.0 not found in monq index. (try 'helm repo update'): no chart name found
helm pull monq/garage --version 1.0.0 -d offline/charts/

В случае если планируется HA инсталляция, скачать helm chart:

mkdir -p offline/charts/
curl -L https://git.deuxfleurs.fr/Deuxfleurs/garage/archive/v2.3.0.tar.gz | \
tar -xzv --wildcards --strip-components=2 -C /tmp '*/script/helm/garage' && \
helm package /tmp/helm/garage -d ./offline/charts/

Garage установка без высокой доступности (no HA)

Создать каталог для хранения данных СУБД

⚠️ Внимание! Команды выполняются на сервере db, согласно таблице размещения компонентов. Для демонстрационной установки, развернутой из iso образа, команда выполняется на этом же сервере.

mkdir -p /storage/garage

⚠️ Внимание! Команды выполняются на сервере master.

Выполнить назначение метки на выбранную ноду:

⚠️ Внимание! Для демонстрационной установки, развернутой из iso образа переменная server_name=monq-demo.

server_name="db"
# server_name="monq-demo"
kubectl label no ${server_name} garage=

Выполнить запуск с помощью helm chart:

helm install garage offline/charts/garage-1.0.0.tgz \
--namespace ${infra_namespace} --create-namespace \
--set application.image.registry=${registry_address}

Получить автоматически сгенерированный ключ доступа и секретный ключ пользователя бакета monq:

Бакет monq будет создан автоматически, дополнительных действий не требуется.

garage_access_key=$(kubectl get secrets -n ${infra_namespace} garage-secret \
-o jsonpath={.data.GARAGE_DEFAULT_ACCESS_KEY} | base64 -d)
garage_secret_key=$(kubectl get secrets -n ${infra_namespace} garage-secret \
-o jsonpath={.data.GARAGE_DEFAULT_SECRET_KEY} | base64 -d)
echo -e "save it\n garage_access_key: ${garage_access_key}\n garage_secret_key: ${garage_secret_key}"

Выполнить проверку:

  1. Состояние запуска контейнера:

    watch kubectl get po -n ${infra_namespace} garage-0
  2. Логи контейнера:

    kubectl logs -n ${infra_namespace} garage-0 -f
  3. Возможность подключения, чтения, записи для бакета monq с помощью клиента s3.

Запомнить параметры подключения, они будут использованы в релизе Monq 9.3:

  • s3.host: "garage.in.monq.local";
  • s3.port: "3900";
  • s3.bucket: "monq";
  • s3.region: "production";
  • s3.users.bucket_user.access_key: "< check ${garage_access_key} >";
  • s3.users.bucket_user.secret_key: "< check ${garage_secret_key} >".

Внимание! Значение вышеуказанных переменных заполнены с учетом текущего примера.

Garage установка в режиме высокой доступности (HA)

Запуск с помощью официального helm chart Garage. Обеспечение высокой доступности.

На нодах, где будет запущен garage создать каталоги для хранения данных:

Внимание! Эта операция выполняется не на сервере controlplane, а на серверах, где будет запущен garage.

mkdir -p /storage/garage/{meta,data}

Создать storage-class и pv, так как csi driver hostPath не поддерживает provisioning:

Внимание! Обратить внимание на привязку pv к ноде, указаны имена серверов из примера.

Внимание! В данном примере создание PV выполняется в цикле, для трех серверов. На каждом сервере создается два PV: для метаданных и для данных.

cat <<EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
host_path_meta="/storage/garage/meta"
host_path_data="/storage/garage/data"
storage_size_data="30Gi"
storage_size_meta="3Gi"
for server_number in {1..3}; do
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: garage-meta-pv-w${server_number}
labels:
service: garage
type: meta
spec:
capacity:
storage: ${storage_size_meta}
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: ${host_path_meta}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- garage-${server_number}
EOF
done
for server_number in {1..3}; do
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: garage-data-pv-w${server_number}
labels:
service: garage
type: data
spec:
capacity:
storage: ${storage_size_data}
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: ${host_path_data}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- garage-${server_number}
EOF
done

Выполнить запуск кластера:

storage_size_data="30Gi"
storage_size_meta="3Gi"

helm install garage offline/charts/garage-0.9.3.tgz \
--namespace garage --create-namespace \
--set image.repository=${registry_address}/dxflrs/garage \
--set image.tag=v2.3.0 \
--set initImage.repository=${registry_address}/busybox \
--set initImage.tag=stable \
--set garage.dbEngine="sqlite" \
--set deployment.replicaCount=3 \
--set garage.replicationFactor=3 \
--set persistence.enabled=true \
--set persistence.meta.size=${storage_size_meta} \
--set persistence.data.size=${storage_size_data} \
--set persistence.meta.storageClass="local-storage" \
--set persistence.data.storageClass="local-storage"

Увеличение кластера выполняется через редактирование helm release, поле deployment.replicaCount;

При таких значениях если одна нода выходит из строя - кластер становиться в режим read-only. При выходе из строя второй ноды - кластер полностью недоступен. Для обеспечения отказоустойчивости одной ноды необходим кластер из четырех нод.

Выполнить проверку:

  1. Состояние запуска контейнеров:
    watch kubectl get po -n garage
  2. Логи контейнеров на предмет ошибок:
    kubectl logs -n garage -l app.kubernetes.io/name=garage

Применить шаблон:

  1. Получить ID нод
    kubectl exec -ti -n garage garage-0 -- /garage status

    node_0_id=$(kubectl exec -ti -n garage -c garage garage-0 -- /garage status | awk '/garage-0/ {print $1}')
    node_1_id=$(kubectl exec -ti -n garage -c garage garage-0 -- /garage status | awk '/garage-1/ {print $1}')
    node_2_id=$(kubectl exec -ti -n garage -c garage garage-0 -- /garage status | awk '/garage-2/ {print $1}')
  2. Назначить шаблон топологии для каждой ноды, указав её id:
    kubectl exec -ti -n garage garage-0 -- /garage layout assign -z dc1 -c 30G ${node_0_id}
    kubectl exec -ti -n garage garage-0 -- /garage layout assign -z dc1 -c 30G ${node_1_id}
    kubectl exec -ti -n garage garage-0 -- /garage layout assign -z dc1 -c 30G ${node_2_id}
  3. Применить шаблон:
    kubectl exec -ti -n garage -c garage garage-0 -- /garage layout apply --version 1

Создать бакет и сформировать ключи для доступа к нему:

  1. Создать bucket:

    kubectl exec -ti -n garage garage-0 -- /garage bucket create monq
  2. Создать ключ доступа, сохранить из вывода Key ID и Secret key, ключ будет сохранен во временный файл:

    kubectl exec -ti -n garage garage-0 -- /garage key create monq-key > /tmp/garage_key

    garage_access_key=$(awk '/Key ID/ {print $3}' < /tmp/garage_key)
    garage_secret_key=$(awk '/Secret key/ {print $3}' < /tmp/garage_key)
    echo -e "save it\n garage_access_key: ${garage_access_key}\n garage_secret_key: ${garage_secret_key}"
  3. Удалить временный файл с ключем:

    rm /tmp/garage_key
  4. Разрешить доступ к bucket:

    kubectl exec -ti -n garage garage-0 -- /garage bucket allow \
    --read --write monq --key monq-key

Дополнительно проверить возможность подключения, чтения, записи для бакета monq с помощью клиента s3.

Запомнить параметры подключения, они будут использованы в релизе Monq 9.3:

  • s3.host: "garage.garage-operator.svc";
  • s3.port: "3900";
  • s3.bucket: "monq";
  • s3.region: "production";
  • s3.users.bucket_user.access_key: "< check ${garage_access_key} >";
  • s3.users.bucket_user.secret_key: "< check ${garage_secret_key} >".

Внимание! Значение вышеуказанных переменных заполнены с учетом текущего примера.


Приложение. Установка пакетов Offline

Подготовка установочного пакета

Внимание! Команды из данного раздела необходимо выполнить на сервере, имеющем доступ в интернет!

Пакеты системного программного обеспечения

Скачать архивы с утилитами:

mkdir -p offline/tools
cd offline/tools

wget https://get.helm.sh/helm-v3.17.4-linux-amd64.tar.gz

wget "https://github.com/shdubna/discli/releases/download\
/v0.2.0/discli_Linux_x86_64.tar.gz"
cd -

Образы контейнеров

Подготовить OS для скачивания образов:

tar -xf offline/tools/discli_Linux_x86_64.tar.gz -C /usr/local/bin/ discli
mkdir -p offline/images

Скачать образы контейнеров используемого СПО:

cd offline/images
discli pull dxflrs/garage:v2.3.0 garage.tar
cd -

В случае если планируется HA инсталляция, скачать дополнительные образы:

cd offline/images
discli pull busybox:stable busybox.tar
cd -

Helm chart

Подготовить OS для скачивания чартов:

tar -xf offline/tools/helm-v3.17.4-linux-amd64.tar.gz linux-amd64/helm
mv linux-amd64/helm /usr/bin/
rm -r linux-amd64/

В случае если планируется инсталляция без HA, скачать helm chart:

mkdir -p offline/charts/
helm repo add monq https://helm.monq.ru/charts
helm pull monq/garage --version 1.0.0 -d offline/charts/

В случае если планируется HA инсталляция, скачать дополнительные helm charts:

mkdir -p offline/charts/
curl -L https://git.deuxfleurs.fr/Deuxfleurs/garage/archive/v2.3.0.tar.gz | \
tar -xzv --wildcards --strip-components=2 -C /tmp '*/script/helm/garage' && \
helm package /tmp/helm/garage -d ./offline/charts/

Сборка итогового архива

tar -zcf offline.tar.gz offline/

Установка из каталога

Перед началом установки необходимо перенести сформированный архив на все сервера и выполнить его распаковку:

tar -xf ./offline.tar.gz
rm ./offline.tar.gz

Установка пакетов

Выполнить установку пакетов:

tar -xf ./offline/tools/discli_Linux_x86_64.tar.gz -C /usr/local/bin/ discli

Импорт контейнеров СПО

Импортировать образы контейнеров используемого СПО:

discli push ./offline/images/garage.tar ${registry_address}/dxflrs/garage:v2.3.0

В случае если планируется HA инсталляция, импортировать дополнительные образы:

discli push ./offline/images/busybox.tar ${registry_address}/busybox:stable

Удалить файлы используемые для установки:

rm -rf offline/{images,tools}