저희 DevOps팀에 하나의 문의사항이 왔습니다.
"원래 새 버전 파드가 정상이어야 전 버전의 파드가 삭제되는 것 아닌가요? 새로운 버전의 파드가 비정상인데 이전 버전의 파드가 지워져서 서버가 내려갔습니다."
그래서 저는 probe를 둬야 할 것 같다고 답변했으나 정확히 어떤 probe를 둬야할지 바로 떠오르지 않았습니다. 그래서 이번 기회에 probe에 대해 공부하고 확실히 내 것으로 만들자는 생각이 들었습니다.
Ready와 Running은 kubectl get
명령어를 치면 쉽게 볼 수 있습니다.
혹시 Pod의 Ready상태와 Running상태의 차이점을 알고계신가요? Ready 다음이 Running이라고 생각하시는 분은 없으시겠죠?
일단 Ready와 Running은 같은 범주에 있는 상태값은 아닙니다.
Ready에 해당하는 범주는 파드의 컨디션(상태)입니다.
각 컨디션의 자세한 정보는 파드의 컨디션에서 확인 가능합니다.
컨디션을 결정하는 방법은 kubelet이 직접 검사해야 합니다. 이는 아래의 container probe에서 자세히 다루겠습니다.
Running은 파드의 단계를 나타내는 값입니다. 파드의 라이프사이클 중에서 어디 쯤에 있느냐를 나타내는 값이죠
각 단계의 정확한 정보는 파드의 단계(phase)에서 확인 가능합니다.
Ready
상태가 나타내는 정보는 조건을 검사하여 파드가 사용할 수 있는지입니다.
Running
단계가 나타내는 정보는 컨테이너를 실행했다는 것만 담고 있습니다.
위의 정보로 미루어보아 Running
단계이지만 Ready
상태가 아니면 파드(정확히는 컨테이너)가 정상이 아니라는 말이겠죠.
자 이제 Probe 얘기를 해봅시다. 위에서 Ready 상태가 되려면 필요한게 kubelet에 의한 검사라했는데 여기서 말하는 검사가 Container Probe 입니다. Container Probe에 설정된 값에 따라 kubelet은 주기적으로 진단을 수행합니다.
kubelet은 실행 중인 컨테이너들에 대해 선택적으로 세 가지 종류의 프로브를 수행하고 그에 반응할 수 있습니다.
예시와 주석으로 살펴봅시다
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30 # 첫 번째 프로브를 실행하기 전에 주는 Delay (default 0)
periodSeconds: 10 # kubelet이 얼마나 자주 진단을 할 지 나타냄 (default 10)
failureThreshold: 3 # 연속으로 몇 번 실패 시 실패인지 (default 3)
successThreshold: 1 # 연속으로 몇 번 성공 시 성공인지 (default 1)
자세한 내용은 Configure Probe에서 확인 가능합니다.
세 가지 Probe들의 기본값 (설정하지 않았을 때의 값)은 Success입니다. 즉 Probe를 설정하지 않으면 검사하지않고 Ready 상태를 나타내며 정상적이지 않은 파드로 교체될 수 있다는 뜻입니다. 결국 처음 문의받은 정상적이지 않은 파드로 교체된 이유는 Probe를 설정하지 않아서라고 할 수 있고 설정해야하는 Probe는 ReadinessProbe
입니다.
그 이유는 업데이트한 새 버전의 파드에 LivenessProbe
나 StartupProbe
가 설정되어 있었다면 이전 버전의 파드는 교체되고 새 파드의 Probe가 실패한 이후 계속 파드가 재시작되었을 것이기 때문입니다. ReadinessProbe
를 줌으로써 Deployment의 ReaplicaSet이 파드가 Ready 상태가 되지 않은 것을 확인하고 새 파드로 교체하지 않을 것입니다.
livenessProbe만 설정한 파드다
파드는 교체되지만 probe는 실패하고 이후에 계속 restart를 반복한다
오늘은 Pod의 상태와 Container Probe에 대해 알아봤습니다. 많은 도움이 되었기 바랍니다. 감사합니다!
https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle
https://malwareanalysis.tistory.com/637
https://cwal.tistory.com/30
https://www.openmaru.io/kubernetes-%EC%97%90%EC%84%9C-pod-%EC%97%90-%EB%8C%80%ED%95%9C-%ED%97%AC%EC%8A%A4%EC%B2%B4%ED%81%AC-probe/