Skip to main content
Print

Документация по скрипту init.sh для инфраструктуры Appliner Platform

Структура файлов

infra-appliner/
├── charts/
│   └── appliner-new-platform-chart/
│       └── infra/
│           ├── init.sh                                    # Основной скрипт инициализации
│           ├── cluster.yml                                # Конфигурация RKE кластера
│           ├── argo-cd/
│           │   ├── values.yaml                           # Конфигурация Argo CD
│           │   ├── argocd-rbac-cm.yaml                  # RBAC для Argo CD
│           │   └── ingres.yml                           # Ingress для Argo CD
│           ├── cert-manager/
│           │   └── cluster-issuer.yaml                  # ClusterIssuer для сертификатов
│           ├── minio/
│           │   └── values.yaml                          # Конфигурация MinIO
│           ├── postgres-operator/
│           │   └── values.yaml                          # Конфигурация PostgreSQL Operator
│           ├── postgres-operator-ui/
│           │   └── values.yaml                          # Конфигурация PostgreSQL Operator UI
│           ├── postgres-operator-cluster/
│           │   ├── postgres.yaml                        # Манифест кластера PostgreSQL
│           │   ├── postgres-nodeport.yaml              # NodePort сервис для PostgreSQL
│           │   ├── postgres-operator-configmap.yaml   # ConfigMap для PostgreSQL Operator
│           │   ├── init-postgres.sh                    # Скрипт инициализации PostgreSQL кластера
│           │   ├── psql_init.sh                        # Интерактивный скрипт подключения к PostgreSQL
│           │   └── pg_hba.sh                           # Скрипт настройки pg_hba.conf
│           ├── pgbouncer/
│           │   └── values.yaml                         # Конфигурация PgBouncer
│           ├── kafka/
│           │   ├── cluster.yaml                        # Конфигурация Kafka кластера
│           │   └── users-and-topics.yaml              # Пользователи и топики Kafka
│           ├── rancher/
│           │   └── values.yaml                         # Конфигурация Rancher
│           └── storageclass/
│               └── local-path-storage.yaml             # Storage Class конфигурация

 

Предварительные требования

 

Необходимые инструменты

# Проверьте установку необходимых инструментов
kubectl --version          # Минимум v1.24+
helm --version             # Минимум v3.8+
rke --version              # Для создания кластера

Системные требования

  • CPU: Минимум 4 ядра на узел
  • RAM: Минимум 8GB на узел
  • Storage: Минимум 100GB свободного места
  • OS: Ubuntu 20.04+ или CentOS 8+
  • Network: Стабильное интернет-соединение для загрузки образов

Доступ к репозиториям

# Убедитесь, что у вас есть доступ к Nexus репозиторию
curl -u username:password https://nexus.appliner.dev/repository/private-helm/

# Проверьте доступ к Docker registry
docker login private.nexus.appliner.dev

 

Что делает скрипт

  1. Подготовка кластера
    • Опционально: Запускает rke up cluster.yml для создания/обновления кластера
    • Объединяет файлы конфигурации kube_config_* в ~/.kube/config
    • Заменяет плейсхолдеры {root_domain} на актуальный домен
  2. Установка базовых компонентов
    • Storage Class: Устанавливает local-path storage class
    • cert-manager: Устанавливает менеджер сертификатов
    • Argo CD: Устанавливает GitOps платформу для управления развертываниями
    • MinIO: Устанавливает объектное хранилище
    • PostgreSQL Operator: Устанавливает оператор PostgreSQL
    • PostgreSQL Operator UI: Устанавливает веб-интерфейс для управления PostgreSQL
    • PgBouncer: Устанавливает пул соединений для PostgreSQL
    • Kafka: Устанавливает Strimzi Kafka Operator и кластер Kafka
    • Rancher: Устанавливает веб-интерфейс для управления кластером
  3. Настройка PostgreSQL
    • Создает кластер PostgreSQL с отключенным SSL
    • Настраивает pg_hba.conf для разрешения подключений без SSL
    • Создает пользователей и базы данных для различных сервисов
    • Настраивает PgBouncer с динамически сгенерированными паролями

 

Компоненты инициализации

 

Скрипты инициализации

1. init.sh – Основной скрипт инициализации

Расположение: charts/appliner-new-platform-chart/infra/init.sh Назначение: Главный скрипт для полной настройки инфраструктуры Функции:

  • Создание/обновление кластера RKE
  • Установка всех компонентов инфраструктуры
  • Настройка PostgreSQL и создание пользователей
  • Установка Argo CD и других сервисов

2. init-postgres.sh – Инициализация PostgreSQL кластера

Расположение: charts/appliner-new-platform-chart/infra/postgres-operator-cluster/init-postgres.sh Назначение: Подготовка PostgreSQL кластера к работе Функции:

  • Ожидание готовности кластера PostgreSQL
  • Тестирование подключения к базе данных
  • Автоматический запуск pg_hba.sh при необходимости
  • Подтверждение готовности PostgreSQL

3. psql_init.sh – Интерактивное подключение к PostgreSQL

Расположение: charts/appliner-new-platform-chart/infra/postgres-operator-cluster/psql_init.sh Назначение: Интерактивное подключение к PostgreSQL для выполнения SQL команд Функции:

  • Автоматическое определение IP узла и порта
  • Декодирование учетных данных из Kubernetes secrets
  • Установка подключения через psql
  • Интерактивный режим работы

4. pg_hba.sh – Настройка аутентификации PostgreSQL

