Типовые проблемы

Здесь собраны типовые проблемы, с которыми вы можете столкнуться при использовании DataLens On-premises, и варианты их решения.

Типовые проблемы

  1. Сброс ключа шифрования CONTROL_API_CRYPTO_KEY.
  2. Запуск на Oracle Linux 8/9 (RHEL).
  3. Развертывание через Argo CD.
  4. Замена стандартных портов Ingress-контроллера Traefik.
  5. Редиректы с HTTP на HTTPS.

Сброс ключа шифрования CONTROL_API_CRYPTO_KEY

В логах control-api появляется ошибка InvalidSignature: Signature did not match digest.

Если используется подключение к внешней базе:

#!/bin/bash
set -eo pipefail

# fill this values
CONTROL_API_CRYPTO_KEY="..."
POSTGRES_HOST="..."
POSTGRES_PORT="..."
POSTGRES_USER_US="..."
POSTGRES_DB_US="..."
POSTGRES_PASSWORD_US="..."
# fill this values

cat >./crypto.py <<EOL
import sys
from cryptography.fernet import Fernet
def main():
  fernet = Fernet(sys.argv[1])
  encrypted = fernet.encrypt(sys.argv[2].encode('utf-8')).decode()
  print(encrypted)
main()
EOL

export PGPASSWORD="${POSTGRES_PASSWORD_US}"
NULL_PASSWORD=$(python3 ./crypto.py "${CONTROL_API_CRYPTO_KEY}" null)

psql \
  --host "${POSTGRES_HOST}" \
  --port "${POSTGRES_PORT}" \
  --username "${POSTGRES_USER_US}" \
  --dbname "${POSTGRES_DB_US}" <<-EOSQL
  UPDATE entries SET unversioned_data = jsonb_set(unversioned_data, '{password,cypher_text}', '"${NULL_PASSWORD}"', true) WHERE unversioned_data #> '{password,cypher_text}' IS NOT NULL;
  UPDATE entries SET unversioned_data = jsonb_set(unversioned_data, '{token,cypher_text}', '"${NULL_PASSWORD}"', true) WHERE unversioned_data #> '{token,cypher_text}' IS NOT NULL;
EOSQL

Если база встроенная:

./init.sh --pg /init/us-restore.sh --reset-crypto-key

Решение

Проблема связана с ключом шифрования подключений, который хранится в секрете в переменной CONTROL_API_CRYPTO_KEY. Необходимо вернуть старый ключ либо выполнить сброс ключа вручную через скрипт ./init.sh --pg /init/us-restore.sh --reset-crypto-key.

Если ключ шифрования был изменен, то все подключения остаются зашифрованными старым ключом.

При сложностях с выполнением скрипта через ./init.sh можно собрать скрипт вручную:

#!/bin/bash
set -eo pipefail

# fill this values
CONTROL_API_CRYPTO_KEY="..."
POSTGRES_HOST="..."
POSTGRES_PORT="..."
POSTGRES_USER_US="..."
POSTGRES_DB_US="..."
POSTGRES_PASSWORD_US="..."
# fill this values

cat >./crypto.py <<EOL
import sys
from cryptography.fernet import Fernet
def main():
  fernet = Fernet(sys.argv[1])
  encrypted = fernet.encrypt(sys.argv[2].encode('utf-8')).decode()
  print(encrypted)
main()
EOL

export PGPASSWORD="${POSTGRES_PASSWORD_US}"
NULL_PASSWORD=$(python3 ./crypto.py "${CONTROL_API_CRYPTO_KEY}" null)

psql \
  --host "${POSTGRES_HOST}" \
  --port "${POSTGRES_PORT}" \
  --username "${POSTGRES_USER_US}" \
  --dbname "${POSTGRES_DB_US}" <<-EOSQL
  UPDATE entries SET unversioned_data = jsonb_set(unversioned_data, '{password,cypher_text}', '"${NULL_PASSWORD}"', true) WHERE unversioned_data #> '{password,cypher_text}' IS NOT NULL;
  UPDATE entries SET unversioned_data = jsonb_set(unversioned_data, '{token,cypher_text}', '"${NULL_PASSWORD}"', true) WHERE unversioned_data #> '{token,cypher_text}' IS NOT NULL;
EOSQL

После сброса ключа необходимо заново вручную заполнить пароли к источникам в подключениях.

