kubernetes-in-action/app.js at master · luksa/kubernetes-in-action
수동적인 개입 없이도 안정적인 상태로 배포한 애플리케이션이 자동으로 실행되고 유지되길 원한다면, 레플리케이션컨트롤러또는 디플로이먼트와 같은 유형의 리소스를 생성해 실제 파드를 생성하고 관리한다.
파드 안에 있는 컨테이너가 죽으면 어떻게 해야할까?
파드가 노드에 스케줄링 되는 즉시, 해당 노드의 Kubelet은 파드의 컨테이너를 실행하고, 파드가 존재하는 한 컨테이너가 계속 실행되도록 할것이다.
컨테이너의 주 프로세스에서 crash가 발생하면, Kubelet이 컨테이너를 다시 시작한다.
쿠버네티스가 애플리케이션을 자동으로 재시작 한다.
애플리케이션이 무한 루프, 교착 상태에 빠져 응답하지않아 내부에서 재시작이 안될경우?
→ 외부에서 app 상태를 체크해야함
liveness probe 를 통해 컨테이너가 살아있는지 확인할 수 있다.
파드의 스펙 *specfication 에 각 컨테이너의 라이브니스 프로브를 지정할 수 있다!
레디니스 프로브(readiness probe)도 지원한다.
쿠버네티스의 컨테이너에 프로브 실행 방법
라이브니스 프로브 추가하는방법 알아보자.
웹서버이므로, 웹서버 요청처리 체크하는 라이브니스프로브 추가하자.
kubia-liveness-probe.yaml
apiVersion: v1
kind: Pod
metadata:
name: kubia-liveness
spec:
containers:
- image: luksa/kubia-unhealthy : 문제가있는 애플리케이션이미지이름
name: kubia
livenessProbe: 라이브니스 프로브
httpGet:
path: / http요청 경로
port: 8080
$ k create -f kubia-liveness-probe.yaml
kubectl get po kubia-liveness
RESTARTS 열에 몇번 시작했는지 표시
크래시된 컨테이너의 애플리케이션 로그 얻기
$kubectl logs mypod --previous
다시 시작된 이유
#kubectl describe po kubia-libveness
컨테이너가 돌아가고있다 → Running
Error 의 이유로 Terminated되었으며 코드가 137이다.
컨테이너가 4번 다시 시작되었다.
<aside> 💡 137 : 프로세스가 외부 신호에 의해 종료됐음을 의미한다. 128+x다. 이때 x 는 프로세스에 전송된 시그널 번호이며, 이 시그널에 의해 컨테이너가 강제로 종료됨을 의미한다. (SIGKILL) 종료코드 143은 128+15 **(SIGTERM)**에 해당
</aside>
Events는 컨테이너가 종료된 이유를 명시한다.
컨테이너가 종료되면 완전히 새로운 컨테이너가 생성된다. 동일한 컨테이너가 다시 시작되는 것이 아니다.
아까 그 describe..
프로브 옵션 외에도 지연, 제한시간, 기간 등과 같은 추가 속성을 볼 수도 있다.
→ 프로브를 정의할때 지정할 수 있다.
delay=0s
: 컨테이너가 시작된 후 바로 프로브가 시작된다는 것을 의미함.timeout = 1s
: 제한시간, 컨테이너가 1초안에 응답해야함period=10s
:컨테이너는 10초마다 프로브 수행하며, 프로브가 3번 연속 실패하면 컨테이너 재시작kubia-liveness-probe-initial-delay.yaml
apiVersion: v1
kind: Pod
metadata:
name: kubia-liveness
spec:
containers:
- image: luksa/kubia-unhealthy
name: kubia
livenessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 15 :쿠버네티스는 첫번째 프로브 실행까지 15초 기다린다.
컨테이너가 시작되자마다 프로브를 시작한다. 이 경우 애플리케이션이 요청을 받을 준비가 안되어있기 때문에 프로브 실패 횟수가 증가해버리기 때문에 지정해주는것.
파드시작시, 이 문제 발생했다면 initialDelaySeconds를 적절하게 설정하지 않았기 때문이다.
라이브니스 프로브가 확인해야 할 사항
프로브를 가볍게 유지하기
프로브에 재시도 루프를 구현하지 말자
실패 임계값을 1로 설정하더라도, 쿠버네티스는 실패를 한번 했다고 간주하기전에 프로브를 여러번 재시도 하기때문
라이브니스 프로브 요약
컨테이너를 계속 실행되도록 하는 + 프로브 확인 작업은 파드를 호스팅하는 노드의 kubelet에서 수행한다. 마스터 플레인 구성요소는 이 프로세스에 관여하지 x
but, 노드 크래시는 컨트롤 플레인의 몫.
레플리케이션 컨트롤러: 쿠버네티스 리소스로서, 파드가 항상 실행되도록 보장한다. 파드가 사라지면,사라진 파드를 감지해 교체 파드를 생성한다. 보통 하나의 파드만 관리하지만, 일반적으로 파드의 여러 복제본을 작성하고 관리하기 위한것이다.
→ 노드가 실패하면, 레플리케이션 컨트롤러가 관리하는 파드만 다시 생성된다.
→ 유형이라는 것은 사실 존재하지 않고, 특정 레이블 셀렉터와 일치하는 파드 세트에 작동한다.