Перейти к основному контенту

Компонент Panda в JumpServer: применение и тестирование производительности

Введение

До появления компонента Panda публикация удалённых приложений в JumpServer зависела от функции удалённого рабочего стола Windows. Однако из-за требований отдельных заказчиков и ограничений среды импортозамещённых ИТ-технологий («Синьчуан») использовать Windows в качестве сервера публикации удалённых приложений было невозможно.

Для решения этой проблемы был создан компонент Panda. Он предоставляет сервис виртуальных приложений на базе Linux, реализованный с помощью технологии контейнеризации. Принцип работы состоит в том, что сервер публикации приложений, работающий под управлением Linux, с помощью контейнеров изолирует приложения и их зависимости в отдельной среде выполнения. Через компонент Panda, предоставляемый JumpServer, осуществляется диспетчеризация и управление виртуальными приложениями.

Благодаря компоненту Panda заказчики могут выполнять требования среды «Синьчуан» и использовать Linux в качестве сервера публикации удалённых приложений. Это позволяет в полной мере задействовать технологию контейнеризации Panda для эффективной диспетчеризации и управления виртуальными приложениями. Такой способ публикации приложений на базе Linux предоставляет заказчикам более гибкое и масштабируемое решение.

II. Встроенная схема Panda

Встроенная схема означает, что сервер, на котором развёрнут JumpServer, сам используется в качестве сервера публикации виртуальных приложений.

См. внутреннюю wiki: https://wiki.fit2cloud.com/pages/viewpage.action?pageId=143199769

III. Внешняя схема Panda

Внешняя схема означает дополнительное развёртывание отдельного сервера публикации виртуальных приложений, при котором компонент Panda и контейнеры приложений выносятся за пределы сервера, на котором развёрнут JumpServer.

См. внутреннюю wiki: https://wiki.fit2cloud.com/pages/viewpage.action?pageId=143199769

IV. Чек-лист диагностики и типичные ошибки

1. Чек-лист диагностики

  • После загрузки установочного пакета проверить, успешно ли развёрнуто виртуальное приложение (статусы: ошибка, в ожидании, успешно).
  • Просмотреть логи для поиска ошибок:
    cat /data/jumpserver/panda/data/logs/panda.log   # panda
    cat /data/jumpserver/lion/data/logs/lion.log     # lion
  • Проверить, успешно ли Panda зарегистрировался в компоненте JumpServer Core (отображается ли внешний компонент Panda в разделе «Системные настройки → Управление компонентами»), сверить совпадение BOOTSTRAP_TOKEN.
  • Проверить состояние работоспособности компонентов.
  • Проверить корректность конфигурационных файлов (см. шаги установки).
  • Проверить нормальное взаимодействие между компонентами Lion и Panda.
  • Проверить, не занижена ли конфигурация машины — рекомендуется не менее 4 CPU / 8 ГБ ОЗУ.
  • Проверить, не конфликтует ли диапазон портов контейнеров приложений с другими сервисами.

2. Типичные ошибки

1) Ошибка тайм-аута API

Причина: не удаётся корректно загрузить образ приложения. Необходимо сменить зеркало Docker-образов либо заранее загрузить образ вручную.

Решение:

# 2024.6.18
sudo tee /etc/docker/daemon.json <<EOF
{
  "data-root": "/var/lib/docker",
  "live-restore": true,
  "log-driver": "json-file",
  "log-opts": {
    "max-file": "3",
    "max-size": "10m"
  },
  "registry-mirrors": [
    "https://hub.uuuadc.top",
    "https://docker.anyhub.us.kg",
    "https://dockerhub.jobcher.com",
    "https://dockerhub.icu",
    "https://docker.ckyl.me",
    "https://docker.awsl9527.cn"]
}
EOF

# перезапуск docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# загрузка образов
docker pull 2970298425/docker-chrome-app:v0.1.0
docker pull 2970298425/docker-dbeaver-app:v0.1.0

