# Liveness 프로브 구성

## 1. 프로브 구성하기

아래 명령을 사용하여 디렉토리를 만듭니다.

```
mkdir -p ~/environment/healthchecks
```

다음 코드 블록을 실행하여 manifest 파일 **\~/environment/healthchecks/liveness-app.yaml**을 생성합니다. 구성 파일에서 *livenessProbe* 필드는 kubelet이 컨테이너가 정상인지 여부를 고려하기 위해 컨테이너를 확인하는 방법을 결정합니다. kubelet은 periodSeconds 필드를 사용하여 컨테이너를 자주 확인합니다. 이 경우 kubelet은 5초 마다 활성 상태 프로브를 확인합니다. initialDelaySeconds 필드는 kubelet에게 첫 번째 프로브를 수행하기 전에 5초 동안 기다려야 함을 알리는 데 사용됩니다. 프로브를 수행하기 위해 kubelet은 이 파드를 호스팅하는 서버에 HTTP GET 요청을 보내고 서버 /health에 대한 핸들러가 성공 코드를 반환 하면 컨테이너를 정상으로 간주 합니다. 핸들러가 실패 코드를 반환 하면 kubelet은 컨테이너를 종료하고 다시 시작 합니다.

```
cat <<EoF > ~/environment/healthchecks/liveness-app.yaml
apiVersion: v1
kind: Pod
metadata:
  name: liveness-app
spec:
  containers:
  - name: liveness
    image: brentley/ecsdemo-nodejs
    livenessProbe:
      httpGet:
        path: /health
        port: 3000
      initialDelaySeconds: 5
      periodSeconds: 5
EoF

```

manifest를 적용하여 포드를 만들어 보겠습니다.

```
kubectl apply -f ~/environment/healthchecks/liveness-app.yaml
```

위의 명령은 활성 상태 프로브가 있는 파드를 생성 합니다.

```
kubectl get pod liveness-app
```

출력은 다음과 같습니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhDJuhSxzH7tyZ1PLtY%2F-MhDmQh7d5QdKLHDcx31%2Fimage.png?alt=media\&token=c58d2e39-bb2b-4636-b9f5-d7938562e0c9)

`kubectl describe` 명령은 모든 프로브 실패 또는 재시작을 보여 주는 이벤트 기록을 표시 합니다.

```
kubectl describe pod liveness-app
```

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhDJuhSxzH7tyZ1PLtY%2F-MhDmZxKqCMYoIHuBc7x%2Fimage.png?alt=media\&token=0f6b5ae6-362b-4022-a684-5a284f876d03)

## 2. 실패 확인하기

다음 명령을 실행하여 SIGUSR1 신호를 nodejs 애플리케이션에 보냅니다. 이 명령을 실행하면 docker 런타임의 애플리케이션 프로세스에 kill 신호를 보냅니다.

```
kubectl exec -it liveness-app -- /bin/kill -s SIGUSR1 1
```

15-20초 동안 기다린 후 `kubectl describe` 명령을 수행하면 컨테이너를 종료하고 다시 시작하는 kubelet 작업을 확인할 수 있습니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhDJuhSxzH7tyZ1PLtY%2F-MhDn-kGWGWmYswzjklX%2Fimage.png?alt=media\&token=f69b7dac-bb32-4a20-a133-7dfdb580c95f)

nodejs 애플리케이션이 SIGUSR1 신호로 디버그 모드에 진입 했을 때 상태 확인 핑에 응답하지 않았고 kubelet이 컨테이너를 종료했습니다. 컨테이너에는 재시작 정책이 기본으로 적용 되었 있습니다.

```
kubectl get pod liveness-app
```

출력은 다음과 같습니다.

![](https://1998608250-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MhByD5wv8eUbA5ZbUY5%2F-MhDJuhSxzH7tyZ1PLtY%2F-MhDnBTp-S--T-uUbKoC%2Fimage.png?alt=media\&token=3342943c-c63e-4a8b-a6bd-1f13cffb793b)

컨테이너 health check를 확인하기 위해서 아래 명령어를 수행할 수 있습니다.

```
kubectl logs liveness-app
```

컨테이너가 충돌 한 경우 `--previous` 플래그로 컨테이너의 이전 인스턴스화에서 로그를 검색하기 위해 `kubectl logs`를 사용할 수도 있습니다.

```
kubectl logs liveness-app --previous
```
