개발 이야기/쿠버네티스

쿠버네티스 - 프로브 - 16

석구석구 2021. 9. 8. 23:18

이전에 우리는 레플리카(레플리케이션 컨트롤러) 설정을 통해 파드가 죽은 경우, 쿠버네티스가 이를 되살리고 그 숫자를 관리한다는 사실을 알게 되었다. 이에 대해서 좀 더 자세히 알아보자.

 

만약 파드 안에 있는 컨테이너 중 하나가 죽으면 어떻게 될까? 파드가 노드에 스케줄링되는 즉시, 해당 노드의 kubelet은 파드의 컨테이너를 실행하고 파드가 존재하는 한 계속 실행되도록 할 것이다. 애플리케이션 내부의 문제로 컨테이너가 죽더라도 쿠버네티스는 이를 자동으로 되살린다. 물론 애플리케이션에서 쿠버네티스에 재실행을 요청할 수도 있다. 그러나 대부분의 경우 애플리케이션의 외부에서 애플리케이션 컨테이너의 상태를 체크하는 것이 좋다.

 

흔히 서버를 설정하다보면, 상위 인프라에 헬스 체크를 제공하게 된다. 쿠버네티스도 똑같다. 파드의 스펙에 각 컨테이너의 라이브니스 프로브(liveness probe)를 지정할 수 있다. 쿠버네티스는 주기적으로 프로브를 실행하고 실패할 경우 컨테이너를 재시작한다. HTTP GET, TCP SOCKET, EXEC 명령 실행 3가지 방법으로 이루어진다.

 

HTTP Liveness Probe

//server.js
const http = require('http');

let count = 0;

const handler = function(rq, rs) {
  console.log('http 프로브')
  count++;
  if (count > 5) {
    rs.writeHead(500);
    rs.end();
    return;
  }
  rs.writeHead(200);
  rs.end();
};

const server = http.createServer(handler);
server.listen(8080);
apiVersion: v1
kind: Pod
metadata:
  name: suk9-liveness
spec:
  containers:
  - name: suk9-test
    image: seokkyulee/suk9
    livenessProbe:
      httpGet:
        path: /
        port: 8080

server.js를 이미지로 만들고, 쿠버네티스로 띄웠다고 생각해보자. 8080 포트로 HTTP 프로브를 이용한 헬스체크가 진행될 것이고, 5번이 넘어가는 순간 헬스체크는 실패하게 될 것이다.

kubectl logs suk9-liveness
kubectl describe po suk9-liveness

로그와 디스크립션을 확인해보자.

Last State:     Terminated
      Reason:       Error
      Exit Code:    137

137번 코드를 남기고 종료된 것을 알 수 있다. 코드의 의미는 128 + 시그널 번호이며 9번 시그널 번호로 종료되었음을 알 수 있다.(프로세스 kill에서 9번은 강제 종료다.)

 

kubectl describe를 통해 라이브니스 프로브에 관해 추가적인 정보도 알 수 있다.

delay=0s : 컨테이너가 시작된 후, 프로브가 바로 시작된다.

timeout=1s : 컨테이너는 프로브에 1초 안에 응답해야 한다.

period=10s : 컨테이너는 10초마다 프로브를 수행한다.

failure=3 : 3번 연속 실패하면 컨테이너는 재시작된다.

 

그런데 컨테이너 입장에서 delay=0s는 너무 가혹하다. 애플리케이션 시작 시간을 고려해야 하기 때문이다.

초기 15초를 감안해, 프로브를 설정한다.

위처럼 프로브를 정의하면서, 속성 값들을 설정할 수 있다. 

 

라이브니스 프로브는 굉장히 단순하지만, 강력하다. 그렇기때문에 운영 환경에서는 필수적으로 정의해야 한다. 컨테이너가 비정상 상태인지를 알려주고, 이를 통해 재시작 여부를 결정할 수 있기 때문이다.

당연히 라이브니스 프로브는 간결해야 한다. 프로브에 재시도를 포함한 특별한 로직은 필요없다. (실제 쿠버네티스는 실패 임계값을 1로 설정하더라도, 여러번 요청을 한다.)

 

이제 우리는 컨테이너에 문제가 발생한 경우 라이브니스 프로브를 통해 재시작한다는 것을 알게 되었다.

 

그런데 만약 노드에서 라이브니스 프로브를 통해 컨테이너를 재시작하는데, 그 노드에 문제가 발생했다면 어떻게 될까?

레플리카에 대해 다음장에서 공부해보자.