# сохранение образов в архив
docker save -o docker-chrome-app.tar 2970298425/docker-chrome-app:v0.1.0
docker save -o docker-dbeaver.tar 2970298425/docker-dbeaver-app:v0.1.0

2) Отказ в доступе на порту 9001

Причина: ошибка связи (коммуникации между компонентами).

Решение: изменить конфигурационный файл в соответствии со своей средой, убедиться, что соответствующие порты открыты:

PANDA_ENABLED=1
VIRTUAL_APP_ENABLED=1
PANDA_HOST_IP=10.1.12.20
PANDA_HOST=http://panda:9001

3) Проблема избыточного размера кэша

После выполнения установки и развёртывания часто обнаруживается, что buff/cache занимает слишком много памяти, что серьёзно снижает производительность сервера публикации. Поэтому после завершения инициализации кэш следует очистить:

sync
echo 3 > /proc/sys/vm/drop_caches

IV. Тестирование сценария применения Chrome

Примечание: нумерация раздела приведена в соответствии с оригиналом документа (повтор номера «IV» присутствует в исходном тексте).

1. Потребление ресурсов

Тестирование показало, что сам контейнер Panda потребляет очень мало ресурсов. Однако при использовании контейнера Chrome, созданного Panda, для доступа к веб-активам и выполнения операций в рамках одной страницы, потребление памяти обычно составляет около 300 МБ, а в сценарии с видео — около 500 МБ на страницу. По сравнению с производительностью CPU, узким местом раньше становится производительность памяти. На машине с конфигурацией 4 CPU / 8 ГБ ОЗУ можно стабильно запускать около 18 контейнеров Chrome для предоставления сервиса удалённых приложений Chrome с одной страницей. Хотя тестовый опыт можно оценить как средний, пользователи в процессе работы могут управлять приложением относительно плавно.

2. Функциональное тестирование в сравнении с сервером публикации удалённых приложений

Функция Виртуальное приложение Сервер публикации удалённых приложений
Скорость запуска Быстрая Средняя
Плавность работы с Web Средняя Плавная
Совместимость с системами Высокая, поддерживает большинство систем Linux Средняя, рекомендуется Windows Server 2019
Автозаполнение Web-форм В норме В норме
Копирование/вставка (буфер обмена) Не поддерживается, возможны искажение символов и подвисания Поддерживается (https, буфер обмена)
Управление файлами Не поддерживается Поддерживается
Тестирование потокового видео Потоковое видео сильно подвисает Плавно

По результатам тестирования, показатели работы с веб-активами близки к показателям сервера публикации удалённых приложений, базовые функции реализованы. Однако если пользователю требуется скачивание/загрузка файлов, копирование/вставка и подобные операции на веб-активах, виртуальное приложение реализовать их не может. Поэтому рекомендуется заранее информировать заказчиков об ограничениях функциональности перед использованием виртуальных приложений — часть веб-активов не удаётся качественно взять под управление.

Рекомендуемые на данный момент сценарии применения виртуальных приложений: интерфейсы управления сетевым оборудованием, административные панели систем виртуализации (vCenter, PVE) и т. п.

Сценарии, требующие дальнейшей оптимизации: страницы просмотра видео (например, видеонаблюдения), страницы систем управления, связанные с импортом/экспортом файлов, и т. п.

V. Тестирование сценария применения DBeaver

1. Потребление ресурсов

Тестирование показало, что обычный контейнер со статической веб-страницей потребляет около 450 МБ памяти; на машине 4 CPU / 8 ГБ ОЗУ можно стабильно запускать примерно 10–12 контейнеров для предоставления сервиса удалённого приложения DBeaver. Тестовый опыт оценивается как слабый — пользователям сложно нормально работать с приложением.

2. Функциональное тестирование в сравнении с сервером публикации удалённых приложений

