Как установить агент JProfiler в контейнер Kubernetes?

#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"
  

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