Подготовка 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 сценария:
-
Для demo vm, развернутой из ISO образа необходимо добавить A запись в hosts:
echo "127.0.0.1 garage.${infra_domain}" >> /etc/hosts -
Для инсталляций развернутых с помощью документации и в которых развертывание garage планируется без HA необходимо создать на внешнем DNS сервере запись для хоста garage вида
garage.${infra_domain}, запись должна разрешаться в IP сервера на котором будет развернут garage. -
Для инсталляций развернутых с помощью документации, в которых развертывание garage планируется без HA и задействован кластерный DNS необходимо создать на кластерном DNS сервере запись для хоста garage вида
garage.${infra_domain}, запись должна разрешаться в IP сервера на котором будет развернут garage. Более детально см кластерный dns. -
Для инсталляций развернутых с помощью документации где 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}"
Выполнить проверку:
-
Состояние запуска контейнера:
watch kubectl get po -n ${infra_namespace} garage-0 -
Логи контейнера:
kubectl logs -n ${infra_namespace} garage-0 -f -
Возможность подключения, чтения, записи для бакета 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. При выходе из строя второй ноды - кластер полностью недоступен. Для обеспечения отказоустойчивости одной ноды необходим кластер из четырех нод.
Выполнить проверку:
- Состояние запуска контейнеров:
watch kubectl get po -n garage - Логи контейнеров на предмет ошибок:
kubectl logs -n garage -l app.kubernetes.io/name=garage
Применить шаблон:
- Получить 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}') - Назначить шаблон топологии для каждой ноды, указав её 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} - Применить шаблон:
kubectl exec -ti -n garage -c garage garage-0 -- /garage layout apply --version 1
Создать бакет и сформировать ключи для доступа к нему:
-
Создать bucket:
kubectl exec -ti -n garage garage-0 -- /garage bucket create monq -
Создать ключ доступа, сохранить из вывода
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}" -
Удалить временный файл с ключем:
rm /tmp/garage_key -
Разрешить доступ к 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}