Функция Виртуальное приложение Сервер публикации удалённых приложений
Скорость запуска Быстрая Средняя
Плавность работы DBeaver Подвисания Плавно
Совместимость с системами Высокая, поддерживает большинство систем Linux Средняя, рекомендуется Windows Server 2019
Автозаполнение логина/пароля В норме В норме
Копирование/вставка Не поддерживается, возможны искажение символов и подвисания Поддерживается (https, буфер обмена)
Управление файлами Не поддерживается Поддерживается

Из-за отсутствия поддержки функций копирования/вставки и загрузки файлов пользователи не могут выполнять через виртуальное приложение важные операции с базой данных в DBeaver, такие как импорт/экспорт SQL-файлов. Кроме того, по результатам тестирования плавность работы DBeaver в виртуальном приложении значительно уступает версии DBeaver на сервере публикации удалённых приложений. Поэтому текущую версию виртуального приложения для подключения к активам баз данных заказчикам рекомендовать не стоит — необходимо дождаться обновлений в последующих версиях.

VI. Рекомендации по конфигурации

Тестовая машина: CentOS 7.9, конфигурация 4 CPU / 8 ГБ ОЗУ и 4 CPU / 16 ГБ ОЗУ, Intel(R) Xeon(R) Gold 5117 CPU @ 2.00GHz.

Способ установки Конфигурация Приложение Макс. одновременная нагрузка Рекомендуемая макс. нагрузка
Встроенная Panda 4C8G Chrome (одна страница) 8 5
Встроенная Panda 4C16G Chrome (одна страница) 30 24
Внешняя Panda 4C8G Chrome (одна страница) 20 16
Встроенная Panda 4C8G DBeaver 8 5
Встроенная Panda 4C16G DBeaver 16 12
Внешняя Panda 4C8G DBeaver 16 12

Примечание: рекомендации приведены исходя из целевого уровня загрузки памяти 80%, при этом остальные компоненты среды во время тестирования находились под низкой нагрузкой.

VII. Настройка пользовательского виртуального приложения — на примере Sql Developer 23

По сути, виртуальное приложение — это Linux-контейнер, который транслирует графический интерфейс приложения через VNC для использования пользователем. Компонент Panda передаёт информацию для подключения к учётной записи актива в переменные окружения контейнера приложения в виде JMS_TOKEN — для использования функцией автозаполнения. Поэтому достаточно написать образ приложения по аналогии с примером сборки, представленным на https://github.com/wojiushixiaobai/docker-dbeaver-app. Далее в качестве примера будет описано создание образа виртуального приложения для Sql Developer 23.

Структура каталогов проекта

Sql Developer
│  docker-compose.yml
│  Dockerfile
│  entrypoint.sh                                    # входной файл (entrypoint)
│  sqldeveloper-23.1.1.345.2114-no-jre.zip           # установочный пакет sqldeveloper
├─.config
│  └─dconf
│     user
├─app
│  └─bin
│     start-vnc.sh                                  # скрипт запуска VNC
│     start-xvfb.sh                                 # скрипт запуска XVFB
└─etc
   └─supervisor
      app.conf                                      # конфигурационный файл Supervisor

1. Сборка образа контейнера

Среда выполнения контейнера собирается с помощью Dockerfile и docker-compose.yml:

docker-compose.yml:

services:
  sql_developer:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: sql_developer_test
    ports:
      - "6800:5900"
    restart: always

Dockerfile:

FROM python:3.11-slim-bullseye
# базовый образ python3 на Debian

ARG TARGETARCH
ARG DEPENDENCIES=" \
    ca-certificates \
    dbus-x11 \
    fonts-wqy-microhei \
    gnupg2 \
    ibus \
    ibus-gtk \
    ibus-gtk3 \
    ibus-pinyin \
    iso-codes \
    libffi-dev \
    libgbm-dev \
    libnss3 \
    libssl-dev \
    locales \
    netcat-openbsd \
    pulseaudio \
    supervisor \
    unzip \
    file \
    wget \
    x11vnc \
    xauth \
    xdg-user-dirs \
    xvfb"

