본문 바로가기

⭐ Kubernetes & EKS/EKS

pod의 헬스체크 (Readiness Probe와 Liveness Probe)

728x90
반응형

# pod와 연결된 서비스를 모니터링하기

- pod와 연결된 서비스를 모니터링하는 방법은 2가지가 있다.
- Readiness Probe와 Liveness Probe 이다.

1. Readiness Probe : 애플리케이션의 정상여부  확인, 정상이라고 판단되면 서비스를 통해 트래픽을 수신
ex) 예를들어 애플리케이션이 동작할때 헬스체크 응답용 페이지를 생성해두고 HTTP로 그 페이지에 접속해 상태 코드가 200으로 돌아오면 서비스를 통해 접속하는 등의 방법을 사용할 수 있다.

- 예제 파일을 통해 확인 (전체 리소스 파일 - Readiness Probe와 Liveness Probe의 내용을 중점적으로 보자.)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-app
  labels:
    app: backend-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend-app
  template:
    metadata:
      labels:
        app: backend-app
    spec:
      containers:
      - name: backend-app
        image: ${ECR_HOST}/k8sbook/backend-app:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        env:
        - name: DB_URL
          valueFrom:
            secretKeyRef:
              key: db-url
              name: db-config
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              key: db-username
              name: db-config
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              key: db-password
              name: db-config
        readinessProbe:
          httpGet:
            port: 8080
            path: /health
          initialDelaySeconds: 15
          periodSeconds: 30
        livenessProbe:
          httpGet:
            port: 8080
            path: /health
          initialDelaySeconds: 30
          periodSeconds: 30
        resources:
          requests:
            cpu: 100m
            memory: 512Mi
          limits:
            cpu: 250m
            memory: 768Mi
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 2"]

- Readiness 부분만 확인
- /health 라는 경로에 대해 30초 간격으로 8080번 포트에 접속하여 정상 응답이 있을때만 요청을 받는 부분이다.

        readinessProbe:
          httpGet:
            port: 8080
            path: /health
          initialDelaySeconds: 15
          periodSeconds: 30

- Readiness Probe가 실패하면 파드 상태가 비정상으로 판단되어 Ready 상태가 되지 않고, 서비스에서 트래픽을 보내지 않는다. 정상 상태가 되면 그때 서비스에서 트래픽을 보내게 된다.

2. Liveness Probe : pod의 상태 모니터링, 실행중인 파드가 정상적으로 동작하는지 모니터링 한다. 

- 실제 예제를 통한 확인

        livenessProbe:
          httpGet:
            port: 8080
            path: /health
          initialDelaySeconds: 30
          periodSeconds: 30

- Liveness Probe가 실패하면 파드는 재시작을 시도한다. 또한 파드 이벤트에 그 내용이 출력되고 재시작 횟수를 센다.

3. pod 초기화에 걸리는 시간을 고려하여 Readiness Probe와 Liveness Probe를 설정하자.

- pod 는 일반적인 VM과 달리 상당히 빠르게 서비스가 실행되므로 실행 되기 전에 Readiness Probe와 Liveness Probe가 동작하여 상태체크 실패를 전달 할 수도 있다. 그런 문제를 방지하기 위해 초기화 지연 이라는 설정을 할 수 있다.
- 초기화 지연은 pod가 실행되는 시간을 초기에 늦추는 역할을 한다.
- initialDelaySeconds 부분을 보면 설정된 값들이 있다. 이 값들은 pod가 실행되고 해당 값만큼 시간을 늦추어 Readiness Probe와 Liveness Probe가 동작하도록 설정하는 부분이다.

        readinessProbe:
          httpGet:
            port: 8080
            path: /health
          initialDelaySeconds: 15
          periodSeconds: 30
        livenessProbe:
          httpGet:
            port: 8080
            path: /health
          initialDelaySeconds: 30
          periodSeconds: 30

4. pod를 안정하게 종료하기 위한 설정사항

- pod는 그 특성상 동작과 종료를 반복하고, 비동기 적으로 동작이 이루어 지므로 pod를 종료하는 도중에 서비스 요청을 수신하는 경우도 있다. 게다가 pod가 크면 클수록 동작과 종료가 늦어지므로, 해당 문제는 더욱 크게 발생한다.
- 서비스에서 분리하는 처리가 끝난이후 파드를 종료하는 작업이 이루어져야 문제가 없으므로 lifecycle 설정을 통해 문제를 방지 할 수 있다.

        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 2"]

- 파드의 라이프사이클을 이애하면 안전한 서비스를 계속 제공할 수있다. 

- 끝 - 

728x90
반응형