#kubernetes #jprofiler
#kubernetes #jprofiler
Вопрос:
Что мне нужно поместить в контейнер, чтобы запустить агент? Просто libjprofilerti.so само по себе это не работает, я понимаю
Could not find agent.jar. The agentpath parameter must point to
libjprofilerti.so in an unmodified JProfiler installation.
для меня это звучит как очевидная бессмыслица — неужели мне придется устанавливать более 137,5 МБ файлов, 99% из которых будут неактуальными, в каждый контейнер, в котором я хочу что-то профилировать?
-agentpath:/path/to/libjprofilerti.so=nowait
Комментарии:
1. Ммм… спасибо за ответы, ни один из которых не отвечает на мой вопрос. Возможно, мне следовало добавить, что я искал быстрый, простой и ненавязчивый способ развертывания JProfiler, т.Е. С минимумом взломов существующих файлов развертывания K8s и так далее. Я нашел один, но он включает в себя все 137,5 МБ, что я все еще считаю глупым и что было бы непрактично на встроенных устройствах, у которых не так много места для хранения, так что на самом деле где-то должен быть ответ на мой первоначальный вопрос!
Ответ №1:
Подход заключается в использовании контейнера инициализации.
Идея состоит в том, чтобы создать образ для JProfiler отдельно от образа приложения. Используйте образ JProfiler для контейнера инициализации; Контейнер инициализации копирует установку JProfiler на том, который является общим для этого контейнера инициализации и других контейнеров, которые будут запущены в модуле. Таким образом, JVM может ссылаться во время запуска на агент JProfiler из общего тома.
Это выглядит примерно так (подробнее в этой статье блога):
- Определите новый том:
volumes:
- name: jprofiler
emptyDir: {}
- Добавьте контейнер инициализации:
initContainers:
- name: jprofiler-init
image: <JPROFILER_IMAGE:TAG>
command: ["/bin/sh", "-c", "cp -R /jprofiler/ /tmp/"]
volumeMounts:
- name: jprofiler
mountPath: "/tmp/jprofiler"
Замените /jprofiler/
выше правильным путем к каталогу установки в образе JProfiler. Обратите внимание, что команда copy создаст /tmp/jprofiler
каталог, в котором будет выполняться установка JProfiler, который используется в качестве пути монтирования.
- Определить монтирование тома:
volumeMounts:
- name: jprofiler
mountPath: /jprofiler
- Добавьте в аргументы запуска JVM JProfiler в качестве агента:
-agentpath:/jprofiler/bin/linux-x64/libjprofilerti.so=port=8849
Обратите внимание, что нет аргумента «nowait». Это приведет к блокировке JVM при запуске и ожиданию подключения графического интерфейса JProfiler. Причина в том, что при такой конфигурации агент профилирования получит свои настройки профилирования из графического интерфейса JProfiler.
Измените развертывание приложения, чтобы оно начиналось только с одной реплики. В качестве альтернативы, начните с нулевых реплик и масштабируйте до единицы, когда будете готовы начать профилирование.
Для подключения из графического интерфейса JProfiler к удаленной JVM:
- Узнайте имя модуля (например
kubectl -n <namespace> get pods
) и настройте переадресацию портов на него:
kubectl -n <namespace> <pod-name> port-forward 8849:8849
- Запустите JProfiler локально и укажите его на 127.0.0.1, порт 8849.
Измените локальный порт 8849 (номер слева :
), если он недоступен; затем укажите JProfiler на этот другой порт.
Ответ №2:
Похоже, вам здесь не хватает общей концепции.
В официальной документации хорошо объяснено, почему использовать контейнеры.
Новый способ заключается в развертывании контейнеров на основе виртуализации на уровне операционной системы, а не аппаратной виртуализации. Эти контейнеры изолированы друг от друга и от хоста: у них свои собственные файловые системы, они не могут видеть процессы друг друга, и использование их вычислительных ресурсов может быть ограничено. Их проще создавать, чем виртуальные машины, и поскольку они не связаны с базовой инфраструктурой и файловой системой хоста, они переносимы в облаках и дистрибутивах ОС.
Конечно, вам не нужно устанавливать библиотеки на каждый контейнер отдельно.
Kubernetes использует тома для обмена файлами между контейнерами. Таким образом, вы можете создать локальный тип тома с библиотеками JProfiles внутри.
local
Том представляет смонтированное локальное запоминающее устройство, такое как диск, раздел или каталог.
Вы также должны иметь в виду, что если вы разделяете объем между модулями, эти модули не будут знать о подключенных библиотеках JProfiles. Вам нужно будет настроить Pod
правильные переменные / файлы среды с помощью секретов или конфигурационных карт.
Вы можете настроить свой Pod
для извлечения значений из секретного:
apiVersion: v1
kind: Pod
metadata:
labels:
context: docker-k8s-lab
name: jp-pod
name: jp-pod
spec:
containers:
- image: k8s.gcr.io/busybox
name: jp
envFrom:
secretRef:
name: jp-secret
jp-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: jp-secret
type: Opaque
data:
JPAGENT_PATH="-agentpath:/usr/local/jprofiler10/bin/linux-x64/libjprofilerti.so=nowait"
Надеюсь, это вам поможет.