본문 바로가기

AWS EKS 실습/EKS Beginner

HEALTH CHECKS 실습 (Liveness Probe/Readiness Probe)

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

 

 

'AWS EKS 실습 > EKS Beginner' 카테고리의 다른 글

Kubernetes access 관리를 위한 IAM Groups 사용  (1) 2021.02.25
Intro to RBAC  (0) 2021.02.24
Autoscaling with HPA and CA  (0) 2021.02.24
Helm으로 nginx 설치  (0) 2021.02.19
Sample Application 배포  (0) 2021.02.18