Profile picture

[k8s] Kubernetes Events 조회하기

JaehyoJJAng2023년 04월 17일

▶︎ 개요

Kubernetes Events는 하나의 Kubernetes 리소스 타입으로서 Kubernetes 리소스들의 state 변화나, 에러 또는 시스템의 특정 메시지를 전파해야할 때 자동으로 생성된다. 이러한 kubernetes events 리소스는 디버깅시에 매우 유용하게 사용된다.
(공식 문서에서도 디버깅 시 Events를 활용한다)


▶︎ Events 조회

Kubernetes Event는 어떻게 조회할까? 쿠버네티스를 몇 번 다뤄봤다면 Events 리소스를 본 적이 분명 있을 것이다. 가장 흔한 예시로 이미지 Pull 실패 예시를 들어보자.


잘못된 컨테이너 이미지를 입력하면 Deployment 또는 Pod를 생성해서 조회했을 때 아래와 같은 오류가 나올 것이다.
image


공식 문서대로 자세한 오류의 내용이 궁금하다면 kubectl describe pod <pod-name>으로 조회를 할 것이다. 그러면 맨 아래에 Events 항목을 볼 수 있는데. 이게 앞서 말한 Kubernetes Events 리소스를 의미한다.

$ kubectl describe pod/test-pod

image


특정 Pod 뿐 아니라 현재 namespace에서 발생하는 모든 Events를 조회하고 싶다면 kubectl get events를 통해 조회할 수 있다.
하지만 모든 리소스들의 Events들이 조회되기 때문에 상용환경 같이 리소스가 많은 상황이라면 원하는 정보를 찾기 힘들 것이다.


전체 리소스에서 특정 Selector를 사용하여 원하는 정보만 찾아볼 수 있도록 kubectl에서 --field-selector 옵션을 지원하고 있다.

# Warning 타입만 조회
$ kubectl get events --field-selector type=Warning

# Pod events를 제외한 다른 events 조회
$ kubectl get events --field-selector involvedObject.kind!=Pod

# k8s-node2 라는 이름의 노드에서 발생한 events만 조회
$ kubectl get events --field-selector involvedObject.kind=Node,involvedObject.name=k8s-node2

▶︎ Events 필드

  • events.k8s.io v1 Events

Events 리소스는 여러 필드를 가지고 있다.

Events의 모든 필드는 Kubernetes Reference에서 확인할 수 있다.

간략하게 위에서 출력된 필드만 살펴보자

  • type: Normal, Warning 2가지의 값 중 하나를 가지며 추후 추가될 수 있음. 말 그대로 일반적인 작업에 의해 생겨난 Event인지 아니면 어떤 오류 및 실패로 인해 생겨난 Event인지 표현함.
  • reason: 해당 Event가 왜 일어났는지 나타냄. 딱히 정해진 형식은 없고, 128자 이하의 사람이 이해할 수 있는 정보로 작성. kubelet 에서는 다음과 같은 Reason을 정해주고 사용하고 있음/
  • eventTime: Age로 출력된 부분의 값을 나타냄. Event가 발생한 시각을 의미하며 MicroTime 타입의 데이터로 이루어져 있음.
  • reportingController: From으로 출력된 부분의 값을 나타냄. 말 그대로 해당 Event를 발생시킨 Controller의 이름을 의미
  • note: Events가 발생된 작업. 그 작업의 상태(status)에 대한 설명을 의미

▶︎ 다양한 Events 리소스

위에서는 Events 필드를 살펴보았다. 사실 Kubernetes 기본 리소스 중 Events는 한 가지가 아니다. 아무런 crd를 추가하지 않은 상태에서 api resource를 출력하면 다음과 같이 출력 된다.

$ kubectl api-resources -o wide | grep 'events'
NAME                              SHORTNAMES                                      APIVERSION                             NAMESPACED   KIND                             VERBS
events                            ev                                              v1                                     true         Event                            create,delete,deletecollection,get,list,patch,update,watch
events                            ev                                              events.k8s.io/v1                       true         Event                            create,delete,deletecollection,get,list,patch,update,watch

보시다시피 2개가 존재하고 있고. 위에 있는 events는 core API GROUP(공백인 경우 core group을 의미함)에 속해있고, 아래에 있는 events는 events.k8s.io API GROUP에 속해있다.


API GROUP을 제외한 모든게 같은데 왜 2개나 존재하는거지?

그 내용은 kubernetes/enhancement에 설명되어 있다.


이유를 요약해서 설명하자면 기존의 core 그룹의 events가 먼저 존재했었는데 이 Events에는 2가지 문제점이 있었다

  • Events는 어플리케이션 개발자에게 해당 어플리케이션에 무슨 일이 일어나고 있는지 명확하게 알려줄 수 있어야 한다. 하지만 core 그룹의 Events는 불명확한 의미를 가진 스팸성이었다.
  • Events는 kubernetes의 성능에 문제를 일으키거나 영향을 주어서는 안된다. 하지만 core 그룹의 Events는 여러 알려진 성능문제가 존재했다.

이러한 문제로 인해 여러 변화 요구들이 생겨났고, 이에 새로운 events.k8s.io API GROUPdml Events가 나오게 된 것이다!.


현재까지 여러 어플리케이션에서 계속해 core.Event -> events.Event로 넘어가고 있는 추세이다.
https://github.com/kubernetes/kubernetes/pull/102832 https://github.com/kubernetes/kubernetes/pull/92724


Loading script...