Docker 컨테이너 내부의 Nebula 그래프 프로세스 디버그



요구 사항



개발 또는 테스트 프로세스에서 우리는 종종 vesoft-inc/nebula-docker-compose 리포지토리를 사용하여 Nebula Graph를 배포합니다. 하지만 각 Nebula Graph 서비스의 도커 이미지를 최대한 압축하기 위해 개발에 일반적으로 사용되는 모든 도구는 편집기 Vim도 설치하지 않습니다.

이로 인해 작업을 수행하기 위해 매번 필수 툴킷을 설치하는 것이 번거로웠기 때문에 컨테이너 내부의 문제를 찾기가 어려웠습니다. 실제로 컨테이너의 콘텐츠 구조를 손상시키거나 내부에 툴킷을 설치하지 않고 컨테이너 내부의 프로세스를 디버깅하는 또 다른 방법이 있습니다.

실제로 이 기술인 Sidecar 모드는 K8S 환경에서 많이 사용되는 기술입니다. 원칙은 매우 간단합니다. 디버깅 중인 컨테이너와 PID/네트워크의 동일한 네임스페이스를 공유하는 컨테이너를 시작합니다. 이러한 방식으로 디버깅에 사용하는 컨테이너를 통해 원래 컨테이너의 프로세스와 네트워크 네임스페이스를 볼 수 있습니다. 여기에는 필요한 모든 것이 설치되어 있습니다.

데모



방법은 다음과 같습니다.

위에서 언급한 것처럼 Docker-Compose를 사용하여 Nebula Graph 클러스터를 로컬로 배포하는 것으로 시작합니다. 자세한 자습서는 저장소의 README 파일을 참조하십시오. 배포 후 모든 서비스를 시작하고 다음과 같이 상태를 확인합니다.

$ docker-compose up -d 
Creating network "nebula-docker-compose_nebula-net" with the default driver Creating nebula-docker-compose_metad1_1 ... done 
Creating nebula-docker-compose_metad2_1 ... done 
Creating nebula-docker-compose_metad0_1 ... done 
Creating nebula-docker-compose_storaged2_1 ... done 
Creating nebula-docker-compose_storaged1_1 ... done 
Creating nebula-docker-compose_storaged0_1 ... done 
Creating nebula-docker-compose_graphd_1 ... done 
$ docker-compose ps 
Name Command State Ports 
--------------------------------------------------------------------
nebula-docker-compose_graphd_1 ./bin/nebula-graphd --flag ... Up (health: starting) 0.0.0.0:32907->13000/tcp,0.0.0.0:32906->13002/tcp, 0.0.0.0:3699->3699/tcp 
nebula-docker-compose_metad0_1 ./bin/nebula-metad --flagf ... Up (health: starting) 0.0.0.0:32898->11000/tcp,0.0.0.0:32896->11002/tcp, 45500/tcp,45501/tcp 
nebula-docker-compose_metad1_1 ./bin/nebula-metad --flagf ... Up (health: starting) 0.0.0.0:32895->11000/tcp,0.0.0.0:32894->11002/tcp, 45500/tcp,45501/tcp 
nebula-docker-compose_metad2_1 ./bin/nebula-metad --flagf ... Up (health: starting) 0.0.0.0:32899->11000/tcp,0.0.0.0:32897->11002/tcp, 45500/tcp,45501/tcp 
nebula-docker-compose_storaged0_1 ./bin/nebula-storaged --fl ... Up (health: starting) 0.0.0.0:32901->12000/tcp,0.0.0.0:32900->12002/tcp, 44500/tcp,44501/tcp 
nebula-docker-compose_storaged1_1 ./bin/nebula-storaged --fl ... Up (health: starting) 0.0.0.0:32903->12000/tcp,0.0.0.0:32902->12002/tcp, 44500/tcp,44501/tcp 
nebula-docker-compose_storaged2_1 ./bin/nebula-storaged --fl ... Up (health: starting) 0.0.0.0:32905->12000/tcp,0.0.0.0:32904->12002/tcp, 44500/tcp,44501/tcp


다음으로 프로세스 네임스페이스에서 네트워크 네임스페이스까지 시나리오별로 시연합니다. 우선, 디버깅을 위한 편리한 이미지가 필요합니다. 데모용이므로 직접 구축할 필요가 없습니다. Docker Hub에서 잘 채워진 이미지를 찾아봅시다. 나중에 이 이미지가 충분하지 않다는 것을 알게 되면 nebula-debug 이미지를 유지하고 원하는 모든 디버깅 도구를 설치할 수 있습니다. 여기서는 nicolaka/netshoot의 커뮤니티 솔루션을 사용합니다. 이미지를 로컬 호스트로 가져오겠습니다.

$ docker pull nicolaka/netshoot 
$ docker images 
REPOSITORY TAG IMAGE ID CREATED SIZE 
vesoft/nebula-graphd nightly c67fe54665b7 36hours ago 282MB vesoft/nebula-storaged nightly 5c77dbcdc507 36hours ago 288MB vesoft/nebula-console nightly f3256c99eda1 36hours ago 249MB vesoft/nebula-metad nightly 5a78d3e3008f 36hours ago 288MB nicolaka/netshoot latest 6d7e8891c980 2months ago 352MB 


이미지를 실행하면 어떻게 되는지 봅시다.

$ docker run --rm -ti nicolaka/netshoot bash 
bash-5.0# ps 
PID USER TIME COMMAND 
1 root 0:00 bash 
8 root 0:00 ps 
bash-5.0#


위에 표시된 것처럼 이 컨테이너에는 Nebula Graph 프로세스가 없습니다. 여기에 몇 가지 매개변수를 추가하고 어떤 일이 일어나는지 봅시다.

$ docker run --rm -ti --pid container:nebula-docker-compose_metad0_1 --cap-add sys_admin nicolaka/netshoot bash 
bash-5.0# ps 
PID USER TIME COMMAND 
1 root 0:03 ./bin/nebula-metad --flagfile=./etc/nebula-metad.conf --daemonize=false --meta_server_addrs=172.28.1.1:45500,172.28.1.2:45500,172.28.1.3:45500--local_ip=172.28.1.1 --ws_ip=172.28.1.1 --port= 45500 --data_path=/data/meta--log_dir=/logs--v= 15 --minloglevel= 0 
452 root 0:00 bash 
459 root 0:00 ps 

bash-5.0# ls -al /proc/1/net/ 
total 0 
dr-xr-xr-x 6 root root 0 Sep18 07:17 . 
dr-xr-xr-x 9 root root 0 Sep18 06:55 .. 
-r--r--r-- 1 root root 0 Sep18 07:18 anycast6 
-r--r--r-- 1 root root 0 Sep18 07:18 arp 
dr-xr-xr-x 2 root root 0 Sep18 07:18 bonding 
-r--r--r-- 1 root root 0 Sep18 07:18 dev 
... 
-r--r--r-- 1 root root 0 Sep18 07:18 sockstat 
-r--r--r-- 1 root root 0 Sep18 07:18 sockstat6 
-r--r--r-- 1 root root 0 Sep18 07:18 softnet_stat 
dr-xr-xr-x 2 root root 0 Sep18 07:18 stat 
-r--r--r-- 1 root root 0 Sep18 07:18 tcp 
-r--r--r-- 1 root root 0 Sep18 07:18 tcp6 
-r--r--r-- 1 root root 0 Sep18 07:18 udp 
-r--r--r-- 1 root root 0 Sep18 07:18 udp6 
-r--r--r-- 1 root root 0 Sep18 07:18 udplite 
-r--r--r-- 1 root root 0 Sep18 07:18 udplite6 
-r--r--r-- 1 root root 0 Sep18 07:18 unix 
-r--r--r-- 1 root root 0 Sep18 07:18 xfrm_stat


이번에는 조금 다릅니다. PID가 1인 metad0 프로세스를 볼 수 있습니다. 이제 예를 들어 GDB에 첨부하는 프로세스를 볼 수 있으므로 작업을 쉽게 수행할 수 있습니다. Nebula Graph 바이너리 파일이 있는 이미지가 없으므로 탐색은 여러분에게 맡기겠습니다.

--pid container:를 설정하여 PID 네임스페이스가 이미 공유되었음을 알 수 있습니다. 다음으로 때때로 패키지를 캡처해야 할 수도 있다는 점을 고려하여 네트워크 상태도 볼 수 있는지 확인하겠습니다. 다음 명령을 실행합니다.

bash-5.0# netstat -tulpn 
Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name


아무것도 없습니다. 우리는 이미 metad0 프로세스를 가지고 있고 여기에 아무것도 없어야 하고 하나의 연결도 없어야 하기 때문에 우리가 기대했던 것과 약간 다릅니다. 원래 컨테이너 내의 네트워크 네임스페이스를 보려면 몇 가지 추가 옵션을 설정하고 다음 명령을 실행하여 디버그 컨테이너를 다시 시작해야 합니다.

$ docker run --rm -ti --pid container:nebula-docker-compose_metad0_1 --network container:nebula-docker-compose_metad0_1 --cap-add sys_admin nicolaka/netshoot bash 
bash-5.0# netstat -tulpn 
Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 
tcp 0 0 172.28.1.1:11000 0.0.0.0:* LISTEN - 
tcp 0 0 172.28.1.1:11002 0.0.0.0:* LISTEN - 
tcp 0 0 0.0.0.0:45500 0.0.0.0:* LISTEN - 
tcp 0 0 0.0.0.0:45501 0.0.0.0:* LISTEN - 
tcp 0 0 127.0.0.11:33249 0.0.0.0:* LISTEN - 
udp 0 0 127.0.0.11:51929 0.0.0.0:* -


이번에는 출력이 이전 출력과 동일하지 않습니다. --network container:nebula-docker-compose_metad0_1 옵션을 사용하면 metad0 컨테이너의 연결을 확인하고 패키지를 캡처하고 디버그할 수 있습니다.

요약



추가 도구를 설치하지 않고 컨테이너 환경을 디버깅할 수 있는 핵심은 다른 컨테이너를 실행하고 원래 컨테이너와 PID/네트워크 네임스페이스를 공유하도록 하는 것입니다. 커뮤니티의 일부 사람들은 이 방법을 기반으로 도구를 개발하여 사용하기 쉽게 만들었습니다. 자세한 내용은 Docker-debug을 참조하십시오.

당신은 또한 좋아할 수도 있습니다


  • Compiling Trouble Shooting: Segmentation Fault and GCC Illegal Instruction
  • Dev Log | How to Release jar Package to the Maven Central Repository
  • How to Reduce Docker Image Size

  • Like what we do ? Star us on GitHub. https://github.com/vesoft-inc/nebula



    2020년 10월 27일 https://nebula-graph.io에서 원래 게시되었습니다.

    좋은 웹페이지 즐겨찾기