Расположение: charts/appliner-new-platform-chart/infra/postgres-operator-cluster/pg_hba.sh Назначение: Настройка файла pg_hba.conf для разрешения подключений Функции:

  • Очистка существующих правил аутентификации
  • Добавление правила trust для всех подключений
  • Перезагрузка PostgreSQL через Patroni
  • Проверка примененных настроек

 

Конфигурационные файлы инициализации

1. postgres.yaml – Манифест кластера PostgreSQL

Расположение: charts/appliner-new-platform-chart/infra/postgres-operator-cluster/postgres.yaml Назначение: Определение кластера PostgreSQL Содержит:

  • Конфигурацию кластера (3 инстанса)
  • Настройки ресурсов (CPU, RAM)
  • Отключение SSL
  • Настройки хранилища

2. postgres-nodeport.yaml – NodePort сервис для PostgreSQL

Расположение: charts/appliner-new-platform-chart/infra/postgres-operator-cluster/postgres-nodeport.yaml Назначение: Внешний доступ к PostgreSQL через NodePort Содержит:

  • NodePort сервис для master узла
  • Селекторы для правильного подключения
  • Настройки портов

3. postgres-operator-configmap.yaml – ConfigMap для PostgreSQL Operator

Расположение: charts/appliner-new-platform-chart/infra/postgres-operator-cluster/postgres-operator-configmap.yaml Назначение: Настройки pg_hba для PostgreSQL Operator Содержит:

  • Правила аутентификации (trust для всех подключений)
  • Настройки для IPv4 и IPv6

4. cluster.yaml – Конфигурация Kafka кластера

Расположение: charts/appliner-new-platform-chart/infra/kafka/cluster.yaml Назначение: Определение кластера Kafka с Strimzi Содержит:

  • Kafka версия 3.9.0
  • 3 реплики Kafka
  • 3 реплики Zookeeper
  • Внутренний listener (plain) на порту 9092
  • Внешний listener (nodeport) на порту 9094
  • SCRAM-SHA-512 аутентификация
  • Simple авторизация
  • Ephemeral хранилище

5. users-and-topics.yaml – Пользователи и топики Kafka

Расположение: charts/appliner-new-platform-chart/infra/kafka/users-and-topics.yaml Назначение: Создание пользователей и топиков Kafka Содержит:

  • Топики для Camunda и пользователей
  • Пользователи с SCRAM-SHA-512 аутентификацией
  • ACL права доступа для пользователей
  • Настройки репликации и партиций

Порядок выполнения инициализации

  1. Запуск основного скрипта: bash init.sh
  2. Создание кластера PostgreSQL: Применение postgres.yaml
  3. Инициализация кластера: bash init-postgres.sh
  4. Настройка доступа: Применение postgres-nodeport.yaml
  5. Настройка аутентификации: bash pg_hba.sh
  6. Создание пользователей: Ручное выполнение или через psql_init.sh
  7. Настройка PgBouncer: Установка с динамическими паролями
  8. Создание Kafka кластера: Применение cluster.yaml
  9. Создание пользователей и топиков Kafka: Применение users-and-topics.yaml

Ручное выполнение шагов (без скрипта)

Предварительные требования

# Убедитесь, что установлены необходимые инструменты
kubectl --version
helm --version
rke --version  # если используете RKE

Шаг 1: Создание кластера (если необходимо)

# Запустите RKE для создания кластера
rke up --config cluster.yml

# Объедините конфигурацию в ~/.kube/config
KUBECONFIG=~/.kube/config:kube_config_cluster.yml kubectl config view --flatten > ~/.kube/config.tmp
mv ~/.kube/config.tmp ~/.kube/config
kubectl config use-context rke-cluster

Шаг 2: Замена доменных имен

# Найдите все файлы с плейсхолдерами {root_domain}
find . -type f -exec grep -l '{root_domain}' {} ;

# Замените плейсхолдеры на актуальный домен
export ROOT_DOMAIN="ift.internal"
find . -type f -exec sed -i 's/{root_domain}/'$ROOT_DOMAIN'/g' {} ;

Шаг 3: Установка Storage Class

kubectl apply -f storageclass/local-path-storage.yaml

Шаг 4: Установка cert-manager

# Создайте namespace
kubectl create namespace cert-manager

# Добавьте репозиторий Helm
helm repo add jetstack https://charts.jetstack.io
helm repo update

# Установите cert-manager
helm upgrade --install cert-manager jetstack/cert-manager 
  --namespace cert-manager 
  --set installCRDs=true 
  --wait --timeout 15m0s

# Примените ClusterIssuer (если есть)
kubectl apply -f cert-manager/cluster-issuer.yaml

Шаг 5: Установка Argo CD

# Создайте namespace
kubectl create namespace argocd

# Добавьте репозиторий Helm
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update

# Установите Argo CD
helm upgrade --install argocd argo/argo-cd 
  --namespace argocd 
  --version 7.3.11 
  -f argo-cd/values.yaml 
  --set namespaceOverride=argocd 
  --set installCRDs=true 
  --wait --timeout 15m0s

Шаг 6: Установка MinIO

# Создайте namespace
kubectl create namespace minio

# Добавьте репозиторий Helm
helm repo add minio https://charts.min.io/
helm repo update

# Установите MinIO
helm upgrade --install minio minio/minio 
  --namespace minio 
  --version 5.2.0 
  -f minio/values.yaml 
  --wait --timeout 15m0s

Шаг 7: Установка PostgreSQL Operator

# Создайте namespace
kubectl create namespace psql

# Добавьте репозиторий Helm
helm repo add postgres-operator-charts https://opensource.zalando.com/postgres-operator/charts/postgres-operator/
helm repo update

