如何在Kubernetes容器中安装JProfiler代理?

时间:2019-04-12 08:45:23

标签: kubernetes jprofiler

我必须将什么放入容器中才能运行代理?只是libjprofilerti.so本身不起作用,我明白了

Could not find agent.jar. The agentpath parameter must point to
libjprofilerti.so in an unmodified JProfiler installation. 

在我看来,这显然是胡说八道-我肯定不必在每个要配置某些内容的容器中安装超过137.5 MB的文件,其中99%无关紧要?

-agentpath:/path/to/libjprofilerti.so=nowait

2 个答案:

答案 0 :(得分:1)

好像您在这里缺少一般概念。

why to use containers中对official documentation进行了很好的解释。

  

新方法是基于操作系统级虚拟化而不是硬件虚拟化来部署容器。这些容器彼此之间以及与主机之间是相互隔离的:它们具有自己的文件系统,看不到彼此的进程,并且可以限制其计算资源的使用。它们比虚拟机更容易构建,并且由于它们与基础架构和主机文件系统分离,因此可以跨云和OS分发进行移植。

当然,您不需要在每个容器上分别安装库。

Kubernetes使用Volumes在容器之间共享文件。 因此,您可以创建一个内部包含JProfiles库的local type of Volume

  

local卷代表已安装的本地存储设备,例如磁盘,分区或目录。

您还需要记住,如果您在Pod之间共享卷,则这些Pod将不知道附加的JProfiles库。您将需要通过使用SecretsConfigMapsPod配置正确的环境变量/文件。

您可以配置Pod来从Secret中获取值:

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"

希望对您有帮助。

答案 1 :(得分:0)

一种方法是使用Init Container

这个想法是让JProfiler的图像与应用程序的图像分开。将JProfiler映像用于Init容器; init容器会将JProfiler安装复制到该init容器与将在Pod中启动的其他Container之间共享的卷中。这样,JVM可以在启动时从共享卷中引用JProfiler代理。

它是这样的(更多详细信息在blog article中):

  • 定义新卷:
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/。请注意,复制命令将创建用于安装JProfiler的/tmp/jprofiler目录-用作安装路径。

  • 定义卷安装:
volumeMounts:
  - name: jprofiler
    mountPath: /jprofiler
  • 作为代理添加到JVM启动参数JProfiler:
-agentpath:/jprofiler/bin/linux-x64/libjprofilerti.so=port=8849

请注意,没有“ nowait”参数。这将导致JVM在启动时阻塞并等待JProfiler GUI连接。原因是通过此配置,性能分析代理将从JProfiler GUI接收其性能分析设置。

将应用程序部署更改为仅从一个副本开始。或者,从零个副本开始,并在准备开始进行性能分析时缩放到一个。

要从JProfiler的GUI连接到远程JVM:

  • 找出容器的名称(例如kubectl -n <namespace> get pods)并设置向其转发的端口:
kubectl -n <namespace> <pod-name> port-forward 8849:8849
  • 在本地启动JProfiler,并将其指向127.0.0.1,端口8849。

如果不可用,请更改本地端口8849(:左侧的数字);然后,将JProfiler指向该不同的端口。