База знаний Appliner
Документация по скрипту 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
Что делает скрипт
- Подготовка кластера
- Опционально: Запускает
rke up cluster.ymlдля создания/обновления кластера - Объединяет файлы конфигурации
kube_config_*в~/.kube/config - Заменяет плейсхолдеры
{root_domain}на актуальный домен
- Опционально: Запускает
- Установка базовых компонентов
- 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: Устанавливает веб-интерфейс для управления кластером
- Настройка 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 права доступа для пользователей
- Настройки репликации и партиций
Порядок выполнения инициализации
- Запуск основного скрипта:
bash init.sh - Создание кластера PostgreSQL: Применение
postgres.yaml - Инициализация кластера:
bash init-postgres.sh - Настройка доступа: Применение
postgres-nodeport.yaml - Настройка аутентификации:
bash pg_hba.sh - Создание пользователей: Ручное выполнение или через
psql_init.sh - Настройка PgBouncer: Установка с динамическими паролями
- Создание Kafka кластера: Применение
cluster.yaml - Создание пользователей и топиков 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:
${CONTEXT}-camunda-topic– Топик для Camunda- 3 партиции
- 3 реплики
- Время хранения: 24 часа (86400000 мс)
${CONTEXT}-users-topic– Топик для пользователей- 3 партиции
- 3 реплики
- Время хранения: 24 часа (86400000 мс)
Пользователи Kafka:
${CONTEXT}-camunda-user– Пользователь для Camunda- Аутентификация: SCRAM-SHA-512
- Авторизация: Simple
- Права доступа:
- Все операции на уровне кластера
- Все операции на топик
${CONTEXT}-camunda-topic - Чтение и запись на топик
${CONTEXT}-camunda-topic
${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 для GitOpscert-manager– Менеджер сертификатовminio– Объектное хранилищеpsql– PostgreSQL кластер и PgBouncerkafka-operator– Kafka операторkafka– Kafka кластерcattle-system– Rancher UIappliner-platform– Основные сервисы платформы
- Ключевые сервисы
- PostgreSQL:
postgres.psql.svc.cluster.local:5432 - PgBouncer:
pgbouncer.psql.svc.cluster.local:6432 - MinIO: Доступ через Ingress
- Argo CD: Доступ через Ingress
- Rancher: Доступ через Ingress
- PostgreSQL:
Мониторинг и отладка
Проверка статуса компонентов
# Проверьте статус всех подов
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
- Войдите в Argo CD UI
- Перейдите в Settings → Projects
- Нажмите New Project
- Создайте проект со следующими настройками:
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
- Перейдите в Settings → Repositories
- Нажмите Connect Repo
- Выберите HTTPS и введите:
- Repository URL:
https://nexus.appliner.dev/repository/private-helm/ - Username: (если требуется)
- Password: (если требуется)
- Repository URL:
- Нажмите Connect
Шаг 4: Создание приложения в Argo CD
- Перейдите в Applications
- Нажмите New App
- Заполните следующие параметры:
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: Синхронизация приложения
- После создания приложения нажмите Sync
- Выберите Synchronize для развертывания
- Следите за статусом развертывания в 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
Дополнительные ресурсы
Полезные ссылки
- Argo CD Documentation: https://argo-cd.readthedocs.io/
- PostgreSQL Operator: https://postgres-operator.readthedocs.io/
- Strimzi Kafka: https://strimzi.io/docs/
- Rancher Documentation: https://rancher.com/docs/
- Helm Charts: https://helm.sh/docs/
Конфигурационные файлы
- 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 для развертывания компонентов платформы с правильными параметрами конфигурации.
Следующие шаги
- Настройка мониторинга: Установите Prometheus и Grafana для мониторинга
- Настройка логирования: Настройте централизованное логирование
- Настройка резервного копирования: Настройте автоматическое резервное копирование
- Настройка безопасности: Примените дополнительные меры безопасности
- Документирование: Создайте документацию для вашей конкретной конфигурации