# Установите PostgreSQL Operator
helm upgrade --install postgres-operator postgres-operator-charts/postgres-operator 
  --namespace psql 
  --version 1.12.2 
  -f postgres-operator/values.yaml 
  --wait --timeout 15m0s

Шаг 8: Установка PostgreSQL Operator UI

# Добавьте репозиторий Helm
helm repo add postgres-operator-ui https://opensource.zalando.com/postgres-operator/charts/postgres-operator-ui
helm repo update

# Установите PostgreSQL Operator UI
helm upgrade --install postgres-operator-ui postgres-operator-ui/postgres-operator-ui 
  --namespace psql 
  --version 1.14.0 
  -f postgres-operator-ui/values.yaml 
  --wait --timeout 15m0s

Шаг 9: Создание кластера PostgreSQL

# Создайте манифест кластера PostgreSQL
cat > postgres-operator-cluster/postgres.yaml <<EOF
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
  name: postgres
  namespace: psql
  labels:
    team: acid
spec:
  teamId: acid
  numberOfInstances: 3
  volume:
    size: 50Gi
    storageClass: local-path
  postgresql:
    version: "16"
    parameters:
      ssl: "off"
  resources:
    requests:
      cpu: 100m
      memory: 100Mi
    limits:
      cpu: 4000m
      memory: 8000Mi
EOF

# Примените манифест
kubectl apply -f postgres-operator-cluster/postgres.yaml

# Дождитесь готовности кластера
kubectl wait --for=condition=Ready pod -l application=spilo -n psql --timeout=300s

Шаг 9.1: Инициализация PostgreSQL кластера

# Запустите скрипт инициализации PostgreSQL
bash postgres-operator-cluster/init-postgres.sh

Что делает скрипт init-postgres.sh:

  • Ожидает, пока кластер PostgreSQL перейдет в состояние “Running”
  • Проверяет готовность всех подов PostgreSQL
  • Тестирует подключение к базе данных
  • Автоматически запускает pg_hba.sh при необходимости
  • Подтверждает, что PostgreSQL готов к работе

Шаг 9.2: Настройка NodePort сервиса для PostgreSQL

# Примените NodePort сервис для внешнего доступа
kubectl apply -f postgres-operator-cluster/postgres-nodeport.yaml

Файл postgres-nodeport.yaml:

apiVersion: v1
kind: Service
metadata:
  name: postgres-master-nodeport
  namespace: psql
spec:
  type: NodePort
  selector:
    application: spilo
    cluster-name: postgres
    spilo-role: master
  ports:
    - name: postgres
      port: 5432
      targetPort: 5432

Шаг 9.3: Настройка ConfigMap для PostgreSQL Operator

# Примените ConfigMap с настройками pg_hba
kubectl apply -f postgres-operator-cluster/postgres-operator-configmap.yaml

Файл postgres-operator-configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-operator
  namespace: psql
data:
  pg_hba_hints: |
    host all all 0.0.0.0/0 trust
    host all all ::/0 trust

Шаг 10: Настройка pg_hba.conf

# Найдите master pod
MASTER_POD=$(kubectl get pods -n psql -l "application=spilo,spilo-role=master" -o jsonpath="{.items[0].metadata.name}")

# Очистите pg_hba.conf и добавьте правило trust
kubectl exec -n psql "$MASTER_POD" -- bash -c '
  sed -i "/^host/d;/^hostssl/d;/^hostnossl/d" /home/postgres/pgdata/pgroot/data/pg_hba.conf &&
  echo "host all all 0.0.0.0/0 trust" >> /home/postgres/pgdata/pgroot/data/pg_hba.conf
'

# Перезагрузите PostgreSQL
kubectl exec -n psql "$MASTER_POD" -- bash -c "yes | patronictl reload postgres"

Шаг 11: Создание пользователей и баз данных

Вариант 1: Ручное создание

# Получите данные для подключения
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
PORT=$(kubectl get svc postgres-master-nodeport -n psql -o jsonpath="{.spec.ports[0].nodePort}")

# Получите учетные данные
ENCODED_USER=$(kubectl get secret postgres.postgres.credentials.postgresql.acid.zalan.do -n psql -o jsonpath="{.data.username}")
ENCODED_PASS=$(kubectl get secret postgres.postgres.credentials.postgresql.acid.zalan.do -n psql -o jsonpath="{.data.password}")
USERNAME=$(echo "$ENCODED_USER" | base64 -d)
PASSWORD=$(echo "$ENCODED_PASS" | base64 -d)

# Создайте пользователей и базы данных
export PGPASSWORD="$PASSWORD"

# Фиксированные пароли для пользователей
declare -A FIXED_PASSWORDS=(
  ["keycloak"]="MPxzyOJY6bbO79VwUZbb7lEvEsnyvwXEnHBkEX5JL8BtDahjz1JP4Vu5m2PQO0Vz"
  ["camunda"]="I5lZjQSk9nZt0EE4xsEk6zLry88O9eV5Yzo7z73iSNknxdeSeL0oY2SS4NbuEgY4"
  ["platform"]="NkfNFmiITT7CY0DQ0FfrgxdMHq7c0UJ0nJXtqMfURjn3jLB4oqK1dvHw3u2FdiiR"
  ["appliner"]="NkfNFmiITT7CY0DQ0FfrgxdMHq7c0UJ0nJXtqMfURjn3jLB4oqK1dvHw3u2FdiiR"
)

