Kubernetes는 자체적으로 self-healing이 가능한데요.
시스템이 영향을 받을 때마다 pod, container 단위로 상태를 감지하고, 비정상적인 경우 자체적으로 교체하여 안정적인 서비스를 유지할 수 있도록 도와줍니다.
Self-healing Kubernetes restarts containers that fail, replaces containers, kills containers that don’t respond to your user-defined health check, and doesn’t advertise them to clients until they are ready to serve.
컨테이너가 동작 중인지 여부를 나타낸다.
만약 활성 프로브(liveness probe)에 실패한다면, kubelet은 컨테이너를 죽이고, 해당 컨테이너는 재시작 정책의 대상이 된다.
만약 컨테이너가 활성 프로브를 제공하지 않는 경우, 기본 상태는 Success 이다.
k8s가 아무런 설정없이 자체적으로 모든 실패한 케이스에 대해 식별할 수는 없습니다.
배포나 운영 중에 container, pod가 죽는 경우 k8s가 식별할 수 있어서 바로 replica와 교체하면서 운영 pod를 유지하며 빠르게 교체가 가능하지만, pod내 사용자가 만든 application에서 panic 등 실제 application이 죽지 않는 경우의 여러 가지 상황의 에러를 감지할 수 없습니다..
예를 들어봅시다, Get /backend/api/actuator/health
가 500에러가 나는 경우는 어떻게 파악할까요?
k8s는 liveness라는 probe를 통해 pod의 상태를 식별할 수 있도록 제공합니다.
사용자가 정의해둔 로직에 따라 구별할 수 있는데요.
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: livenessTest
image: imageAddress
livenessProbe:
httpGet:
path: /backend/api/actuator/health
port: 8080
httpHeaders:
- name: X-API-Key
value: IfHaveAPIKeyWriteThis
initialDelaySeconds: 1
periodSeconds: 3
periodSeconds에 따라 3초마다 livenessProbe를 수행하고요. 시작 전 1초의 딜레이를 가집니다.
livenessProbe가 시작되면 Get host:8080/backend/api/actuator/health
로 웹 요청이 발생합ㄴ디ㅏ.
이 때 header는 지정된 X-API-Key: IfHaveAPIKeyWriteThis
가 포함되어 전송 됩니다.
성공 시 pass, 실패 시 container를 재시작합니다.
여기서 하나 주의깊게 봐야할 점은 HTTP Response Code가 200~399번때 까지는 Success, 나머지는 Fail 로 본다는 점입니다.
추가로 livenessProbe에 httpGet 으로 지정된 부분은 livenessProbe에서 HTTPGetAction 액션 사용을 위한 내용이며, 다른 액션을 사용하면 TCP 기반이나 Exec 기반으로도 점검이 가능합니다.
총 3가지를 지원하며 내용은 아래와 같습니다.
컨테이너가 요청을 처리할 준비가 되었는지 여부를 나타낸다.
만약 준비성 프로브(readiness probe)가 실패한다면, 엔드포인트 컨트롤러는 파드에 연관된 모든 서비스들의 엔드포인트에서 파드의 IP 주소를 제거한다.
준비성 프로브의 초기 지연 이전의 기본 상태는 Failure이다. 만약 컨테이너가 준비성 프로브를 지원하지 않는다면, 기본 상태는 Success 이다.
컨테이너 내의 애플리케이션이 시작되었는지를 나타낸다.
스타트업 프로브(startup probe)가 주어진 경우, 성공할 때 까지 다른 나머지 프로브는 활성화 되지 않는다. 만약 스타트업 프로브가 실패하면, kubelet이 컨테이너를 죽이고, 컨테이너는 재시작 정책에 따라 처리된다. 컨테이너에 스타트업 프로브가 없는 경우, 기본 상태는 Success 이다.