Инструкция развертывания приложения Infomaximum в Kubernetes
Документация
Главная

Инструкция развертывания приложения Infomaximum в KubernetesLTS

Развертывание Infomaximum Proceset в Kubernetes

Инструкция описывает базовое развертывание приложения Infomaximum и ClickHouse в Kubernetes. Все компоненты создаются в отдельном пространстве имен infomaximum, а данные и журналы сохраняются в постоянных томах.

Подготовка манифестов

Для развертывания подготовьте три YAML-файла: описание пространства имен, манифест приложения и манифест ClickHouse.

Создать файл namespace.yaml

Пространство имен объединяет ресурсы развертывания и отделяет их от остальных приложений кластера. Создайте его первым, поскольку во всех последующих манифестах явно указано пространство имен infomaximum.

apiVersion: v1
kind: Namespace
metadata:
  name: infomaximum

Создать файл infomaximum-app.yaml

Этот манифест создает постоянные тома для данных и журналов, экземпляр приложения и сервис типа LoadBalancer для доступа к нему. Перед применением замените адрес proceset.example.local в переменной FE_URL на внешний адрес, по которому пользователи будут открывать приложение.

PersistentVolumeClaim для данных приложения:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: infomaximum-app-data
  namespace: infomaximum
spec:
  accessModes: ["ReadWriteOnce"]
  resources:
    requests:
      storage: 200Gi

PersistentVolumeClaim для журналов приложения:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: infomaximum-app-log
  namespace: infomaximum
spec:
  accessModes: ["ReadWriteOnce"]
  resources:
    requests:
      storage: 10Gi

Deployment приложения Infomaximum:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: infomaximum-app
  namespace: infomaximum
  labels:
    app: infomaximum-app
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: infomaximum-app
  template:
    metadata:
      labels:
        app: infomaximum-app
    spec:
      containers:
        - name: app
          image: registry.infomaximum.ru/infomaximum/infomaximum_app:d260305
          imagePullPolicy: IfNotPresent
          env:
            - name: JVM_MAX_MEMORY
              value: "4G"
            - name: FE_URL
              value: "https://proceset.example.local"       # внешний адрес, по которому ОТКРЫВАЮТ приложение
            - name: FE_CORS_POLICY
              value: "*"
          ports:
            - name: http
              containerPort: 8010
          volumeMounts:
            - name: data
              mountPath: /var/lib/infomaximum/data
            - name: log
              mountPath: /var/log/infomaximum
          readinessProbe:
            tcpSocket: { port: 8010 }
            initialDelaySeconds: 60 
            periodSeconds: 15
          livenessProbe:
            tcpSocket: { port: 8010 }
            initialDelaySeconds: 90
            periodSeconds: 20
          resources:
            requests: { cpu: "500m", memory: "1Gi" }
            limits:   { memory: "16Gi" }
      volumes:
        - name: data
          persistentVolumeClaim: { claimName: infomaximum-app-data }
        - name: log
          persistentVolumeClaim: { claimName: infomaximum-app-log }

Service для доступа к приложению:

apiVersion: v1
kind: Service
metadata:
  name: infomaximum-app
  namespace: infomaximum
spec:
  type: LoadBalancer 
  selector:
    app: infomaximum-app
  ports:
    - name: http
      port: 8010
      targetPort: 8010

Создать файл clickhouse.yaml

Манифест разворачивает один экземпляр ClickHouse в виде StatefulSet и выделяет отдельные постоянные тома для данных и журналов. Имя пользователя и хеш пароля передаются в контейнер через Kubernetes Secrets, поэтому соответствующие секреты необходимо создать до запуска ClickHouse.

Service для доступа к ClickHouse:

apiVersion: v1
kind: Service
metadata:
  name: clickhouse
  namespace: infomaximum
  labels:
    app: clickhouse
spec:
  type: ClusterIP
  selector:
    app: clickhouse
  ports:
    - { name: http, port: 8123, targetPort: 8123 }

StatefulSet ClickHouse:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: clickhouse
  namespace: infomaximum
  labels:
    app: clickhouse
spec:
  serviceName: clickhouse
  replicas: 1
  selector:
    matchLabels:
      app: clickhouse
  template:
    metadata:
      labels:
        app: clickhouse
    spec:
      automountServiceAccountToken: false
      initContainers:
        - name: fix-permissions
          image: registry.infomaximum.ru/infomaximum/infomaximum-clickhouse:25.8.2.29
          command: ["sh", "-c", "chown -R 101:101 /var/lib/clickhouse /var/log/clickhouse-server"]
          securityContext:
            runAsUser: 0
          volumeMounts:
            - name: data
              mountPath: /var/lib/clickhouse
            - name: log
              mountPath: /var/log/clickhouse-server
      containers:
        - name: clickhouse
          image: registry.infomaximum.ru/infomaximum/infomaximum-clickhouse:25.8.2.29
          imagePullPolicy: IfNotPresent
          env:
            - name: APP_USER_ACCESS_MANAGEMENT
              value: "1"
          ports:
            - { name: http, containerPort: 8123 }
          volumeMounts:
            - name: data
              mountPath: /var/lib/clickhouse
            - name: log
              mountPath: /var/log/clickhouse-server
            - name: secrets
              mountPath: /run/secrets
              readOnly: true
          readinessProbe:
            httpGet: { path: /ping, port: 8123 }
            initialDelaySeconds: 10
            periodSeconds: 10
          livenessProbe:
            httpGet: { path: /ping, port: 8123 }
            initialDelaySeconds: 30
            periodSeconds: 15
          resources:
            requests: { cpu: "250m", memory: "512Mi" }
            limits:   { memory: "4Gi" }
      volumes:
        - name: secrets
          projected:
            sources:
              - secret:
                  name: infomaximum-app-user
                  optional: true
              - secret:
                  name: infomaximum-app-user-password-hash
                  optional: true
  volumeClaimTemplates:
    - metadata:
        name: data
        labels:
          app: clickhouse
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 200Gi
    - metadata:
        name: log
        labels:
          app: clickhouse
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 10Gi

Применение

Выполняйте команды из каталога, в котором находятся созданные YAML-файлы и файлы секретов. Сначала создайте пространство имен и секреты, затем примените манифесты приложения и ClickHouse; после развертывания проверьте состояние ресурсов и журналы приложения.

kubectl apply -f namespace.yaml

# Предварительно нужно создать файлы секретов
# внешний секрет №1 - имя пользователя
kubectl -n infomaximum create secret generic infomaximum-app-user \
  --from-file=infomaximum_app_user=infomaximum_app_user.secret

# внешний секрет №2 - sha256 хэш пароля
kubectl -n infomaximum create secret generic infomaximum-app-user-password-hash \
  --from-file=infomaximum_app_user_password_hash=infomaximum_app_user_password_hash.secret

# Развертывание
kubectl apply -f infomaximum-app.yaml
kubectl apply -f clickhouse.yaml
# Проверка статуса развертывания
kubectl -n infomaximum get pods
kubectl -n infomaximum get services
kubectl -n infomaximum get deployment
# Проверка логов
kubectl -n infomaximum logs -f deployment/infomaximum-app

Была ли статья полезна?

Предыдущая
Перенос сервера Proceset с Windows на Linux
Следующая
Установка и настройка ClickHouse
8 (800) 555-89-02
430006, Саранск,
Северо-восточное шоссе, д. 3
Код вида деятельности
в области ИТ 15.02 и 17.01
ОКВЭД 62.01
ИНН 1328​909857
Языки программирования: