crictl로 Kubernetes 노드 디버깅하기

crictl로 Kubernetes 노드 디버깅하기

crictl은 CRI 호환 컨테이너 런타임을 위한 명령줄 인터페이스예요. Kubernetes 노드에서 컨테이너 런타임과 애플리케이션을 검사하고 디버깅하는 데 사용할 수 있어요. crictl과 그 소스는 cri-tools 저장소에 호스팅되어 있어요.

출처: 문서

본문

시작하기 전에

crictl은 CRI 런타임이 있는 Linux 운영체제를 필요로 해요.

crictl 설치

여러 아키텍처에 대해 cri-tools 릴리스 페이지에서 crictl의 압축 아카이브를 다운로드할 수 있어요. 사용 중인 Kubernetes 버전에 해당하는 버전을 다운로드해요. 그것을 추출하고 /usr/local/bin/ 같은 시스템 경로에 있는 위치로 옮겨요.

일반적인 사용법

crictl 명령에는 여러 하위 명령과 런타임 플래그가 있어요. 자세한 내용은 crictl help 또는 crictl <subcommand> help를 사용해요.

다음 중 하나로 crictl의 엔드포인트를 설정할 수 있어요.

  • --runtime-endpoint--image-endpoint 플래그 설정
  • CONTAINER_RUNTIME_ENDPOINTIMAGE_SERVICE_ENDPOINT 환경 변수 설정
  • 구성 파일 /etc/crictl.yaml에서 엔드포인트 설정. 다른 파일을 지정하려면 crictl을 실행할 때 --config=PATH_TO_FILE 플래그를 사용해요.

서버에 연결할 때 타임아웃 값을 지정하고, 구성 파일에서 timeout이나 debug 값을 지정하거나 --timeout--debug 명령줄 플래그를 사용해 디버깅을 활성화·비활성화할 수도 있어요.

현재 구성을 보거나 편집하려면 /etc/crictl.yaml의 내용을 보거나 편집해요. 예를 들어 containerd 컨테이너 런타임을 사용할 때 구성은 다음과 비슷할 거예요.

runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true

crictl에 대해 더 배우려면 crictl 문서를 참고해요.

예시 crictl 명령

다음 예시들은 몇 가지 crictl 명령과 예시 출력을 보여줘요.

파드 나열

모든 파드를 나열해요.

crictl pods

출력은 다음과 비슷해요.

POD ID              CREATED              STATE               NAME                         NAMESPACE           ATTEMPT
926f1b5a1d33a       About a minute ago   Ready               sh-84d7dcf559-4r2gq          default             0
4dccb216c4adb       About a minute ago   Ready               nginx-65899c769f-wv2gp       default             0
a86316e96fa89       17 hours ago         Ready               kube-proxy-gblk4             kube-system         0
919630b8f81f1       17 hours ago         Ready               nvidia-device-plugin-zgbbv   kube-system         0

이름으로 파드를 나열해요.

crictl pods --name nginx-65899c769f-wv2gp

출력은 다음과 비슷해요.

POD ID              CREATED             STATE               NAME                     NAMESPACE           ATTEMPT
4dccb216c4adb       2 minutes ago       Ready               nginx-65899c769f-wv2gp   default             0

라벨로 파드를 나열해요.

crictl pods --label run=nginx

출력은 다음과 비슷해요.

POD ID              CREATED             STATE               NAME                     NAMESPACE           ATTEMPT
4dccb216c4adb       2 minutes ago       Ready               nginx-65899c769f-wv2gp   default             0

이미지 나열

모든 이미지를 나열해요.

crictl images

출력은 다음과 비슷해요.

IMAGE                                     TAG                 IMAGE ID            SIZE
busybox                                   latest              8c811b4aec35f       1.15MB
k8s-gcrio.azureedge.net/hyperkube-amd64   v1.10.3             e179bbfe5d238       665MB
k8s-gcrio.azureedge.net/pause-amd64       3.1                 da86e6ba6ca19       742kB
nginx                                     latest              cd5239a0906a6       109MB

리포지토리로 이미지를 나열해요.

crictl images nginx

출력은 다음과 비슷해요.

IMAGE               TAG                 IMAGE ID            SIZE
nginx               latest              cd5239a0906a6       109MB

이미지 ID만 나열해요.

crictl images -q

출력은 다음과 비슷해요.

sha256:8c811b4aec35f259572d0f79207bc0678df4c736eeec50bc9fec37ed936a472a
sha256:e179bbfe5d238de6069f3b03fccbecc3fb4f2019af741bfff1233c4d7b2970c5
sha256:da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e
sha256:cd5239a0906a6ccf0562354852fae04bc5b52d72a2aff9a871ddb6bd57553569

컨테이너 나열

모든 컨테이너를 나열해요.

crictl ps -a

출력은 다음과 비슷해요.

CONTAINER ID        IMAGE                                                                                                             CREATED             STATE               NAME                       ATTEMPT
1f73f2d81bf98       busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47                                   7 minutes ago       Running             sh                         1
9c5951df22c78       busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47                                   8 minutes ago       Exited              sh                         0
87d3992f84f74       nginx@sha256:d0a8828cccb73397acb0073bf34f4d7d8aa315263f1e7806bf8c55d8ac139d5f                                     8 minutes ago       Running             nginx                      0
1941fb4da154f       k8s-gcrio.azureedge.net/hyperkube-amd64@sha256:00d814b1f7763f4ab5be80c58e98140dfc69df107f253d7fdd714b30a714260a   18 hours ago        Running             kube-proxy                 0

실행 중인 컨테이너를 나열해요.

crictl ps

출력은 다음과 비슷해요.

CONTAINER ID        IMAGE                                                                                                             CREATED             STATE               NAME                       ATTEMPT
1f73f2d81bf98       busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47                                   6 minutes ago       Running             sh                         1
87d3992f84f74       nginx@sha256:d0a8828cccb73397acb0073bf34f4d7d8aa315263f1e7806bf8c55d8ac139d5f                                     7 minutes ago       Running             nginx                      0
1941fb4da154f       k8s-gcrio.azureedge.net/hyperkube-amd64@sha256:00d814b1f7763f4ab5be80c58e98140dfc69df107f253d7fdd714b30a714260a   17 hours ago        Running             kube-proxy                 0

실행 중인 컨테이너에서 명령 실행

crictl exec -i -t 1f73f2d81bf98 ls

출력은 다음과 비슷해요.

bin   dev   etc   home  proc  root  sys   tmp   usr   var

컨테이너 로그 가져오기

모든 컨테이너 로그를 가져와요.

crictl logs 87d3992f84f74

출력은 다음과 비슷해요.

10.240.0.96 - - [06/Jun/2018:02:45:49 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
10.240.0.96 - - [06/Jun/2018:02:45:50 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
10.240.0.96 - - [06/Jun/2018:02:45:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"

로그의 마지막 N줄만 가져와요.

crictl logs --tail=1 87d3992f84f74

출력은 다음과 비슷해요.

10.240.0.96 - - [06/Jun/2018:02:45:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"

다음 단계

더 알아보기 (Learn more)