Kubernetes 1.2刚刚发布,并且正在Swift成为容器(Docker,Rocket,Hyper等)的事实上的集群管理解决方案。 如果还没有,请检查一下-有关1.2版本的一些有趣的花絮: java 远程调试 jvm参数 java开启远程调试_java

  • 集群现在可以扩展到每个集群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