Компонент 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 это приложение можно будет выбрать.
Результат показан на рисунке ниже:

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