Kubernetes 1.2刚刚发布,并且正在Swift成为容器(Docker,Rocket,Hyper等)的事实上的集群管理解决方案。 如果还没有,请检查一下-有关1.2版本的一些有趣的花絮:
- 集群现在可以扩展到每个集群30,000个容器
- 正常关闭节点,过渡到集群中其他正在运行的节点
- 自定义定义的指标作为自动缩放的基础
- 动态配置管理
在本地笔记本电脑上开发微服务时,可以使用Kubernetes之类的东西在本地运行docker容器,并在部署应用程序时获得开发人员/质量保证/生产方面的相似之处。 例如,您获得了进程隔离,端口空间隔离,网络/存储等,因此在本地开发人员笔记本电脑上不会发生冲突。
对于Java开发人员来说,一件事是如何查看日志,进行远程调试以及获取堆栈跟踪。
这里有一些提示:
拖曳您的吊舱的日志
在某些群集管理系统上,您必须基本上查找应用程序的本地IP(如果在容器中运行),以某种方式将其ssh,然后找到日志并将其结尾。 使用Kubernetes,您无需执行任何操作。 无论您在哪台机器上运行(即运行kubernetes客户端的位置),都可以执行以下操作:
列出集群中的Pod
ceposta@postamac(~) $ kubectl get pod
NAME READY STATUS RESTARTS AGE
broker-amq-1-hjbeh 1/1 Running 1 15h
file-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调试的方法。 例如,对于HawtApp Maven插件 ,它是一个简单的mvn插件,它将Java Main分配为可执行文件,并且是一个简单,灵活的bootstrap bin/run.sh脚本(或Windows的批处理文件) ,允许您通过以下方式控制类路径和调试:环境变量 。
Bootstrap Java应用程序能够公开远程调试端口
例:
# Set debug options if required
if [ 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容器中定义调试端口
现在您需要通过Kubernetes清单(json / yaml)文件在Docker容器中公开端口5005
(在此示例中):
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)。 引导脚本(上述)将检查该env变量,您可以通过kube清单(现在可以在Kube 1.2中使用ConfigMap或OpenShift模板 )对其进行控制。
最后一步是将调试端口代理到本地计算机。 如果您在本地运行kubectl
客户端,这很容易:
列出集群中的Pod
ceposta@postamac(~) $ kubectl get pod
NAME READY STATUS RESTARTS AGE
broker-amq-1-hjbeh 1/1 Running 1 15h
file-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://www.javacodegeeks.com/2016/03/java-remote-debug-applications-running-kubernetes.html