쿠버네티스 API 서버는 현재 상태를 나타내는 API 엔드포인트를 제공한다. 이를 각 컨테이너의 상태를 주기적으로 체크해서, 문제가 있는 컨테이너를 자동으로 재시작하거나 또는 문제가 있는 컨테이너(Pod를) 서비스에서 제외할 수 있다.
1. Probe란?
Probe를 통해 쿠버네티스는 각 컨테이너의 상태를 주기적으로 체크하여 문제를 판단할 수 있다. 그래서 이 문제가 있는 컨테이너를 자동으로 재시작하거나 또는 문제가 있는 컨테이너를 서비스에서 제외할 수 있다.
kubelet은 실행 중인 컨테이너에 대해 세 가지 종류의 프로브를 지정할 수 있다.
- Liveness probe : 제일 먼저 애플리케이션의 상태를 체크한다. 그래서 서버가 제대로 응답하는지 혹은 컨테이너가 제대로 동작중인지를 검사한다.
- Pod은 정상적인 Running 상태이지만, 애플리케이션에 문제가 생겨서 접속이 안되는 경우를 감지한다. (메모리 오버플로우 등) 문제를 감지하면 Pod을 죽이고 재실행하여 애플리케이션의 문제를 해결한다.
- Readiness probe : 컨테이너가 요청을 처리할 준비가 되었는지 확인한다. 이 Probe를 실패하면 Kubernetes는 Pod를 서비스에서 제외하고 다른 Pod로 요청을 전달한다. 이를 통해 요청을 처리할 준비가 되지 않은 Pod에 대한 요청을 방지할 수 있다.
- Liveness Probe와의 차이 : Liveness Probe는 probe 핸들러 조건 아래 fail이 나면 pod을 재실행 시키지만 Readiness Probe는 pod을 서비스로부터 제외시킨다.
- Startup probe : 컨테이너 내의 애플리케이션이 시작되었는지를 나타낸다. startup probe가 주어진 경우, 성공할 때 까지 다른 나머지 prob는 활성화 되지 않는다. 만약 startup probe가 실패하면, kubelet이 컨테이너를 죽이고, 컨테이너는 재시작 정책에 따라 처리된다.
2. Handler
컨테이너의 상태를 진단하기 위해 어떻게 진단할 것인지 명시한 것이 Handler이다.
kubelet은 컨테이너의 상태를 진단하기 위해 핸들러를 호출하는데 핸들러는 수행하는 작업의 분류에 따라서 ExecAction, TCPSocketAction, HttpGetAction로 나뉜다.
- ExecActionExecAction은 컨테이너에서 지정된 명령어를 실행한다. 명령어를 실행했을 때 exit code가 0이면 성공, 이외의 값은 실패로 분류한다.
exec:
command:
- cat
- /etc/nginx/nginx.conf
- TCPActionTCPAction은 지정된 포트로 TCP 소켓 연결을 시도한다.
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
- HttpGetAction지정된 포트와 url로 HTTP Get 요청을 전송하며, 응답 상태가 200 ~ 400 구간에 속하는 경우 성공, 이외에는 실패로 분류한다.
httpGet:
path: /healthz
port: liveness-port
3. readinessProbe 실습하기
1) yaml 파일 작성하기
# probe-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: probe-test
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /none_exist #이 부분이 포인트
port: 80
periodSeconds: 10
livenessProbe:
httpGet:
path: /
port: 80
periodSeconds: 10
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
command: ["/bin/sh"]
args: ["-c", "echo $POD_IP both probe work normally > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30124
위와 같이 yaml파일을 작성해준다.
2) 파일 생성하기
kubectl apply -f probe-test.yaml
위와 같은 명령어를 넣어 파일을 생성해준다.
그러고 나면 해당 deployment와 service가 생성된다.
3) 페이지 작동하는지 확인하기
위와 같이 페이지가 작동하지 않음을 알 수 있다.
4) 오류사항 확인하고 수정하기
yaml파일에서 파일 경로를 /none_exist로 설정한 부분을 /으로 바꿔준다. nginx 서버에서 해당 경로가 없기에 probe가 항상 실패한다. 그러므로 이를 바꿔주면 유효한 경로이기에 페이지가 제대로 작동함을 확인할 수 있다.
5) 작동하는 거 확인하기
위와 같이 yaml파일에 작성한 것처럼 페이지에도 띄워짐을 확인할 수 있다.
4. livenessProbe 실습하기
1) yaml 파일 수정하기
probe-test.yaml 파일의 27번 line의 값을 / → /none_exist 로 변경하고 배포한다.
만약 27번이 무엇인지 모르겠다면
:set number
를 하면 쉽게 확인이 가능하다.
2) pod 상태 확인하기
pod의 restarts탭을 확인해보면 여러번 restart됨을 알 수 있다. 이는 약 60초가 지나면 restart됨을 알 수 있다.
파일을 안 고치면 이렇게 몇번이고 restart를 하는 듯하다. 이러면 비효율적이니 코드로 제대로 고쳐준다.
3) 정상적으로 배포하기
해당 코드를 다시 고쳐주면 restart가 안된다.
👇🏻 참고 사이트
https://kubernetes.io/ko/docs/reference/using-api/health-checks/