# Создайте пользователей и базы данных
for user in keycloak camunda platform; do
  db_user="${user}_ift"
  db_pass="${FIXED_PASSWORDS[$user]}"
  
  psql -h "$NODE_IP" -p "$PORT" -U "$USERNAME" -c "CREATE ROLE $db_user WITH LOGIN SUPERUSER CREATEROLE CREATEDB PASSWORD '$db_pass';"
  psql -h "$NODE_IP" -p "$PORT" -U "$USERNAME" -c "CREATE DATABASE $db_user OWNER $db_user;"
done

 Вариант 2: Использование скрипта psql_init.sh

# Запустите интерактивный скрипт подключения к PostgreSQL
bash postgres-operator-cluster/psql_init.sh

Что делает скрипт psql_init.sh:

  • Автоматически находит IP узла и порт NodePort
  • Декодирует учетные данные из Kubernetes secrets
  • Устанавливает подключение к PostgreSQL через psql
  • Позволяет выполнять SQL команды интерактивно

Содержимое psql_init.sh:

#!/bin/bash
set -e

NAMESPACE="psql"
SECRET_NAME="postgres.postgres.credentials.postgresql.acid.zalan.do"
SERVICE_NAME="postgres-master-nodeport"

echo "🔍 Finding first available Node IP..."
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')

echo "🔍 Getting NodePort for $SERVICE_NAME..."
PORT=$(kubectl get svc "$SERVICE_NAME" -n "$NAMESPACE" -o jsonpath="{.spec.ports[0].nodePort}")

echo "🔐 Decoding credentials from secret $SECRET_NAME..."
ENCODED_USER=$(kubectl get secret "$SECRET_NAME" -n "$NAMESPACE" -o jsonpath="{.data.username}")
ENCODED_PASS=$(kubectl get secret "$SECRET_NAME" -n "$NAMESPACE" -o jsonpath="{.data.password}")

USERNAME=$(echo "$ENCODED_USER" | base64 -d)
PASSWORD=$(echo "$ENCODED_PASS" | base64 -d)

echo "🚀 Connecting with psql..."
PGPASSWORD="$PASSWORD" psql "host=$NODE_IP port=$PORT user=$USERNAME sslmode=disable"

Шаг 12: Установка PgBouncer

# Получите пароль PostgreSQL
ENCODED_PASS=$(kubectl get secret postgres.postgres.credentials.postgresql.acid.zalan.do -n psql -o jsonpath="{.data.password}")
POSTGRES_PASSWORD=$(echo "$ENCODED_PASS" | base64 -d)

# Создайте временный файл конфигурации
cat > pgbouncer/values-temp.yaml <<EOF
replicaCount: 2
image:
  repository: quay.io/centerforopenscience/pgbouncer
  tag: '1.8.1'
service:
  name: pgbouncer
  type: NodePort
  externalPort: 6432
  internalPort: 6432
secretFiles:
  pgbouncer.ini: |-
    [databases]
    postgres = host=postgres port=5432 user=postgres password=$POSTGRES_PASSWORD
    [pgbouncer]
    listen_addr = 0.0.0.0
    listen_port = 6432
    auth_type = any
    auth_user = postgres
    pool_mode = transaction
    max_client_conn = 5000
    default_pool_size = 50
  userlist.txt: |-
    "postgres" "$POSTGRES_PASSWORD"
EOF

# Установите PgBouncer
helm upgrade --install pgbouncer ./pgbouncer 
  --namespace psql 
  -f pgbouncer/values-temp.yaml 
  --wait --timeout 15m0s

# Удалите временный файл
rm pgbouncer/values-temp.yaml

Шаг 13: Установка Kafka

# Создайте namespace для оператора
kubectl create namespace kafka-operator

# Добавьте репозиторий Helm
helm repo add strimzi https://strimzi.io/charts/
helm repo update

# Установите Strimzi Kafka Operator
helm upgrade --install strimzi-kafka-operator strimzi/strimzi-kafka-operator 
  --version 0.45.0 
  --namespace kafka-operator 
  --set watchAnyNamespace=true 
  --wait --timeout 15m0s

# Создайте namespace для кластера Kafka
kubectl create namespace kafka

# Примените манифест кластера Kafka
kubectl apply -f kafka/cluster.yaml -n kafka

# Дождитесь готовности кластера
kubectl wait kafka/platform-kafka --for=condition=Ready -n kafka --timeout=300s

Шаг 13.1: Создание пользователей и топиков Kafka

# Примените пользователей и топики Kafka
envsubst < kafka/users-and-topics.yaml | kubectl apply -f -

Что создается в users-and-topics.yaml:

Топики Kafka:
  1. ${CONTEXT}-camunda-topic – Топик для Camunda
    • 3 партиции
    • 3 реплики
    • Время хранения: 24 часа (86400000 мс)
  2. ${CONTEXT}-users-topic – Топик для пользователей
    • 3 партиции
    • 3 реплики
    • Время хранения: 24 часа (86400000 мс)
Пользователи Kafka:
  1. ${CONTEXT}-camunda-user – Пользователь для Camunda
    • Аутентификация: SCRAM-SHA-512
    • Авторизация: Simple
    • Права доступа:
      • Все операции на уровне кластера
      • Все операции на топик ${CONTEXT}-camunda-topic
      • Чтение и запись на топик ${CONTEXT}-camunda-topic
  2. ${CONTEXT}-users-user – Пользователь для пользователей
    • Аутентификация: SCRAM-SHA-512
    • Авторизация: Simple
    • Права доступа:
      • Все операции на уровне кластера
      • Все операции на топик ${CONTEXT}-users-topic

Шаг 13.2: Получение учетных данных пользователей Kafka

# Получите пароль для camunda пользователя
kubectl get secret ${CONTEXT}-camunda-user -n kafka -o jsonpath='{.data.password}' | base64 -d