# зеркало APT
ARG APT_MIRROR=http://mirrors.ustc.edu.cn

RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=app-apt \
    --mount=type=cache,target=/var/lib/apt,sharing=locked,id=app-apt \
    sed -i "s@http://.*.debian.org@${APT_MIRROR}@g" /etc/apt/sources.list \
    && rm -f /etc/apt/apt.conf.d/docker-clean \
    && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && apt-get update \
    && apt-get install -y --no-install-recommends ${DEPENDENCIES} \
    && echo "no" | dpkg-reconfigure dash \
    && echo "zh_CN.UTF-8" | dpkg-reconfigure locales \
    && sed -i "s@# export @export @g" ~/.bashrc \
    && sed -i "s@# alias @alias @g" ~/.bashrc \
    && chmod +x /dev/shm \
    && mkdir -p /tmp/.X11-unix && chmod 1777 /tmp/.X11-unix

RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=app-apt \
    --mount=type=cache,target=/var/lib/apt,sharing=locked,id=app-apt \
    set -ex \
    && apt-get update \
    && apt-get install -y --no-install-recommends openjdk-11-jdk
# используется openjdk-11-jdk вместо Oracle JDK

WORKDIR /opt
# копирование установочного пакета Sql Developer в /opt
COPY sqldeveloper-23.1.1.345.2114-no-jre.zip /opt
RUN unzip sqldeveloper-23.1.1.345.2114-no-jre.zip \
    && chmod 2777 /opt/sqldeveloper \
    && rm -rf sqldeveloper-23.1.1.345.2114-no-jre.zip

# версия Sql Developer
ARG SQL_DEVELOPER_VERSION=23.1.1
RUN --mount=type=cache,target=/root/.cache \
    set -ex \
    && python3 -m venv /opt/py3 \
    && . /opt/py3/bin/activate
# создание виртуального окружения Python

ENV PATH=/opt/py3/bin:$PATH \
    GTK_IM_MODULE="ibus" \
    XMODIFIERS="@im=ibus" \
    QT_IM_MODULE="ibus"

COPY app /opt/app
COPY etc/supervisor/app.conf /etc/supervisor/conf.d/app.conf
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod u+x /usr/local/bin/entrypoint.sh
COPY .config/dconf /root/.config/dconf

RUN LANG=zh_CN.UTF-8 xdg-user-dirs-update --force

# запуск Supervisor, который поднимает VNC и XVFB
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]

2. Настройка установочного пакета

Внутри установочного пакета настраиваются значок приложения (icon.png) и файл манифеста (manifest.yml), которые указывают компоненту Panda, как развернуть виртуальное приложение.

manifest.yml:

name: Sql_Developer_23
display_name: "{{ 'Sql Developer' | trans }}"
comment: "{{ 'SQL Developer is a powerful integrated development environment (IDE) for working with Oracle
databases.' | trans }}"
version: 0.1
author: JumpServer Team
type: panda
image_name: nickyang00/app_sqldeveloper_vapp:v0.1.0
image_protocol: vnc
image_port: 5900
tags:
  - database        # тег
protocols:
  - oracle
i18n:
  Sql Developer:
    en: Sql Developer
    zh: Sql Developer
    jp: Sql Developer
  SQL Developer is a powerful integrated development environment (IDE) for working with Oracle databases.:
    en: SQL Developer is a powerful integrated development environment (IDE) for working with Oracle databases.
    zh: SQL Developer 是一款用于 Oracle 数据库开发的强大 IDE
    jp: SQL Developer は Oracle データベース開発のための強力な IDE です

3. Запуск виртуального приложения

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

Результат показан на рисунке ниже:

Sql Developer, запущенный как виртуальное приложение

Ссылка на образ: nickyang00/app_sqldeveloper_vapp:v0.1.0

Схема автозаполнения учётных данных (代填方案) пока находится в стадии проработки.

JumpServer — Panda · перевод внутреннего технического документа