博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Kubernetes中运行的应用程序的Java远程调试
阅读量:5830 次
发布时间:2019-06-18

本文共 2739 字,大约阅读时间需要 9 分钟。

hot3.png

,正在迅速为容器(Docker,Rocket,Hyper等)提供真实的集群管理解决方案。看看你是否还没有 - 这里有关于1.2版本的一些有趣的花絮:

  • 现在,群集可以扩展到每个群集30,000个容器
  • 正常关闭节点,转换到集群中的其他运行节点
  • 自定义指标作为自动缩放的基础
  • 动态配置管理

KUBE

当您在本地笔记本电脑上开发微服务时,您可以使用类似Kubernetes的东西在本地运行docker容器,并在部署应用程序时获得开发人员/ QA /生产相似性。例如,您可以获得进程隔离,端口空间隔离,网络/存储等,因此不会在本地开发人员笔记本电脑上发生冲突。

Java Developers出现的一件事是如何查看日志,进行远程调试以及获取堆栈跟踪。

以下是一些提示:

你的豆荚的拖尾日志

在某些集群管理系统上,您必须基本上查找应用程序的本地IP(如果在容器中运行),以某种方式ssh进入它,然后查找日志并将其拖尾。使用Kubernetes,您无需执行任何操作。无论您运行的是哪台计算机(即运行kubernetes客户端的位置),您都可以执行以下操作:

列出群集中的pod

ceposta@postamac(~) $ kubectl get podNAME                        READY     STATUS    RESTARTS   AGEbroker-amq-1-hjbeh          1/1       Running   1          15hfile-ingress-events-3artj   1/1       Running   1          13h

记录日志

现在选择要从中流式传输日志的pod并继续!

ceposta@postamac(~) $ kubectl logs -f file-ingress-events-3artj

如果必须,请通过Shell连接

如果你由于某种原因必须登录pod(浏览文件系统,浏览其他配置文件等):

ceposta@postamac(~) $ kubectl exec -it file-ingress-events-3artj bash

JVM远程调试您的应用程序

这对于确切了解应用程序中发生的情况非常方便。要做到这一点,你并没有真正做与今天不同的事情。引导JVM时,您应该有办法启用JVM调试。例如,对于,它是一个简单的mvn插件,它将Java Main分配为可执行文件,以及一个简单,灵活的引导bin/run.sh脚本(或Windows的批处理文件)。

Bootstrap Java应用程序能够公开远程调试端口

例:

# Set debug options if requiredif [ x"${
JAVA_ENABLE_DEBUG}" != x ] && [ "${
JAVA_ENABLE_DEBUG}" != "false" ]; then java_debug_args="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${
JAVA_DEBUG_PORT:-5005}"fi

通过kubernetes清单在docker容器中定义调试端口

现在,您需要5005通过Kubernetes清单(json / yaml)文件在Docker容器中公开端口(在此示例中):

spec:        containers:        - args: []          command: []          env:          - name: "JAVA_ENABLE_DEBUG"            value: "true"          - name: "OUTGOING_FILE_PATH"            value: "/deployments/camel/outgoing"          - name: "INCOMING_FILE_PATH"            value: "/deployments/camel/incoming"          - name: "KUBERNETES_NAMESPACE"            valueFrom:              fieldRef:                fieldPath: "metadata.namespace"          image: "fabric8/file-ingress-events:1.0-SNAPSHOT"          name: "file-ingress-events"          ports:          - containerPort: 5005            name: "jvm-debug"          - containerPort: 8778            name: "jolokia"

注意,我们还在kubernetes清单文件中添加了一个env变量,以便能够控制是否要打开或关闭远程调试(true / false)。bootstrap脚本(上面)将检查env变量,你可以通过kube清单控制它(现在使用Kube 1.2中的或)。

最后一步是将调试端口代理到本地计算机。如果您在kubectl本地运行客户端,这很容易:

列出群集中的pod

ceposta@postamac(~) $ kubectl get podNAME                        READY     STATUS    RESTARTS   AGEbroker-amq-1-hjbeh          1/1       Running   1          15hfile-ingress-events-3artj   1/1       Running   1          13h

将pod代理到特定端口

ceposta@postamac(~) $ kubectl port-forward file-ingress-events-3artj  5005:5005

以上将从您的本地环境(5005)移植到pod的端口5005.现在您可以将远程调试器连接到localhost:5005

希望这可以帮助您调试Java应用程序!

转载于:https://my.oschina.net/xiaominmin/blog/3009364

你可能感兴趣的文章
【原】IOS中KVO模式的解析与应用
查看>>
理解 QEMU/KVM 和 Ceph(3):存储卷挂接和设备名称
查看>>
[MFC] CList
查看>>
[Android Pro] 完美Android Cursor使用例子(Android数据库操作)
查看>>
c++中sizeof的分析
查看>>
线程间操作无效: 从不是创建控件的线程访问它的解决方法
查看>>
hdu 1236 排名
查看>>
PHP面向对象深入研究之【继承】,减少代码重复
查看>>
此博客不再发表对自己私事的看法
查看>>
导致Asp.Net站点重启的10个原因
查看>>
【PMP】Head First PMP 学习笔记 第一章 引言
查看>>
抓住云机遇编排工作 搞定复杂IT工作流
查看>>
MYSQL的longtext字段能放多少数据?
查看>>
MTK 平台上如何给 camera 添加一种 preview size
查看>>
云计算最大难处
查看>>
关于数据分析思路的4点心得
查看>>
Memcached安装与配置
查看>>
美团数据仓库的演进
查看>>
SAP被评为“大数据”预测分析领军企业
查看>>
联想企业网盘张跃华:让文件创造业务价值
查看>>