# Получите пароль для users пользователя
kubectl get secret ${CONTEXT}-users-user -n kafka -o jsonpath='{.data.password}' | base64 -d

# Получите имена пользователей
kubectl get secret ${CONTEXT}-camunda-user -n kafka -o jsonpath='{.data.username}' | base64 -d
kubectl get secret ${CONTEXT}-users-user -n kafka -o jsonpath='{.data.username}' | base64 -d

Шаг 13.3: Проверка создания топиков и пользователей

# Проверьте созданные топики
kubectl get kafkatopics -n kafka

# Проверьте созданных пользователей
kubectl get kafkausers -n kafka

# Проверьте секреты с учетными данными
kubectl get secrets -n kafka | grep -E "(camunda|users)-user"

Шаг 13.4: Тестирование подключения к Kafka

# Создайте тестовый pod для подключения к Kafka
kubectl run kafka-test --rm -it --restart=Never -n kafka --image=quay.io/strimzi/kafka:3.9.0-kafka-3.9.0 -- bash

# Внутри pod выполните:
# Получите bootstrap servers
BOOTSTRAP_SERVERS=$(kubectl get kafka platform-kafka -n kafka -o jsonpath='{.status.listeners[?(@.name=="plain")].bootstrapServers}')

# Получите учетные данные
USERNAME=$(kubectl get secret ${CONTEXT}-camunda-user -n kafka -o jsonpath='{.data.username}' | base64 -d)
PASSWORD=$(kubectl get secret ${CONTEXT}-camunda-user -n kafka -o jsonpath='{.data.password}' | base64 -d)

# Тест подключения
kafka-console-producer.sh --bootstrap-server $BOOTSTRAP_SERVERS 
  --topic ${CONTEXT}-camunda-topic 
  --producer.config <(echo -e "security.protocol=SASL_PLAINTEXTnsasl.mechanism=SCRAM-SHA-512nsasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="$USERNAME" password="$PASSWORD";")

Шаг 14: Установка Rancher

# Создайте namespace
kubectl create namespace cattle-system

# Добавьте репозиторий Helm
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm repo update

# Установите Rancher
helm upgrade --install rancher rancher-stable/rancher 
  --namespace cattle-system 
  -f rancher/values.yaml 
  --wait --timeout 15m0s

 

Структура кластера

После выполнения скрипта у вас будет:

  • Namespaces
    • argocd – Argo CD для GitOps
    • cert-manager – Менеджер сертификатов
    • minio – Объектное хранилище
    • psql – PostgreSQL кластер и PgBouncer
    • kafka-operator – Kafka оператор
    • kafka – Kafka кластер
    • cattle-system – Rancher UI
    • appliner-platform – Основные сервисы платформы

  • Ключевые сервисы

    • PostgreSQL: postgres.psql.svc.cluster.local:5432
    • PgBouncer: pgbouncer.psql.svc.cluster.local:6432
    • MinIO: Доступ через Ingress
    • Argo CD: Доступ через Ingress
    • Rancher: Доступ через Ingress

Мониторинг и отладка

Проверка статуса компонентов

# Проверьте статус всех подов
kubectl get pods --all-namespaces

# Проверьте статус PostgreSQL кластера
kubectl get postgresqls.acid.zalan.do -n psql

# Проверьте статус Kafka кластера
kubectl get kafka -n kafka

# Проверьте сервисы
kubectl get svc --all-namespaces

Логи компонентов

# Логи PostgreSQL
kubectl logs -n psql -l application=spilo

# Логи PgBouncer
kubectl logs -n psql -l app=pgbouncer

# Логи Argo CD
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-server

 

Восстановление после сбоев

Если PostgreSQL кластер недоступен

# Проверьте статус кластера
kubectl get postgresqls.acid.zalan.do postgres -n psql

# Перезапустите кластер при необходимости
kubectl delete postgresql postgres -n psql
kubectl apply -f postgres-operator-cluster/postgres.yaml

Если PgBouncer недоступен

# Переустановите PgBouncer
helm uninstall pgbouncer -n psql
# Затем выполните шаг 12 заново

 

Настройка Argo CD для развертывания приложений

После успешного выполнения скрипта init.sh необходимо настроить Argo CD для развертывания приложений платформы.

Шаг 1: Доступ к Argo CD

# Получите пароль администратора Argo CD
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

# Порт-форвард для доступа к Argo CD UI
kubectl port-forward svc/argocd-server -n argocd 8080:443

Argo CD будет доступен по адресу: https://localhost:8080

  • Логин: admin
  • Пароль: (полученный выше)

Шаг 2: Создание проекта в Argo CD

  1. Войдите в Argo CD UI
  2. Перейдите в SettingsProjects
  3. Нажмите New Project
  4. Создайте проект со следующими настройками:
Name: appliner-platform
Description: Appliner Platform Applications

# Source Repositories
Source Repositories:
- https://nexus.appliner.dev/repository/private-helm/

# Destination Clusters and Namespaces
Destinations:
- Server: https://kubernetes.default.svc
  Namespace: appliner-platform
- Server: https://kubernetes.default.svc
  Namespace: tenant-*

# Cluster Resource Allow List
Cluster Resource Allow List:
- Group: ""
  Kind: Namespace
- Group: ""
  Kind: Service
- Group: ""
  Kind: ConfigMap
- Group: ""
  Kind: Secret
- Group: ""
  Kind: PersistentVolumeClaim
- Group: apps
  Kind: Deployment
- Group: apps
  Kind: StatefulSet
- Group: networking.k8s.io
  Kind: Ingress
- Group: autoscaling
  Kind: HorizontalPodAutoscaler

