冷知识!如何远程调试在K8S POD中的Java应用程序!

简介: 冷知识!如何远程调试在K8S POD中的Java应用程序!

前言

现在越来越多的公司选择利用 Kubernetes 来部署和管理 java 应用,那镜像。

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>3.2.1</version>
    <configuration>
        <from>
            <image>openjdk:17</image>
        </from>
        <to>
            <image>ghcr.io/amrutprabhu/${project.name}:${project.version}</image>
        </to>
    </configuration>
    <executions>
        <execution>
            <phase>verify</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
</plugin>

当然,还有其它插件也可以用于创建 docker 镜像。

现在当我们运行mvn clean verify, 这个 docker 镜像会被构建出来,并推送到 github 仓库中。

部署 docker 镜像到 Kubernetes

此时需要有一个 Kubernetes 集群来部署我们的应用程序。如果没有现成的,那我们可以使用 https://k3s.io 在本地运行一个轻量级 Kubernetes 集群。

我们将使用此 K3s 集群来部署我们的应用程序。

为了部署我们的应用程序,我们将创建一个包含部署定义的简单 helm 清单,如下所示。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: application-deployment
spec:
  selector:
    matchLabels:
      app: application
  template:
    metadata:
      labels:
        app: application
    spec:
      containers:
        - image: ghcr.io/amrutprabhu/remote-application:1.0.0-SNAPSHOT
          imagePullPolicy: Always
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            - name: debug-port
              containerPort: 5005
              protocol: TCP
          env:
            - name: JAVA_TOOL_OPTIONS
              value: '-Xdebug -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:5005,server=y,suspend=n'

对我们来说,最重要的是在部署中设置的环境变量JAVA_TOOL_OPTIONS

由于我们使用的是 OpenJDK 映像,JVM 将选取此value环境变量以允许将调试器附加到端口 5005 .

现在可以使用 helm install <location of the helm chart> 命令来部署应用程序。

部署应用程序后,需要将 5005 端口进行转发以附加我们的调试器。

kubectl port-forward <your pod name> 5005:5005

同样,我们转发端口 8080 以调用我们的 REST 接口。

使用 Intellij 附加远程调试器

要附加调试器,请转到 IDEA 右上角的运行部分并添加远程 JVM 调试运行配置。



如图所见,上面显示的命令行参数与我们指定为部署文件中的环境变量的值相同。

现在可以运行配置,调试器将被附加到对应应用。


使用 VSCode 附加远程调试器

要使用 VScode 附加远程调试器,我们需要添加启动配置,如下所示

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "java",
      "name": "Remote debugging RemoteApplication", // name for you your configuration
      "request": "attach",
      "hostName": "localhost",
      "projectName": "remote-application", //  your java project
      "port": "5005" // port to attach to
    }
  ]
}

要添加此启动配置,请转到左侧栏上的“运行和调试”,然后单击顶部的齿轮图标以打开launch.json

完成此操作后,启动配置,调试器将被附加。添加断点并在终结点上发送请求,以便调试器暂停执行,如下所示。


小结

本文介绍了如何打包 springboot docker 镜像,如何部署到 k8s 集群中, 以及如何通过 idea 或者 vscode 远程调试 k8s 集群中的 java 应用程序。后续会针对 docker 和 k8s 进行更深入的介绍。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
人工智能 算法 Java
Java与AI驱动区块链:构建智能合约与去中心化AI应用
区块链技术和人工智能的融合正在开创去中心化智能应用的新纪元。本文深入探讨如何使用Java构建AI驱动的区块链应用,涵盖智能合约开发、去中心化AI模型训练与推理、数据隐私保护以及通证经济激励等核心主题。我们将完整展示从区块链基础集成、智能合约编写、AI模型上链到去中心化应用(DApp)开发的全流程,为构建下一代可信、透明的智能去中心化系统提供完整技术方案。
303 3
|
2月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
157 8
|
2月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
341 98
|
3月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
627 12
|
3月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
514 1
存储 jenkins 持续交付
570 2
|
3月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
|
4月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
152 2
|
4月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。

推荐镜像

更多