Установка сервисов People Hub¶
-
Для того, чтобы развернуть сервисы входящие в состав продукта VK People Hub в кластере Kubernetes, мы рекомендуем использовать наш универсальный helm chart:
- Добавьте helm repository (репозиторий доступен только для авторизованных пользователей)
helm repo add \ peoplehub https://chart.people-hub.ru \ --username=<имя_пользователя> \ --password=<пароль_пользователя>
- Обновите репозитории helm
helm repo update
- Подготовьте файл значений для развертывания сервиса.
-
Установите сервис указав путь к файлу значений.
1. Образы контейнеров (container images) можно загрузить из нашего container registry (docker.people-hub.ru). Тэг образа соответствует номеру релиза. Например, релизу 3.60.1 соответствует тэг release-peoplehub-v3-60-1.helm install <release_name> --values=<values_file> peoplehub/universal-chart
Для составления полного списка образов, можно использовать наш скрипт. -
Скрипт для составления списка образов
В качестве аргументов необходимо передать номер релиза (например, 3.60.1).
Например:
Скрипт выведет список образов для всех компонентов. Для работы скрипта потребуются утилиты curl и jq./get_release_images.sh 3.39.2
get_release_images.sh
#!/bin/bash set -e # Check if necessary tools are installed function check_tools { if ! command -v curl >/dev/null 2>&1 then echo "curl not found" return 1 fi if ! command -v jq >/dev/null 2>&1 then echo "jq not found" return 1 fi } # Calculate lower version function lower_version { local MAJOR=$(echo $1 | cut -d $2 -f 1) local MINOR=$(echo $1 | cut -d $2 -f 2) local PATCH=$(echo $1 | cut -d $2 -f 3) if [ $PATCH -gt 1 ]; then local PATCH=$(($PATCH - 1)) # Uncomment to downscale to minor and/or major release # elif [ $PATCH -le 1 ] && [ $MINOR -gt 1 ]; then # local MINOR=$(($MINOR - 1)) # elif [ $PATCH -le 1 ] && [ $MINOR -le 1 ] && [ $MAJOR -gt 1 ]; then # local MAJOR=$(($MAJOR - 1)) fi if [ -n "$3" ] then echo "$MAJOR$3$MINOR$3$PATCH" else echo "$MAJOR$2$MINOR$2$PATCH" fi } # Check if current version is lowest function is_lowest { local PATCH=$(echo $1 | cut -d $2 -f 3) if [ $PATCH -lt 2 ] then return 0 else return 1 fi } # Get images list function get_images { local SEARCH="" local USER_INPUT=$1 local RELEASE_TAG=$2 SEARCH=$(curl --silent -u $DOCKER_REPO_USER:$DOCKER_REPO_PASSWORD -X GET https://$DOCKER_REPO/v2/_catalog | jq -r '.repositories[] | select( . | match("^ph\/.*") )'| xargs -I REPO curl --silent -u $DOCKER_REPO_USER:$DOCKER_REPO_PASSWORD -X GET https://$DOCKER_REPO/v2/REPO/tags/list | jq -r '{name: .name, tag: (.tags[] | select( . == "'$RELEASE_TAG'"))}| "'$DOCKER_REPO'/\(.name):\(.tag)"') echo $SEARCH } if ! check_tools -eq 0 then exit 1 fi USER_INPUT=$1 DOCKER_REPO="docker.people-hub.ru" echo "Sign in to the container registry" read -p 'Username: ' DOCKER_REPO_USER read -p 'Password: ' DOCKER_REPO_PASSWORD CURRENT_RELEASE=$(get_images $1 $(printf "release-peoplehub-v%s" $(echo $USER_INPUT| sed 's/\./\-/g' ))) until is_lowest $USER_INPUT '.' -eq 0 do USER_INPUT=$(lower_version $USER_INPUT '.') CURRENT_RELEASE=$CURRENT_RELEASE"\n"$(get_images $USER_INPUT $(printf "release-peoplehub-v%s" $(echo $USER_INPUT| sed 's/\./\-/g' ))) done echo -e $CURRENT_RELEASE | sort -u
- Добавьте helm repository (репозиторий доступен только для авторизованных пользователей)
-
Вы можете автоматизировать процесс развертывания сервисов с предварительно подготовленными значениями или выполнить развертывание вручную для каждого из сервисов.
- Список сервисов:
- asyncblogs
- calendar
- cms-backend
- comments
- dictionaries
- discovery
- events
- filestorage
- frontend
- gamification
- groups
- meetings
- news
- notifications
- pages
- polls
- profile
- reports
- roles
- settings
- tasks
- termsof-use-service
- websockets-notifications
- Список сервисов:
-
Так же для доступа к файлам необходимо проксирование медиа запросов (пример ingress) и public доступ к файлам в объектном хранилище. Ingress можно создать в сервисе minio или в сервисе frontend.
ingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: frontend-minio annotations: nginx.ingress.kubernetes.io/configuration-snippet: | default_type text/html; if ($request_uri ~ ".html") { add_header Content-Type text/html; } proxy_cache_lock on; proxy_cache_lock_timeout 30s; proxy_set_header Authorization ""; nginx.ingress.kubernetes.io/proxy-body-size: 2000m nginx.ingress.kubernetes.io/proxy-connect-timeout: 300s nginx.ingress.kubernetes.io/rewrite-target: /media/$1 nginx.ingress.kubernetes.io/upstream-vhost: filestorage-bucket-2134.hb.bizmrg.com spec: ingressClassName: nginx tls: - hosts: - people-hub.ru secretName: people-hub.ru rules: - host: people-hub.ru http: paths: - path: /media/(.*) pathType: ImplementationSpecific backend: service: name: s3-media port: number: 80 - path: /media-fs/(.*) pathType: ImplementationSpecific backend: service: name: s3 port: number: 80
-
Выполнить команды
-
После первого развертывания
-
Для всех сервисов, основанных на фреймворке Django необходимо создать суперпользователя для административной панели. Для этого в shell каждого контейнера выполняем команду python manage.py createsuperuser
Сервис Команда DICTIONARY python manage.py createsuperuser DISCOVERY ---- FILESTORAGE python manage.py createsuperuser NOTIFICATOR python manage.py createsuperuser PAGES python manage.py createsuperuser PROFILE python manage.py createsuperuser ROLES python create_admin_panel_user.py SETTINGS python create_admin_panel_user.py WEBSOCKET ---- ASYNC-BLOGS ---- BLOGS python manage.py createsuperuser CALENDAR python manage.py createsuperuser CMS python create_admin_panel_user.py COMMENTS python create_admin_panel_user.py EVENTS python manage.py createsuperuser GAMIFICATIONS python manage.py createsuperuser GROUPS python manage.py createsuperuser MEETINGS python manage.py createsuperuser NEWS ---- POLLS python manage.py createsuperuser REPORTS ---- TASKS python manage.py createsuperuser TERMSOFUSE python manage.py createsuperuser python manage.py createsuperuser
-
Для всех async сервисов необходимо создать суперпользователя для административной панели. Для этого в shell каждого контейнера выполняем команду
python create_admin_panel_user.py
- Для сервиса dictionaries, необходимо заполнить справочники. Для этого в shell контейнера dictionaries-app выполняем команду (токен можно взять из браузера, после авторизации на портале, воспользовавшись инструментами разработчика).
curl --location --request POST '{{host}}/api/discovery/init_dictionaries/' \ --header 'Authorization: Bearer eyJhbGciOiJ...SUzI1NiIsInR5c'
- Для сервиса groups, необходимо загрузить файлы для оргструктуры. Для этого в shell контейнера dictionaries-app выполняем команду (токен можно взять из браузера, после авторизации на портале, воспользовавшись инструментами разработчика).
curl --location --request POST '{{host}}/api/discovery/internal/upload_files/' \ --header 'Authorization: Bearer eyJhbGciOiJ...SUzI1NiIsInR5c'
- Для сервиса gamification нужно создать/cинхронизировать благодарности и награды. Разместите в s3 иконки стандартных благодарностей и наград, скачав их по ссылке https://raw.people-hub.ru/init/gamification.zip. Директория gamification из архива должна расположиться по пути имя_объектного_хранилища/media/. Далее в shell контейнера выполняем команды
python manage.py sync_thanks python manage.py sync_badges
- Для наполнения сервиса pages нужно в консоли выполнить команду
python manage.py create_default_data
- После обновления
- Данные по командам инициализации будут указаны в описаниях релизов.
1. Подготовка сервиса Airflow.
- Разместить полученный файл dags.tar.gz в s3 хранилище с публичным доступом по адресу MINIOENDPOINT/MINIO_ENDPOINT/MINIOENDPOINT/MINIO_BUCKET/init/dags.tar.gz
- Установить helm chart с рекомендуемыми values (при обновлении необходимо перегрузить pods airflow-scheduler и airflow-worker) 1. Для безопасности во всех сервисах необходимо закрыть внешний доступ к внутренним API через прокси сервер API_BASE_URL/internal (blogs/internal) и панель администратора django API_BASE_URL/admin (пример ingress)
-
ingress.yaml
kind: Ingress apiVersion: networking.k8s.io/v1 metadata: name: ph-blocks annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /$1 nginx.ingress.kubernetes.io/server-snippet: | location ~* "^/api/.*/admin/" { deny all; return 403; } location ~* "^/.*/admin/" { deny all; return 403; } location ~* "^/api/.*/internal" { deny all; return 403; } location ~* "^/.*/internal" { deny all; return 403; } nginx.ingress.kubernetes.io/ssl-redirect: 'false' spec: tls: - hosts: - people-hub.ru secretName: people-hub.ru rules: - host: people-hub.ru http: paths: - path: /api/(.*)/admin pathType: Prefix backend: service: name: deny port: number: 80
-
-
Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz
-
Установка выполнена успешно.
Дополнительные команды для минорного релиза 3.61.1¶
Необходимо выполнить команды после выполнения всех вышеуказанных шагов:
Сервис filestorage
python manage.py create_shared_folder
Сервис polls
python manage.py load_profile_user_data
Сервис CMS
python -m commands.create_super_section
Дополнительные команды для минорного релиза 3.61.3¶
Сервис async-blogs
python -m management.load_profile_user_data
Сервис filestorage
python manage.py create_shared_folder
Сервис polls
python manage.py load_profile_user_data
Дополнительные команды для минорного релиза 3.61.4¶
Сервис groups
python manage.py load_profile_user_data
Сервис events
python manage.py create_calendar_events