# Namespace Resource Allow List
Namespace Resource Allow List:
- Group: ""
  Kind: Service
- Group: ""
  Kind: ConfigMap
- Group: ""
  Kind: Secret
- Group: ""
  Kind: PersistentVolumeClaim
- Group: apps
  Kind: Deployment
- Group: apps
  Kind: StatefulSet
- Group: networking.k8s.io
  Kind: Ingress
- Group: autoscaling
  Kind: HorizontalPodAutoscaler

Шаг 3: Подключение репозитория Helm

  1. Перейдите в SettingsRepositories
  2. Нажмите Connect Repo
  3. Выберите HTTPS и введите:
    • Repository URL: https://nexus.appliner.dev/repository/private-helm/
    • Username: (если требуется)
    • Password: (если требуется)
  4. Нажмите Connect

Шаг 4: Создание приложения в Argo CD

  1. Перейдите в Applications
  2. Нажмите New App
  3. Заполните следующие параметры:

General Settings

  • Application Name: appliner-platform
  • Project: appliner-platform
  • Sync Policy: Manual (рекомендуется для production)

Source Configuration

  • Repository URL: https://nexus.appliner.dev/repository/private-helm/
  • Revision: 0.0.96 (или нужная версия)
  • Path: (оставьте пустым)
  • Chart: appliner-platform

Destination Configuration

  • Cluster: https://kubernetes.default.svc
  • Namespace: tenant-anrait (или нужный namespace)

Helm Parameters

Добавьте следующие параметры (замените значения на ваши):

# Глобальные настройки
- name: global.deploy
  value: prod
- name: global.domain
  value: your-tenant.appliner.io
- name: global.TENANT_ID
  value: your-tenant
- name: global.repository
  value: private.nexus.appliner.dev/appliner-platform
- name: global.root_domain
  value: appliner.io
- name: global.CERT_ISSUER
  value: yc-clusterissuer
- name: global.TENANT_KEY
  value: your-tenant

# Версии приложений
- name: backend.AppVersion
  value: 0.0.32606
- name: ldap-manager.AppVersion
  value: 0.0.36940
- name: sandbox-manager.AppVersion
  value: 0.0.31519
- name: webapp.AppVersion
  value: 0.0.29029
- name: keycloak.AppVersion
  value: 0.0.36952
- name: api-gateway.AppVersion
  value: 0.0.36949
- name: platform-webapp-storybook.AppVersion
  value: 0.0.29029
- name: service-creator-k8s.AppVersion
  value: 0.0.28881
- name: tenant-camunda.AppVersion
  value: 0.0.38657
- name: deployment-manager.AppVersion
  value: 0.0.37587
- name: tenant-frontend.AppVersion
  value: 0.0.36941
- name: tenant-backend.AppVersion
  value: 0.0.37217
- name: platform-tenant-frontend-storybook.AppVersion
  value: 0.0.36941

# Настройки компонентов
- name: wiki.enabled
  value: 'false'
- name: tenant-camunda.enabled
  value: 'true'
- name: global.jaeger
  value: 'false'

# LDAP настройки
- name: global.ldap.url
  value: 'ldap://platform-ldap'
- name: phpldapadmin.ingress.tls.hosts
  value: ldapyour-tenant.appliner.io

# MinIO настройки
- name: global.minio.endpoint
  value: 'https://storage.yandexcloud.net'
- name: global.minio.access_key
  value: YOUR_MINIO_ACCESS_KEY
- name: global.minio.secret_key
  value: YOUR_MINIO_SECRET_KEY

# Keycloak настройки
- name: keycloak.hpa.maxReplicas
  value: '1'
- name: global.keycloak.base_url
  value: 'https://your-tenant.appliner.io/auth'

# PostgreSQL настройки
- name: global.pgsql.host
  value: your-postgres-host.mdb.yandexcloud.net
- name: global.pgsql.port
  value: '6432'
- name: global.pgsql.cluster
  value: production

# PostgreSQL - Keycloak
- name: global.pgsql.keycloak.host
  value: your-postgres-host.mdb.yandexcloud.net
- name: global.pgsql.keycloak.password
  value: YOUR_KEYCLOAK_PASSWORD
- name: global.pgsql.keycloak.db
  value: keycloak_your-tenant
- name: global.pgsql.keycloak.user
  value: keycloak_your-tenant

# PostgreSQL - Platform
- name: global.pgsql.platform.db
  value: platform_your-tenant
- name: global.pgsql.platform.user
  value: platform_your-tenant
- name: global.pgsql.platform.password
  value: YOUR_PLATFORM_PASSWORD

# PostgreSQL - Camunda
- name: global.pgsql.tenant-camunda.host
  value: your-postgres-host.mdb.yandexcloud.net
- name: global.pgsql.tenant-camunda.password
  value: YOUR_CAMUNDA_PASSWORD
- name: global.pgsql.tenant-camunda.db
  value: camunda_your-tenant

# Kafka настройки
- name: global.kafka.bootstrapServers
  value: 'your-kafka-host.mdb.yandexcloud.net:9091'
- name: global.kafka.securityProtocol
  value: SASL_SSL
- name: tenant-camunda.KAFKA_BOOTSTRAP_SERVERS
  value: 'your-kafka-host.mdb.yandexcloud.net:9091'
- name: tenant-camunda.KAFKA_SECURITY_PROTOCOL
  value: SASL_SSL
- name: global.KAFKA_TRUSTSTORE_LOCATION
  value: 'file:/usr/local/share/ca-certificates/yc_root.crt'
- name: global.KAFKA_TRUSTSTORE_TYPE
  value: PEM

