Kubernetes 애플리케이션 디버깅

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

포트 전달 설정 또는 언어별 디버그 인수 삽입과 같은 수동 설정을 완료할 필요가 없습니다. 단순히 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 실행 구성(.vscode/launch.json에 있음)에 저장됩니다.

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

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

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

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

  5. 애플리케이션의 디버깅 가능한 각 컨테이너에서 디버깅할 프로그램이 있는 원격 컨테이너에서 디렉터리를 확인하거나 입력합니다.

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

    원격 루트 프롬프트

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

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

    기본적으로 애플리케이션 변경사항이 자동저장될 때 Cloud Code는 애플리케이션을 다시 배포하고 새 디버그 세션을 설정합니다. 프로젝트의 시작 구성에서 watch 플래그를 사용하여 이 기능을 전환할 수 있습니다.

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

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

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

    • 배포 로그 열기: Cloud Code 로그 뷰어를 사용하여 특정 배포의 애플리케이션 로그를 엽니다.
    • 서비스 URL 열기: 웹브라우저에서 특정 서비스의 애플리케이션 서비스 URL을 엽니다.
    • 감시 모드 사용 설정/중지: 현재 세션의 감시 모드를 전환합니다. 기본적으로 Cloud Code는 파일 시스템에서 파일(Kubernetes 구성 또는 코드)에 대한 변경사항을 계속 감시하고, 컨테이너를 다시 빌드하고, 애플리케이션을 클러스터에 다시 배포합니다. 따라서 수정사항이 거의 실시간으로 반영됩니다.

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

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

    디버깅 세션을 종료한 후에는 배포된 모든 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 Debug Wire Protocol) 구성과 함께 환경 JAVA_TOOLS_OPTIONS를 추가하면 JDWP 디버깅 에이전트가 포트 5005에서 소켓 연결을 수신 대기하고 디버거가 연결되기 전에 VM이 실행되도록 허용합니다.

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

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

Kubernetes pod에 디버거 연결

VS Code용 Cloud Code는 Kubernetes pod에 디버거 연결도 지원합니다. 비교하려면 Kubernetes pod에 연결하기와 Kubernetes 애플리케이션 디버깅하기 비교를 참조하세요.