ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes Event 이해하기
    Kubernetes 2023. 6. 16. 12:23
    728x90
    반응형

     

     

    - 목차

     

    * 소개

    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
Designed by Tistory.