Kubernetes에서 Java 앱의 원격 디버깅

"It works on my machine ¯_(ツ)_/¯"- 이전 세대의 개발자들은 일상 생활에서 이 표현을 자주 사용했습니다. Docker와 Kubernetes에는 오늘날 이러한 문제를 해결하는 플랫폼이 있습니다.

그러나 그것에 대해 너무 기뻐하지 마십시오. 때로는 응용 프로그램이 로컬에서 구현되고 테스트된 작업을 수행하지 않는 경우가 있습니다. 숙련된 개발자라면 이런 경우 디버거를 켜겠지만 쿠버네티스 클러스터에서 그게 그렇게 쉬운가요? 예, 이 블로그 게시물에서 정확히 그 방법을 보여드리겠습니다!

단순함을 위해 이 게시물 전체에서 IntelliJ 개발 환경을 사용하지만 이것이 큰 제한은 아닙니다. 다른 개발 환경에서도 유사한 기능을 제공합니다.

개념



기본 아이디어는 Kubernetes 포드(Java 앱이 실행 중인)의 포트에서 디버깅을 활성화하는 것입니다. 이 포트는 포드에 의해 노출되어야 합니다.

그런 다음 Port Forwarding을 사용하여 로컬 포트를 포드의 열린 디버깅 포트로 전달해야 합니다. 마지막으로 전달된 로컬 포트를 사용하여 개발 환경에서 JVM 원격 디버깅을 시작해야 합니다. 다음 다이어그램은 Kubernetes 클러스터의 원격 디버깅 구조를 보여줍니다.


그림 1: Kubernetes 클러스터의 원격 디버깅 개념

0단계: IntelliJ에서 JVM 원격 디버깅 설정



첫 번째 단계는 IntelliJ에서 원격 디버깅을 설정하는 것입니다. 이렇게 하려면 Run Configurations에 대한 구성 창을 여십시오.


그림 2: 새로운 "원격 JVM 디버그"실행 구성


  • 왼쪽 상단 모서리에 있는 더하기 기호를 클릭하고 목록에서 Run Configuration를 선택하여 새 Remote JVM Debug를 만듭니다.
  • 그런 다음 구성에 원하는 이름을 지정할 수 있습니다.
  • 일반적으로 표준 구성은 조정할 필요가 없습니다. 기본 포트 5005가 애플리케이션의 다른 곳에서 사용되는 경우 구성에서 변경할 수 있습니다.

  • 이제 명령줄 인수를 복사합니다. 다음 단계에서 필요합니다.
  • 나중에 필요하므로 마지막으로 구성을 저장합니다.

  • 1단계: 원격 JVM에서 디버깅 활성화



    우리는 일반적으로 다음과 같은 Dockerfile로 빌드하는 Docker 이미지에 애플리케이션을 패키징합니다.

    FROM eclipse-temurin:17-alpine
    
    ARG ARTIFACT
    COPY $ARTIFACT app.jar
    
    ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app.jar"]
    

    $JAVA_OPTS 의 변수ENTRYPOINT가 중요합니다. 이것을 사용하여 이전에 복사한 명령줄 인수를 삽입합니다. Kubernetes에서 배포 리소스를 조정하여 이를 수행합니다. kubectl get deployments를 사용하여 배포 목록을 표시하고 kubectl edit deployment <DEPLOYMENT_NAME>를 사용하여 다음과 같이 배포를 조정할 수 있습니다.

    spec:
      containers:
        - ...
          env:
            - name: JAVA_OPTS
              value: <COPIED_JAVA_OPTS>
          ports:
            - name: remotedebugging
              containerPort: <PORT>
              protocol: TCP
          ...
    


  • <COPIED_JAVA_OPTS>를 IntelliJ에서 복사한 명령줄 인수로 바꿉니다.
  • <PORT>를 디버깅에 사용하는 포트로 바꾸십시오(이 경우에는 5005 ).

  • 이 작업을 완료한 후 편집기를 닫으면 Kubernetes가 새 배포를 시작합니다. kubectl get pods 명령으로 이를 확인할 수 있습니다. 새 포드가 생성되어야 합니다. 다음 단계에서 중요: 팟(Pod)의 이름을 복사하십시오!

    2단계: 포트 포워딩



    Pod가 다시 시작된 후 Pod의 디버깅 포트를 로컬 시스템으로 전달해야 합니다. 다음 명령을 사용하여 이 작업을 수행할 수 있습니다. kubectl port-forward <POD_NAME> <LOCAL_PORT>:<POD_PORT>
  • <POD_NAME>는 이전 단계에서 복사했어야 하는 포드의 이름입니다.
  • <LOCAL_PORT>는 포워딩을 위해 로컬로 사용되고 디버깅을 위해 개발 환경이 연결되는 포트로 교체해야 합니다.
  • <POD_PORT>는 이전 단계의 배포 구성에서 연 포트입니다.

  • 3단계: 행복한 디버깅!



    마지막으로 0단계에서 만든 디버깅 구성을 시작해야 하며 다음 메시지가 표시되어야 합니다. Listening for transport dt_socket at address: 5005 . 🎉

    이제 중단점을 설정하고 일부 버그를 찾을 수 있습니다!

    자원


  • Use Port Forwarding to Access Applications in a Cluster
  • Tutorial: Remote debug | IntelliJ IDEA



  • Michael Weidmann은 https://www.devlix.de/blog의 devlix 블로그에 글을 쓰고 있습니다.
    이 문서는 여기에 처음 게시되었습니다(독일어): https://www.devlix.de/remote-debugging-von-java-apps-in-kubernetes/


    devlix GmbH: 품질, 컨설팅, 개발

    좋은 웹페이지 즐겨찾기