AWS EKS 실습/EKS Beginner

HEALTH CHECKS 실습 (Liveness Probe/Readiness Probe)

Clark Shim 2021. 2. 22. 22:56

Kubernetes는 어떠한 이유로  충돌이 발생하면 컨테이너를 다시 시작한다. Traffic을 보낼 정상 컨테이너를 식별하고 필요할 때 다시 시작하도록 구성할 수 있는 Liveness 및 Readiness Probe를 사용한다.

 

ㅁ Liveness Probe: Kubernetes에서 Pod가 살아있는지 죽었는지 확인할 때 사용된다. Pod는 다양한 이유로 Dead 상태로 될 수 있는데 Kubernetes는 Liveness probe가 통과하지 못하면 Pod를 죽이고 다시 만든다.

clarkshim.tistory.com/76?category=1003649

 

라이브니스 프로브 (Liveness Probe)

쿠버네티스는 라이브니스 프로브 (Liveness probe)를 통해 컨테이너가 아직 살아 있는지 확인 할 수 있다. 포드의 사양에서 각 컨테이너에 라이브니스 프로브를 지정할 수 있다. 쿠버네티스는 세 가

clarkshim.tistory.com

ㅁ Readiness Probe: 

Kubernetes에서 포드가 트래픽을 받을 준비가 되어 있는지 알기 위해 사용된다. Readiness Probe가 통과 할 때만 Pod가 서비스에 연결되어 트래픽을 수신한다.

 

Readiness Probe가 실패하면 트래픽이 Pod로 전송되지 않는다.

clarkshim.tistory.com/125

 

Readiness Probe - Pod가 연결을 수락할 준비가 됐을 때 신호 보내기

레디네스 프로브는 주기적으로 호출되고 특정 포드가 클라이언트 요청의 수락 여부를 결정한다. 컨테이너의 레디네스 프로브가 성공을 반환한다면 컨테이너가 요청을 받아드릴 준비가 되었다

clarkshim.tistory.com

 ㅁ Liveness Probe 구성

 

ㅇ릴단 healthcheck 디렉토리를 생성

 

mkdir -p ~/environment/healthchecks

 

아래와 같이 ~/environment/healthchecks/liveness-app.yaml 메니페스트를 만든다.

해당 파일에서 livenessProbe 필드는 kubelet이 컨테이너가 정상인지 여부를 고려하기 위해 컨테이너를 확인하는 방법을 결정한다.

 

- kubelet은 periodSeconds 필드를 사용하여 컨테이너를 지속적으로 확인합니다. 해당 yaml 파일에서 kubelet은 5초마다 liveness probe를 체크한다. 

- initialDelaySeconds 필드는 kubelet에게 첫번째 프로브를 수행하기 전에 5초 동안 기다려야 한다고 알리는데 사용한다.

- probe를 수행하기 위해 kubelet은 포드를 호스팅하는 서버에 HTTP GET 요청을 보내고 서버에 /helath에 대한 핸들러를 체크하여  success code를 return하면 컨테이너가 정상으로 간주하고 실패 코드를 return 하면 kubelete은 컨테이너를 종료하고 다시 시작한다.

 

ㅇ 매니페스트 생성

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:
        httpGet:
          path: /health
          port: 3000
        initialDelaySeconds: 5
        periodSeconds: 5
EoF

ㅇ 매니페스트로 Pod 생성

 

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

ㅇ liveness-app pod 상태 확인

 

$ kubectl get pod liveness-app

 

ㅇ kubectl describe 명령을 통해 프로브 실패 또는 재시작을 표시하는 이벤트 기록을 확인 가능

 

$ kubectl describe pod liveness-app

 

ㅇ 컨테이너 상태 확인

 

$ kubectl logs liveness-app

ㅇ kubectl logs 컨테이너의 이전 인스턴스화에서 로그를 검색하기 위해서는 --previous 플래그를 사용

 

$ kubectl logs liveness-app --previous

 

ㅁ Readiness Probe 구성

 

Readiness Probe를 구성하기 위해 빈 파일 /tmp/healthy를 생성하고 이를 사용하여 kubelet이 정상적인 포드만으로 Deployment를 업데이트하는데 어떻게 도움이 되는지 이해할 수 있다.

cat <<EoF > ~/environment/healthchecks/readiness-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: readiness-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: readiness-deployment
  template:
    metadata:
      labels:
        app: readiness-deployment
    spec:
      containers:
      - name: readiness-deployment
        image: alpine
        command: ["sh", "-c", "touch /tmp/healthy && sleep 86400"]
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 5
          periodSeconds: 3
EoF

 

이제 Readiness Probe를 테스트 하기 위해 Deployment를 만든다.

$ kubectl apply -f ~/environment/healthchecks/readiness-deployment.yaml

 

적용 상태를 확인한다.

$ kubectl get pods -l app=readiness-deployment

서비스가 deployment로 가리킬때 모든 리플리카는 트래픽을 처리할 수 있다는 것을 확인한다.

 

$ kubectl describe deployment readiness-deployment | grep Replicas:

 

ㅇ 실패 테스트

 

수행중인 파드중 하나의 /tmp/healthy 파일을 지워 readiness probe가 fail 되는 것을 확인

 

$ kubectl exec -it <YOUR-READINESS-POD-NAME> -- rm /tmp/healthy

 

정상적으로 연결이 되지 않는 것을 볼 수 있다.

 

$ kubectl get pods -l app=readiness-deployment

 

 

 

Pod를 다시 정상으로 만들려면 /tmp/healthy 파일을 다시 만든다.

 

$ kubectl exec -it <YOUR-READINESS-POD-NAME>> -- touch /tmp/healthy

 

ㅁ 테스트 환경을 제거하는 방법은 설치한 yaml을 가지고 그대로 삭제하면 된다.

 

$ kubectl delete -f ~/environment/healthchecks/liveness-app.yaml

$ kubectl delete -f ~/environment/healthchecks/readiness-deployment.yaml