我必须将什么放入容器中才能运行代理?只是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
答案 0 :(得分:1)
好像您在这里缺少一般概念。
在why to use containers中对official documentation进行了很好的解释。
新方法是基于操作系统级虚拟化而不是硬件虚拟化来部署容器。这些容器彼此之间以及与主机之间是相互隔离的:它们具有自己的文件系统,看不到彼此的进程,并且可以限制其计算资源的使用。它们比虚拟机更容易构建,并且由于它们与基础架构和主机文件系统分离,因此可以跨云和OS分发进行移植。
当然,您不需要在每个容器上分别安装库。
Kubernetes使用Volumes在容器之间共享文件。 因此,您可以创建一个内部包含JProfiles库的local type of Volume。
local
卷代表已安装的本地存储设备,例如磁盘,分区或目录。
您还需要记住,如果您在Pod之间共享卷,则这些Pod将不知道附加的JProfiles库。您将需要通过使用Secrets或ConfigMaps为Pod
配置正确的环境变量/文件。
您可以配置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
-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
如果不可用,请更改本地端口8849(:
左侧的数字);然后,将JProfiler指向该不同的端口。