클라우드 네이티브 플랫폼에서 컨테이너화 된 어플리케이션을 잘 관리하기 위해서는
관리 플랫폼에서 생성되는 이벤트를 통해서 어플리케이션의 수명 주기를 조절해야합니다.
수명 주기 패턴은 쿠버네티스에서 사용하는 파드와 컨테이너의 수명주기를 파악하고
어떻게 관리하는지에 대해 설명합니다.
쿠버네티스 패턴 - 4장 정상상태 점검을 통해서 쿠버네티스가 어떻게 컨테이너에 대한 상태를 파악하는지에 대해 설명하였습니다.
또한 Container Probe를 통해서 컨테이너에 대한 조치까지 알아보았습니다.
하지만 파드가 시작할 때 Probe로 상태를 확인하는 것 뿐만아니라 특정 커맨드 작업을 수행해야할 수 도 있므며, 컨테이너에 대한 Probe가 실패할 경우 컨테이너가 정상적으로 종료하기 위한 작업이 필요할 수 있습니다.
클라우드 네이티브 플랫폼에서는 컨테이너화된 어플리케이션을 특정 이벤트로 관리할 수 있어야 하며, 이를 통해서 수명주기를 관리할 수 있어야 합니다.
쿠버네티스는 컨테이너화된 어플리케이션을 관리하기 위해 Lifecycle을 나누어 단계를 구분하고 특정 이벤트를 호출합니다.
이를 위해 관리하는 기본적인 단위는 파드이며, 컨테이너들의 집합이라고 할 수 있습니다.
👍 따라서 파드와 컨테이너의 Lifecycle을 파악하여 언제 무엇이 실행되고 언제 어떻게 종료되는지 알아야합니다.
이를 위해서 가장 먼저 파드와 컨테이너의 상태를 알아보도록 하겠습니다.
Pod는 총 5가지의 단계를 가지고 있습니다.
이 단계는 kubectl get pod
로 알 수 있으며 파드의 상태를 파악할 수 있습니다.
👌 Terminating : 해당 상태는 Pod의 단계로 포함하지 않으며, gracefully 종료 중임을 나타냅니다.
이를 위해 시간이 부여되며 기본값은 30초입니다. 강제로 파드를 종료하려면--force
플래그를 설정하면 됩니다.
파드의 단계를 알았다면 내부적으로 컨테이너가 어떤 상태인지 알아야합니다.
컨테이너의 상태를 알기 위해서는 kubectl describe pods
를 통해서 파악할 수 있습니다.
Running
or Terminated
가 아니면 Watining
상태Wating
상태인 경우 이유를 요약하는 Reason 필드도 표시 Running
상태에 진입한 시기를 볼 수 있음쿠버네티스도 컴포넌트 Lifecycle Hook을 가진 프로그래밍 언어 프레임워크와 같이 Lifecycle Hook을 제공합니다.
특히 Hook은 Pod의 Lifecycle 과정에 포함되므로 이 글에서 같이 설명하도록 하겠습니다.
Probe와 같이 Container Lifecycle Hook을 위한 Handler가 존재합니다.
Hook Handler는 두 가지가 있으며 다음 yaml을 통해서 보겠습니다.
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
httpGet:
port: 8080
path: /postStart
preStop:
exec:
command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]
httpGet
컨테이너의 특정 엔드포인트에 대해서 HTTP 요청을 실행합니다.
해당 예시에서는 컨테이너 IP:8080/postStart
로 HTTP 요청을 실행합니다.
exec
컨테이너의 cgroups와 namespace 안에서, 특정 커맨드를 실행합니다.
해당 예시에서는 컨테이너 내에서 /bin/sh -c nginx -s quit; while killall -0 nginx; do sleep 1; done
을 실행합니다.
개념
Wating
이며, Pod는 Pending
상태사용
주의 사항
개념
사용
주의 사항
Terminated
or Completed
상태인 경우 preStop Hook은 실패 함terminationGracePeriodSeconds
가 만료된 후 SIGKILL 을 통해 종료함컨테이너를 안전하게 시작하기 위해서 Activation lifecycle을 알아야합니다.
다음 단계를 통해서 설명하도록 하겠습니다.
👌 Init Container는 쿠버네티스 패턴 - 14장 초기화 컨테이너 에서 자세하게 설명할 예정입니다.
Wating
이며, Pod는 Pending
상태 컨테이너를 안전하게 종료하기 위해서 Termination lifecycle을 알아야합니다.
다음 단계를 통해서 설명하도록 하겠습니다.
Terminating
으로 바꿈TerminationGracePeriodSeconds
옵션을 설정하여 변경 가능이번 글에서 살펴본 것은 Pod 및 Container의 상태와 단계를 알아보았으며,
Pod가 시작되는 것부터 종료될 때까지의 Lifecycle을 알아보고 특정 이벤트에 대해서 알아보았습니다.
이 내용을 정리하면 다음과 같은 그림이 될 것입니다.
![출처: https://velog.velcdn.com/images%2Fjayoh%2Fpost%2Fcb723130-a2b9-46a2-b241-efb0542d76dc%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fjayoh%2Fpost%2Fcb723130-a2b9-46a2-b241-efb0542d76dc%2Fimage.png)
클라우드 네이티브 플랫폼에서 실행되는 어플리케이션을 잘 관리하기 위해서는 Lifecycle을 알고 특정 이벤트를 통해서 관리해야합니다.
이렇게 된다면 어플리케이션의 자동화가 사람을 통해서가 아닌 플랫폼에 의해서 될 것입니다.
잘 봤씁니다