-
Kubernetes Event 이해하기Kubernetes 2023. 6. 16. 12:23728x90반응형
- 목차
* 소개
Kubernetes Event 는 쿠버네티스 클러스터 내부 구성요소들의 유의미한 정보를 나타냅니다.
Event 의 정보들을
- Container 의 실행과 종료
- Image Pulling
- Pod 의 노드 스케줄링
- Replicas 유지를 위한 Pod Scaling In/Out
- Node 의 리소스 상태 (DiskPressure, Memory Usage 등)
등이 있습니다.
이벤트는 통해서 쿠버네티스 클러스터 내부에서 발생하는 여러 리소스들의 상태에 대해서 기록됩니다.
Pod, Node, Service, ReplicaSet, Deployment, StatefulSet 등의 리소스들에 대한 Event 는 꾸준히 생성됩니다.
* Pod Event
Pod Event 는 Pod 의 라이프사이클과 관련된 정보를 나타냅니다.
nginx 이미지로 생성한 Pod Event 는 아래와 같습니다.
<정상적인 케이스>
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 62s default-scheduler Successfully assigned default/nginx to kind-worker4 Normal Pulling 60s kubelet Pulling image "nginx" Normal Pulled 46s kubelet Successfully pulled image "nginx" in 13.254046797s Normal Created 46s kubelet Created container nginx Normal Started 46s kubelet Started container nginx
먼저 Pod 가 default-scheduler 에 의해서 kind-worker4 노드에 스케줄링된 Event 가 발생합니다.
그리고 kubelet 에 의해 컨테이너가 생성되는데,
이미지를 내려받고 컨테이너를 생성 및 실행하는 Event 가 생성됩니다.
강제로 컨테이너를 중지시켜보겠습니다.
참고로 Pod 내부의 컨테이너를 강제로 중지시키는 명령어는
kubectl exec -it nginx -c nginx -- /bin/sh -c "kill 1"
입니다.
컨테이너가 중지된 이후의 이벤트입니다.
<컨테이너를 강제로 중지시킨 케이스>
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 24m default-scheduler Successfully assigned default/nginx to kind-worker4 Normal Pulled 24m kubelet Successfully pulled image "nginx" in 13.254046797s Normal Pulled 74s kubelet Successfully pulled image "nginx" in 1.612358543s Warning BackOff 47s kubelet Back-off restarting failed container Normal Pulling 34s (x3 over 24m) kubelet Pulling image "nginx" Normal Created 32s (x3 over 24m) kubelet Created container nginx Normal Started 32s (x3 over 24m) kubelet Started container nginx Normal Pulled 32s kubelet Successfully pulled image "nginx" in 1.657291292s
Type 이 Warning 인 이벤트가 발생하였습니다.
이벤트의 내용은 Back-off restarting failed container 인데요.
제가 강제로 컨테이너를 중지시켜서 발생한 케이스이긴 하지만 컨테이너의 restart 강제로 방해해서 발생한 이벤트입니다.
그리고 kubelet 에 의해서 컨테이너의 실행 - 생성과 관련된 이벤트가 발생하였습니다.
또다른 Warning Type의 이벤트입니다.
존재하지 않는 이미지를 기반으로 Pod 를 생성할 때 발생하는 이벤트입니다.
<유효하지 않은 이미지로 컨테이너를 생성하는 케이스>
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Pulled 4m16s kubelet Successfully pulled image "nginx" in 1.657291292s Normal Killing 17s kubelet Container nginx definition changed, will be restarted Normal Pulling 17s kubelet Pulling image "nginxaa" Warning BackOff 15s (x2 over 4m31s) kubelet Back-off restarting failed container Warning Failed 15s kubelet Failed to pull image "nginxaa": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/nginxaa:latest": failed to resolve reference "docker.io/library/nginxaa:latest": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed Warning Failed 15s kubelet Error: ErrImagePull
nginxaa 라는 이미지로 Pod 의 생성을 시도하였습니다.
위에서 보듯이, Image Pull Error 와 관련된 이벤트가 생성됩니다.
번외로 다른 Pod 의 이벤트 리스트입니다.
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 27m default-scheduler Successfully assigned multi-container/multi-container-pod to kind-worker4 Normal Pulling 27m kubelet Pulling image "nginx" Normal Pulled 27m kubelet Successfully pulled image "nginx" in 1.546542917s Normal Created 27m kubelet Created container container1 Normal Started 27m kubelet Started container container1 Normal Pulling 27m kubelet Pulling image "mysql" Normal Pulled 27m kubelet Successfully pulled image "mysql" in 1.580332584s Normal Created 27m kubelet Created container container2 Normal Started 27m kubelet Started container container2 Normal Pulling 27m kubelet Pulling image "minio/minio" Normal Pulled 27m kubelet Successfully pulled image "minio/minio" in 1.543065084s Normal Created 27m kubelet Created container container3 Normal Started 27m kubelet Started container container3
* ReplicaSet Event
ReplicaSet 은 Pod 의 Scailing 과 관련된 이벤트는 생성합니다.
ReplicaSet 자체가 Pod 의 갯수를 유지시키는데에 그 목적이 있습니다.
그래서 Pod 생성과 삭제에 대한 이벤트를 볼 수 있습니다.
replica 가 3 인 ReplicaSet 의 이벤트입니다.
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 16s replicaset-controller Created pod: test-replicaset-c97lx Normal SuccessfulCreate 16s replicaset-controller Created pod: test-replicaset-xkdn5 Normal SuccessfulCreate 16s replicaset-controller Created pod: test-replicaset-p9bbn
replicaset-controller 에 의해서 3개의 Pod 가 생성된 이벤트가 기록됩니다.
replicas 를 4로 확장해보겠습니다.
<Scale Out>
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 100s replicaset-controller Created pod: test-replicaset-c97lx Normal SuccessfulCreate 100s replicaset-controller Created pod: test-replicaset-xkdn5 Normal SuccessfulCreate 100s replicaset-controller Created pod: test-replicaset-p9bbn Normal SuccessfulCreate 2s replicaset-controller Created pod: test-replicaset-jhbq8
1개의 Pod 가 추가로 생성됨을 확인할 수 있습니다.
replicas 는 2로 축소시켜보겠습니다.
<Scale-In>
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 2m35s replicaset-controller Created pod: test-replicaset-c97lx Normal SuccessfulCreate 2m35s replicaset-controller Created pod: test-replicaset-xkdn5 Normal SuccessfulCreate 2m35s replicaset-controller Created pod: test-replicaset-p9bbn Normal SuccessfulCreate 57s replicaset-controller Created pod: test-replicaset-jhbq8 Normal SuccessfulDelete 2s replicaset-controller Deleted pod: test-replicaset-jhbq8 Normal SuccessfulDelete 2s replicaset-controller Deleted pod: test-replicaset-p9bbn
2개의 Pod 가 Delete 됨을 확인할 수 있습니다.
* Deployment Event
Deployment 은 ReplicaSet 을 활용하여 기존의 ReplicaSet 와 새로운 ReplicaSet 의 매끄러운 교체를 책임집니다.
그래서 Deployment 의 이벤트는 ReplicaSet 과 관련된 이벤트들이 존재합니다.
아래는 Deployment Event 중에서 Scaling Out 과 관련된 이벤트입니다.
replicas 를 3 에서 5 로 확장시킨 상황의 이벤트입니다.
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 4m11s deployment-controller Scaled up replica set hello-deploy-5cd5dcf7d7 to 3 Normal ScalingReplicaSet 7s deployment-controller Scaled up replica set hello-deploy-5cd5dcf7d7 to 5
Deployment 이므로 이벤트는 deployment-controller 에 의해서 생성됩니다.
그리고 새로운 버전으로 update 하는 상황의 Deployment 이벤트를 살펴보겠습니다.
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 2m1s deployment-controller Scaled up replica set hello-deploy-6ccbf97448 to 5 Normal ScalingReplicaSet 81s deployment-controller Scaled up replica set hello-deploy-7f8dc97569 to 1 Normal ScalingReplicaSet 81s deployment-controller Scaled down replica set hello-deploy-6ccbf97448 to 4 Normal ScalingReplicaSet 81s deployment-controller Scaled up replica set hello-deploy-7f8dc97569 to 2 Normal ScalingReplicaSet 46s deployment-controller Scaled down replica set hello-deploy-6ccbf97448 to 3 Normal ScalingReplicaSet 45s deployment-controller Scaled up replica set hello-deploy-7f8dc97569 to 3 Normal ScalingReplicaSet 36s deployment-controller Scaled down replica set hello-deploy-6ccbf97448 to 2 Normal ScalingReplicaSet 36s deployment-controller Scaled up replica set hello-deploy-7f8dc97569 to 4 Normal ScalingReplicaSet 13s deployment-controller Scaled down replica set hello-deploy-6ccbf97448 to 1 Normal ScalingReplicaSet 3s (x2 over 13s) deployment-controller (combined from similar events): Scaled down replica set hello-deploy-6ccbf97448 to 0
Scale Up 과 Scale Down 이벤트가 교차하면서 생성됩니다.
Deployment 는 구조적으로 2개의 ReplicaSet 를 관리하게 되고,
각각 Old Version ReplicaSet 과 New Version ReplicaSet 입니다.
그리고 Old Version ReplicaSet 는 replicas 는 5 -> 4 -> 3 -> 2 -> 1 -> 0
반대로 new Version ReplicaSet 는 replicas 는 0 -> 1 -> 2 -> 3 -> 4 -> 5
변경하면서 무중단 배포를 하게 됩니다.
* Node Event, Service Event, Volume Event, Ingress Event ...
추후에 꼭 작성하도록 하겠습니다.
* Event 는 누가 생성하는가 ?
이벤트를 생성하는 주체는 쿠버네티스 리소스의 체크하는 메인 컴포넌트들입니다.
보통 kube-system 네임스페이스 존재하는 요소들인데요.
API Server, Kubelet, Scheduler, Controller, Node 가 수행합니다.
위의 예시들에서 보았듯이, 각 요소들이 책임지는 Kubernetes Resource 들이 정해졌습니다.
Scheduler 와 Kubelet 은 Pod 의 이벤트는 생성하고,
Controller 는 Deployment, ReplicaSet 과 같은 리소스의 이벤트를 생성합니다.
* Event 의 지속 기간
쿠버네티스 이벤트는 영구적이지 않습니다.
event 의 ttl 은 기본적으로 1시간으로 설정되어 있습니다.
최초 쿠버네티스 클러스터를 구축할 때에 kubeadm 에서 event-ttl 을 설정할 수 있습니다.
<예시>
apiServer: extraArgs: default-not-ready-toleration-seconds: "30" default-unreachable-toleration-seconds: "30" feature-gates: "SCTPSupport=true" event-ttl: "24h"
* 이벤트 타입
Kubernetest Event 은 여러가지 타입이 있습니다.
- Normal
- Warning
Normal 타입의 이벤트는 위에서 설명한 이벤트들 처럼 Kubernetes Object 의 상태 변경에 대한 내용들입니다.
다만, Kubernetes 를 운영하는 상황에서 유의해야하는 Event Type 은 Warning 입니다.
1. Failed Event
아래의 Event List 는 CrashLoopBackOff 에 대한 케이스입니다.
컨테이너가 정상 구동될 수 없다면 아래와 같이 restarting 이 계속 됩니다.
(참고로 관련된 restarting policy 또한 설정할 수 있습니다. )
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 18s default-scheduler Successfully assigned multi-container/multi-container-pod to kind-worker4 Normal Pulling 15s kubelet Pulling image "nginx" Normal Pulled 14s kubelet Successfully pulled image "nginx" in 1.506857335s Normal Created 14s kubelet Created container container1 Normal Started 14s kubelet Started container container1 Normal Pulled 12s kubelet Successfully pulled image "mysql" in 1.492563793s Normal Pulled 11s kubelet Successfully pulled image "minio/minio" in 1.541814959s Normal Pulling 10s (x2 over 14s) kubelet Pulling image "mysql" Normal Started 8s (x2 over 12s) kubelet Started container container2 Normal Pulling 8s (x2 over 12s) kubelet Pulling image "minio/minio" Normal Created 8s (x2 over 12s) kubelet Created container container2 Normal Pulled 8s kubelet Successfully pulled image "mysql" in 1.554939834s Normal Created 6s (x2 over 11s) kubelet Created container container3 Normal Started 6s (x2 over 11s) kubelet Started container container3 Normal Pulled 6s kubelet Successfully pulled image "minio/minio" in 1.493278709s Warning BackOff 5s (x2 over 6s) kubelet Back-off restarting failed container Warning BackOff 5s (x2 over 6s) kubelet Back-off restarting failed container
아래의 Event List 는 Image Pull 과정에서 에러가 발생하여 이미지를 pulling 할 수 없는 Warning Event 입니다.
이 상태를 ImagePullBackOff 라고 합니다.
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 8s default-scheduler Successfully assigned multi-container/multi-container-pod to kind-worker2 Normal Pulling 6s kubelet Pulling image "nginxdd" Warning Failed 4s kubelet Failed to pull image "nginxdd": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/nginxdd:latest": failed to resolve reference "docker.io/library/nginxdd:latest": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed Warning Failed 4s kubelet Error: ErrImagePull Normal Created 2s kubelet Created container container2 Normal Pulled 2s kubelet Successfully pulled image "mysql" in 1.525234084s Normal Started 2s kubelet Started container container2 Normal Pulling 2s kubelet Pulling image "minio/minio" Normal Pulled 1s kubelet Successfully pulled image "minio/minio" in 1.501312084s Normal Created 1s kubelet Created container container3 Normal Started 1s kubelet Started container container3 Normal Pulling 0s (x2 over 4s) kubelet Pulling image "mysql" Normal BackOff 0s kubelet Back-off pulling image "nginxdd" Warning Failed 0s kubelet Error: ImagePullBackOff
2. Evicted Event
Evicted 란 Pod 가 배치된 Node 에서 축출되는 상황을 의미합니다.
아래의 Event 는 강제로 resources 사용량을 늘려서 Evicted 되는 상태를 구현하였습니다.
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 34s (x2 over 65s) default-scheduler 0/5 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/master: }, 5 Insufficient cpu, 5 Insufficient memory. preemption: 0/5 nodes are available: 1 Preemption is not helpful for scheduling, 4 No preemption victims found for incoming pod.
반응형'Kubernetes' 카테고리의 다른 글
Kubernetes Ephemeral Volume (0) 2023.08.09 [Kubernetes] Service 이해하기 (0) 2023.08.01 Kubernetes Pod 이해하기 (0) 2023.07.26 [Kubernetes] ReadinessProbe 알아보기 (0) 2023.06.16 [Kubernetes] Metrics Server 알아보기 (0) 2023.05.09