# Дополнительные настройки
- name: global.chain.url
  value: 'http://ai.appliner.io/api/executeGraph'

Пример полного манифеста приложения Argo CD

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: appliner-platform
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: appliner-platform
  source:
    repoURL: 'https://nexus.appliner.dev/repository/private-helm/'
    targetRevision: 0.0.96
    helm:
      parameters:
        # Глобальные настройки
        - name: global.deploy
          value: prod
        - name: global.domain
          value: your-tenant.appliner.io
        - name: global.TENANT_ID
          value: your-tenant
        - name: global.repository
          value: private.nexus.appliner.dev/appliner-platform
        - name: global.root_domain
          value: appliner.io
        - name: global.CERT_ISSUER
          value: yc-clusterissuer
        - name: global.TENANT_KEY
          value: your-tenant

        # Версии приложений
        - name: backend.AppVersion
          value: 0.0.32606
        - name: ldap-manager.AppVersion
          value: 0.0.36940
        - name: sandbox-manager.AppVersion
          value: 0.0.31519
        - name: webapp.AppVersion
          value: 0.0.29029
        - name: keycloak.AppVersion
          value: 0.0.36952
        - name: api-gateway.AppVersion
          value: 0.0.36949
        - name: platform-webapp-storybook.AppVersion
          value: 0.0.29029
        - name: service-creator-k8s.AppVersion
          value: 0.0.28881
        - name: tenant-camunda.AppVersion
          value: 0.0.38657
        - name: deployment-manager.AppVersion
          value: 0.0.37587
        - name: tenant-frontend.AppVersion
          value: 0.0.36941
        - name: tenant-backend.AppVersion
          value: 0.0.37217
        - name: platform-tenant-frontend-storybook.AppVersion
          value: 0.0.36941

        # Настройки компонентов
        - name: wiki.enabled
          value: 'false'
        - name: tenant-camunda.enabled
          value: 'true'
        - name: global.jaeger
          value: 'false'

        # LDAP настройки
        - name: global.ldap.url
          value: 'ldap://platform-ldap'
        - name: phpldapadmin.ingress.tls.hosts
          value: ldapyour-tenant.appliner.io

        # MinIO настройки
        - name: global.minio.endpoint
          value: 'https://storage.yandexcloud.net'
        - name: global.minio.access_key
          value: YOUR_MINIO_ACCESS_KEY
        - name: global.minio.secret_key
          value: YOUR_MINIO_SECRET_KEY

        # Keycloak настройки
        - name: keycloak.hpa.maxReplicas
          value: '1'
        - name: global.keycloak.base_url
          value: 'https://your-tenant.appliner.io/auth'

        # PostgreSQL настройки
        - name: global.pgsql.host
          value: your-postgres-host.mdb.yandexcloud.net
        - name: global.pgsql.port
          value: '6432'
        - name: global.pgsql.cluster
          value: production

        # PostgreSQL - Keycloak
        - name: global.pgsql.keycloak.host
          value: your-postgres-host.mdb.yandexcloud.net
        - name: global.pgsql.keycloak.password
          value: YOUR_KEYCLOAK_PASSWORD
        - name: global.pgsql.keycloak.db
          value: keycloak_your-tenant
        - name: global.pgsql.keycloak.user
          value: keycloak_your-tenant

        # PostgreSQL - Platform
        - name: global.pgsql.platform.db
          value: platform_your-tenant
        - name: global.pgsql.platform.user
          value: platform_your-tenant
        - name: global.pgsql.platform.password
          value: YOUR_PLATFORM_PASSWORD

        # PostgreSQL - Camunda
        - name: global.pgsql.tenant-camunda.host
          value: your-postgres-host.mdb.yandexcloud.net
        - name: global.pgsql.tenant-camunda.password
          value: YOUR_CAMUNDA_PASSWORD
        - name: global.pgsql.tenant-camunda.db
          value: camunda_your-tenant

        # Kafka настройки
        - name: global.kafka.bootstrapServers
          value: 'your-kafka-host.mdb.yandexcloud.net:9091'
        - name: global.kafka.securityProtocol
          value: SASL_SSL
        - name: tenant-camunda.KAFKA_BOOTSTRAP_SERVERS
          value: 'your-kafka-host.mdb.yandexcloud.net:9091'
        - name: tenant-camunda.KAFKA_SECURITY_PROTOCOL
          value: SASL_SSL
        - name: global.KAFKA_TRUSTSTORE_LOCATION
          value: 'file:/usr/local/share/ca-certificates/yc_root.crt'
        - name: global.KAFKA_TRUSTSTORE_TYPE
          value: PEM

        # Дополнительные настройки
        - name: global.chain.url
          value: 'http://ai.appliner.io/api/executeGraph'
      chart: appliner-platform
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: tenant-your-tenant
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Шаг 5: Синхронизация приложения

  1. После создания приложения нажмите Sync
  2. Выберите Synchronize для развертывания
  3. Следите за статусом развертывания в Argo CD UI

Проверка развертывания

# Проверьте статус подов в namespace
kubectl get pods -n tenant-anrait

# Проверьте сервисы
kubectl get svc -n tenant-anrait

# Проверьте ingress
kubectl get ingress -n tenant-anrait

# Логи приложений
kubectl logs -n tenant-anrait -l app=backend
kubectl logs -n tenant-anrait -l app=frontend

 

Устранение неполадок

Частые проблемы и решения

1. Проблемы с доступом к репозиториям

# Проверьте доступ к Nexus
curl -I https://nexus.appliner.dev/repository/private-helm/

# Проверьте доступ к Docker registry
docker pull private.nexus.appliner.dev/appliner-platform/backend:latest

