Как установить агент JProfiler в контейнере Kubernetes? - PullRequest
1 голос
/ 12 апреля 2019

Что я должен положить в контейнер, чтобы агент запустился?Просто 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

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Подход заключается в использовании Init Container .

Идея состоит в том, чтобы иметь изображение для JProfiler отдельно от изображения приложения.Используйте изображение JProfiler для контейнера Init;Контейнер Init копирует установку JProfiler в том, совместно используемый этим Контейнером Init и другими контейнерами, которые будут запущены в модуле.Таким образом, 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 на этот другой порт.

1 голос
/ 12 апреля 2019

Похоже, вам не хватает общей концепции здесь.

Это хорошо объяснено зачем использовать контейнеры в официальной документации .

Новый способ заключается в развертывании контейнеров на основе виртуализации на уровне операционной системы, а не аппаратной виртуализации.Эти контейнеры изолированы друг от друга и от хоста: у них есть свои собственные файловые системы, они не могут видеть процессы друг друга, и их использование вычислительных ресурсов может быть ограничено.Их легче создавать, чем виртуальные машины, и поскольку они не связаны с базовой инфраструктурой и файловой системой хоста, они переносимы между облаками и дистрибутивами ОС.

Конечно, вам не нужно устанавливатьбиблиотеки на каждом контейнере отдельно.

Kubernetes использует Тома для обмена файлами между контейнерами.Таким образом, вы можете создать локальный тип тома с библиотеками JProfiles внутри.

Том local представляет собой подключенное локальное устройство хранения, такое как диск, раздел или каталог.

Вам также нужно помнить, что если вы поделитесь томом между модулями, эти модули не будут знать о присоединяемых библиотеках JProfiles.Вам нужно будет настроить Pod с правильными переменными / файлами среды, используя Secrets или ConfigMaps .

Вы можете настроить 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"

Надеюсь, это поможет вам.

...