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

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

Java 远程执行Flink java开启远程调试_运维

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

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

以下是一些提示:



你的豆荚的拖尾日志

在某些集群管理系统上,您必须基本上查找应用程序的本地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分配为可执行文件,以及一个简单,灵活的引导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容器中定义调试端口

现在,您需要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中的ConfigMapOpenShift模板)。

最后一步是将调试端口代理到本地计算机。如果您在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应用程序!