Kubernetes 1.2刚刚发布,正在迅速为容器(Docker,Rocket,Hyper等)提供真实的集群管理解决方案。看看你是否还没有 - 这里有关于1.2版本的一些有趣的花絮:
- 现在,群集可以扩展到每个群集30,000个容器
- 正常关闭节点,转换到集群中的其他运行节点
- 自定义指标作为自动缩放的基础
- 动态配置管理
当您在本地笔记本电脑上开发微服务时,您可以使用类似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中的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应用程序!