Kubernetes 애플리케이션 디버깅

Cloud Code를 사용하면 skaffold debug를 활용하여 Kubernetes 클러스터에 배포된 애플리케이션을 쉽게 디버깅할 수 있습니다. Minikube 또는 Docker Desktop과 같은 로컬 클러스터, Google Kubernetes Engine 또는 다른 클라우드 제공업체에서 애플리케이션을 디버깅할 수 있습니다.

또한 Cloud Code는 디버깅을 지원하므로 포트 전달 설정 또는 언어 별 디버그 인수 삽입과 같은 수동 설정에 대해 걱정할 필요가 없습니다. skaffold.yaml 구성 파일과 cloudcode.kubernetes 실행 구성이 포함된 Cloud Code 지원 Kubernetes 애플리케이션만 있으면 됩니다.

애플리케이션 디버깅

  1. Cloud Code 상태 표시줄을 사용하여 Debug on Kubernetes 명령어를 선택합니다.
  2. 애플리케이션에 필요한 Skaffold 구성이나 cloudcode.kubernetes 실행 구성이 없으면 Cloud Code에서 설정을 도와줍니다.
  3. 현재의 Kubernetes 컨텍스트를 사용하여 앱을 실행할지 또는 선호하는 앱으로 전환할지 확인합니다.
  4. 선택한 컨텍스트가 원격 클러스터의 경우 이미지를 푸시할 이미지 레지스트리를 제공하라는 메시지가 표시됩니다.

    다음은 몇 가지 일반적인 레지스트리의 경우 컨테이너 이미지가 저장되는 위치를 지정하는 방법의 예입니다.

    Docker Hub Docker.io/{account}
    비공개 Docker Hub 저장소를 사용하는 경우 적절하게 인증되었는지 확인합니다.
    Google Container Repository (GCR) gcr.io/{project_id}

    Cloud Code는 이 이미지 레지스트리를 Kubernetes 매니페스트에 지정된 이미지 이름과 연결하여 최종 이미지 저장소 이름을 생성합니다.

    자세한 내용은 이미지 레지스트리 처리 가이드를 참조하세요.

    이 선택 사항은 cloudcode.kubernetes 실행 구성(.viscode/launch.json에 있음)에 저장됩니다.

  5. 그러면 Cloud Code가 컨테이너를 빌드하여 레지스트리로 푸시하고 Kubernetes 구성을 클러스터에 적용하여 롤아웃을 기다립니다.

  6. 출시가 완료되면 Cloud Code는 선언된 모든 컨테이너 포트를 자동으로 머신에 포트 전달하고 출력창에 URL을 표시하여 실시간 애플리케이션을 찾아 볼 수 있습니다.

    포트를 전달하고 출력창에 URL 표시

  7. 애플리케이션의 디버깅 가능한 컨테이너마다 디버깅하려는 프로그램이 있는 원격 컨테이너의 디렉터리를 확인하거나 입력하라는 메시지가 표시됩니다.

    또는 ESC를 눌러 컨테이너 디버깅을 건너뛸 수 있습니다.

    원격 루트 프롬프트

    Cloud Code는 애플리케이션에서 디버깅 가능한 각 컨테이너에 대한 디버그 세션을 연결합니다.

    이제 중단점 설정 및 단계별 코드 실행과 같이 로컬 코드를 디버깅할 때 일반적으로 하는 모든 작업을 수행할 수 있으며 실제 Kubernetes 클러스터에 대해 디버깅하는 이점도 추가되었습니다.

  8. 변수 및 스택 정보를 검사하려면 디버그 사이드바를 사용합니다. 디버깅 세션과 상호작용하려면 하단 창 디버거에 있는 디버그 콘솔을 사용합니다.

    중단점 및 변수에서 일시중지된 앱과 범위의 값으로 채워진 호출 스택 섹션

  9. 세션이 완료되면 Cloud Code 상태 표시줄을 통해 애플리케이션 및 리소스를 모니터링할 수 있는 추가 컨텍스트 메뉴 옵션을 사용할 수 있습니다.

    • 배포 로그 열기: Cloud Code 로그 뷰어를 사용하여 특정 배포의 애플리케이션 로그를 엽니다.
    • 서비스 URL 열기: 웹브라우저에서 특정 서비스의 애플리케이션 서비스 URL을 엽니다.
    • 시계 모드 켜기/끄기: 현재 세션의 시계 모드를 전환합니다(디버그 세션에는 사용할 수 없음).

      Cloud Code 상태 표시줄을 통해 사용 가능한 옵션: 일반 Cloud Code 작업 외에도 배포 로그 열기, 서비스 URL 열기, 시계 모드 사용 설정

  10. 디버깅 세션을 종료하려면 디버그 툴바에서 중지 아이콘을 클릭합니다.

    애플리케이션이 종료되면 배포된 모든 Kubernetes 리소스가 클러스터에서 삭제됩니다.

구성 세부정보

내부적으로 Skaffold로 구동되는 Cloud Code는 다음 구성 세부정보를 자동으로 처리합니다.

  • 디버거를 연결할 수 있도록 디버그 포트 전달
  • 애플리케이션에서 디버그 가능한 하나 이상의 컨테이너에 디버거 연결. 애플리케이션에 skaffold.yaml에서 구성된 디버그 가능한 컨테이너(Cloud Code 디버그가 언어를 지원하는 컨테이너)가 여러 개 있는 경우 디버거가 각 컨테이너에 연결됩니다.
  • 세션 전반에서 소스 매핑 정의를 유지하고 .vscode/launch.json을 직접 수정하여 이러한 정의를 맞춤설정할 수 있습니다.

이외에도, Cloud Code는 언어에 따라 다음 사항을 처리합니다.

Node.js

호출할 진입점 다시 작성:

node --inspect=localhost:9229

Python

Init 컨테이너를 사용하여 ptvsd 모듈을 설치하고 호출할 진입점 다시 작성:

python -m ptvsd --host localhost --port 5678

Go

초기화 컨테이너를 사용하여 dlv 디버거를 설치하고, 시작된 디버그 세션이 헤드리스 모드에서 디버그 서버로만 실행되도록 진입점을 다시 작성하면 시작 시 디버깅된 프로세스가 계속되고, 여러 클라이언트 연결을 수락하고, localhost:56268에서 수신 대기합니다.

dlv exec --headless --continue --accept-multiclient --listen=localhost:56268 --api-version=2, <app> --

자바

적절한 JDWP 구성과 함께 환경 JAVA_TOOLS_OPTIONS를 추가하면 JDWP 디버깅 에이전트가 포트 5005에서 소켓 연결을 수신 대기해야 한다는 사실을 인식하고 디버거가 연결되기 전에 VM이 실행되도록 허용합니다.

jdwp=transport=dt_socket,server=y,suspend=n,address=5005,quiet=y

Skaffold 지원 디버깅에 대한 자세한 내용은 skaffold debug 문서를 참조하세요.

Kubernetes pod에 디버거 연결

Cloud Code는 Debugger를 Kubernetes pod에 연결도 지원합니다. 차이점을 알아 보려면 이 를 참조하세요.