Запуск на Oracle Linux 8/9 (RHEL)

Для запуска K3s на Oracle Linux 8 необходимо либо полностью отключить firewalld, либо настроить в файрволе правила для корректной работы сети Kubernetes.

Основные порты, которые требуются для работы K3s:

  • 6443/tcp — основной API-сервер Kubernetes (master);
  • 2379–2380/tcp — etcd (для многомастерной установка);
  • 10250/tcp — kubelet API;
  • 8472/udp — VXLAN (Flunnel-сеть, если используется);
  • 30000–32767/tcp — диапазон портов для NodePort-сервисов.

Решение

Вариант 1. Отключить firewalld:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

Вариант 2. Добавить правила для нужных портов или для сетевых интерфейсов.

Пример для firewalld:

# traffic between k8s pod network subnets
sudo firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
sudo firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16
# or
sudo firewall-cmd --permanent --zone=trusted --add-interface=cni0
sudo firewall-cmd --permanent --zone=trusted --add-interface=flannel.1


# k8s api server access for all nodes (optional)
sudo firewall-cmd --permanent --add-port=6443/tcp
# client requests to etcd and peer communication between etcd members (optional)
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
# kubelet api port on each node (optional)
sudo firewall-cmd --permanent --add-port=10250/tcp
# flannel vxlan pod network communication (optional)
sudo firewall-cmd --permanent --add-port=8472/udp
# node port external traffic (optional)
sudo firewall-cmd --permanent --add-port=30000-32767/tcp

sudo firewall-cmd --reload

Совет

Если файрвол не мешает работе, предпочтительнее настроить только необходимые порты вместо полного его отключения. Это поможет сохранить базовую безопасность системы при допустимых настройках для Kubernetes.

Развертывание через Argo CD

В Argo CD есть проблема с использованием функции lookup — отсутствует проверка существования секрета.

Подробнее о функции lookup:

Решение

Чтобы избежать проблем при обновлении, нужно вручную указать ссылку на ресурс с секретами через values в secrets.ref:

image

Сами секреты в таком случае придется заполнить вручную или скопировать из уже добавленного ресурса при первой выкатке.

Замена стандартных портов Ingress-контроллера Traefik

Необходимо создать или отредактировать файл по данному пути:

/var/lib/rancher/k3s/server/manifests/traefik-config.yaml

Содержимое файла:

apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
    ports:
      web:
        exposedPort: 80
      websecure:
        exposedPort: 443

Порты 80 и 443 — внешние порты Ingress-контроллера.

После сохранения файла изменения автоматически применятся. Сервис K3s автоматически отслеживает эту директорию с манифестами и сам обновит Traefik (Ingress).

Порт 443 все еще будет доступен до момента перезагрузки сервиса Traefik. Для принудительного обновления выполните команду:

sudo k3s kubectl rollout restart deployment traefik -n kube-system

Редиректы с HTTP на HTTPS

При использовании nginx-контроллера аннотация Kubernetes, которая автоматически перенаправляет все HTTP-запросы на HTTPS, выглядит так:

nginx.ingress.kubernetes.io/ssl-redirect: "true"

Ошибка: не работает загрузка файлов

Не работает загрузка файлов на домене первого (верхнего) уровня (TLD), например datalensnb:

image

Решение

Всегда использовать домен второго уровня, например datalens.nb.

Ошибка: проблемный релиз

Проблемный релиз, релиз завис в статусе Error: UPGRADE FAILED: another operation (install/upgrade/rollback) is in progress.

Решение

  1. Получите последний удачный релиз:

    ./bin/helm-amd64 -n datalens-enterprise history datalens-enterprise | grep 'Upgrade complete' | tail -n1
    
  2. Определите номер релиза, в данном случае 11:

    11          Jun 18 10:00:30 2025    deployed    datalens-enterprise-0.0.4    25.9.0    Upgrade complete
    
  3. Откатитесь к последнему удачному релизу:

    ./bin/helm-amd64 -n datalens-enterprise rollback datalens-enterprise 11
    
  4. Заново запустите нужный релиз через ./init.sh.

Итоги

Вы узнали о типовых проблемах при работе с сервисом и способах их решения. Далее мы перечислим полезные команды, которые пригодятся при поддержке DataLens.

Предыдущая