2. Проблемы с PostgreSQL

# Проверьте статус кластера PostgreSQL
kubectl get postgresqls.acid.zalan.do -n psql

# Проверьте логи PostgreSQL
kubectl logs -n psql -l application=spilo --tail=100

# Проверьте подключение к базе данных
kubectl exec -it -n psql deployment/pgbouncer -- psql -h postgres -U postgres -d postgres

3. Проблемы с Argo CD

# Проверьте статус Argo CD
kubectl get pods -n argocd

# Получите пароль администратора
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

# Проверьте логи Argo CD
kubectl logs -n argocd deployment/argocd-server --tail=50

4. Проблемы с Kafka

# Проверьте статус Kafka кластера
kubectl get kafka -n kafka

# Проверьте логи Kafka
kubectl logs -n kafka -l app.kubernetes.io/name=kafka --tail=50

# Проверьте топики Kafka
kubectl get kafkatopics -n kafka

# Проверьте пользователей Kafka
kubectl get kafkausers -n kafka

# Проверьте секреты с учетными данными
kubectl get secrets -n kafka | grep -E "(camunda|users)-user"

# Проверьте статус Zookeeper
kubectl get pods -n kafka -l app.kubernetes.io/name=zookeeper

# Проверьте логи Zookeeper
kubectl logs -n kafka -l app.kubernetes.io/name=zookeeper --tail=50

5. Получение учетных данных Kafka

# Получите bootstrap servers
kubectl get kafka platform-kafka -n kafka -o jsonpath='{.status.listeners[?(@.name=="plain")].bootstrapServers}'

# Получите учетные данные пользователей
kubectl get secret ${CONTEXT}-camunda-user -n kafka -o jsonpath='{.data.username}' | base64 -d
kubectl get secret ${CONTEXT}-camunda-user -n kafka -o jsonpath='{.data.password}' | base64 -d

kubectl get secret ${CONTEXT}-users-user -n kafka -o jsonpath='{.data.username}' | base64 -d
kubectl get secret ${CONTEXT}-users-user -n kafka -o jsonpath='{.data.password}' | base64 -d

Полезные команды для диагностики

# Проверьте все поды в кластере
kubectl get pods --all-namespaces

# Проверьте события в namespace
kubectl get events -n psql --sort-by='.lastTimestamp'

# Проверьте использование ресурсов
kubectl top nodes
kubectl top pods --all-namespaces

# Проверьте логи всех подов в namespace
kubectl logs -n psql --all-containers --tail=100

 

Мониторинг и логирование

Prometheus и Grafana (опционально)

# Установка Prometheus Operator
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring --create-namespace

# Доступ к Grafana
kubectl port-forward svc/prometheus-grafana -n monitoring 3000:80
# Логин: admin, Пароль: prom-operator

Централизованное логирование

# Установка ELK Stack (если необходимо)
kubectl apply -f elk/elasticsearch-values.yaml
kubectl apply -f elk/filebeat-values.yaml
kubectl apply -f elk/kibana-values.yaml

 

Дополнительные ресурсы

Полезные ссылки

Конфигурационные файлы

  • cluster.yml: charts/appliner-new-platform-chart/infra/cluster.yml
  • init.sh: charts/appliner-new-platform-chart/infra/init.sh
  • Argo CD values: charts/appliner-new-platform-chart/infra/argo-cd/values.yaml
  • PostgreSQL Operator values: charts/appliner-new-platform-chart/infra/postgres-operator/values.yaml

Скрипты для быстрого доступа

# Быстрый доступ к Argo CD
alias argocd-port-forward='kubectl port-forward svc/argocd-server -n argocd 8080:443'

# Быстрый доступ к PostgreSQL
alias psql-connect='kubectl exec -it -n psql deployment/pgbouncer -- psql -h postgres -U postgres'

# Проверка статуса всех компонентов
alias check-status='kubectl get pods --all-namespaces | grep -E "(argocd|psql|kafka|minio)"'

 

Безопасность

Рекомендации по безопасности

1. Смена паролей по умолчанию

# Смените пароль администратора Argo CD
kubectl -n argocd patch secret argocd-secret -p '{"stringData":{"admin.password":"$(openssl rand -base64 32)"}}

2. Настройка RBAC

# Примените RBAC для Argo CD
kubectl apply -f argo-cd/argocd-rbac-cm.yam

3. Ограничение доступа к API

# Настройте Network Policies
kubectl apply -f network-policies/

 Резервное копирование

# Резервное копирование PostgreSQL
kubectl exec -n psql deployment/pgbouncer -- pg_dump -h postgres -U postgres > backup.sql

# Резервное копирование конфигураций
tar -czf config-backup-$(date +%Y%m%d).tar.gz charts/appliner-new-platform-chart/infra/

 

Заключение

Скрипт init.sh автоматизирует сложный процесс настройки инфраструктуры платформы Appliner. При ручном выполнении важно соблюдать порядок установки компонентов, так как они имеют зависимости друг от друга. Особое внимание следует уделить настройке PostgreSQL и созданию пользователей с правильными правами доступа.

После настройки инфраструктуры необходимо создать приложение в Argo CD для развертывания компонентов платформы с правильными параметрами конфигурации.

Следующие шаги

  1. Настройка мониторинга: Установите Prometheus и Grafana для мониторинга
  2. Настройка логирования: Настройте централизованное логирование
  3. Настройка резервного копирования: Настройте автоматическое резервное копирование
  4. Настройка безопасности: Примените дополнительные меры безопасности
  5. Документирование: Создайте документацию для вашей конкретной конфигурации

Оставить комментарий

Оглавление