로그에 200 OK가 표시되는 동안 Kubernetes 활성 프로브가 HTTP 503을 얻는 이유를 어떻게 알 수 있나요?

로그에 200 OK가 표시되는 동안 Kubernetes 활성 프로브가 HTTP 503을 얻는 이유를 어떻게 알 수 있나요?

Apache httpd를 사용하여 포드를 배포했습니다(공식 이미지, 태그 2.4.41), 포트 8082에서 HTTP/2.0 일반 텍스트를 제공하고 "정상적으로" 작동하지만 몇 시간마다 다시 시작되는 것을 볼 수 있습니다( kubectl get pod/mypod, 5일 동안 60번의 다시 시작 표시).

로그는 항상 표시됩니다."SIGWINCH를 포착하여 정상적으로 종료했습니다."( -p, 이전 포드의 경우):

$ kubectl logs -c httpdcontainer -p pod/mypod
  [...]
  127.0.0.1 - - [15/Jan/2020:11:12:27 +0000] "GET / HTTP/2.0" 200 9578
  [Wed Jan 15 11:12:40.433582 2020] [mpm_event:notice] [pid 1:tid 139963289400448] AH00492: caught SIGWINCH, shutting down gracefully
  127.0.0.1 - - [15/Jan/2020:11:12:37 +0000] "GET / HTTP/2.0" 200 9578

SIGWINCH 신호는 아마도 Docker(공식 Dockerfile에 따라)(예: Kubernetes 활성 프로브)? GET 요청은 /에 구성된 활성 프로브이지만, 보시다시피 Apache는 200 OK를 정상적으로 반환합니다.

Kubernetes kubelet은 Apache의 200 OK에 동의하지 않는 것으로 보이며 의도적으로 포드를 다시 시작합니다.

$ kubectl describe pod/mypod
[...]
Type     Reason     Age                       From                                    Message
----     ------     ----                      ----                                    -------
Warning  Unhealthy  38m (x208 over 5d)        kubelet, node01.kube.mydomain.tld  Readiness probe failed: Get http://192.168.87.178:8082/: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
Normal   Killing    38m (x60 over 4d23h)      kubelet, node01.kube.mydomain.tld  Container docs failed liveness probe, will be restarted
Warning  Unhealthy  38m (x221 over 5d)        kubelet, node01.kube.mydomain.tld  Liveness probe failed: Get http://192.168.87.178:8082/: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
Normal   Pulled     38m (x60 over 4d23h)      kubelet, node01.kube.mydomain.tld  Container image "myregistry.mydomain.tld/foo/bar/myimage@sha256:<checksum>" already present on machine
Normal   Created    38m (x61 over 5d19h)      kubelet, node01.kube.mydomain.tld  Created container docs
Normal   Started    38m (x61 over 5d19h)      kubelet, node01.kube.mydomain.tld  Started container docs
Warning  Unhealthy  13m (x1644 over 5d19h)    kubelet, node01.kube.mydomain.tld  Readiness probe failed: HTTP probe failed with statuscode: 503
Warning  Unhealthy  3m16s (x1717 over 5d19h)  kubelet, node01.kube.mydomain.tld  Liveness probe failed: HTTP probe failed with statuscode: 503

나는 여기서 무엇이 비난을 받는지 어떻게 알 수 있는지 전혀 모릅니다. 저는 kubeadm 및 Calico CNI와 함께 배포된 Kubernetes 1.16.4를 사용하고 있습니다.

답변1

이 내용을 점점 더 자세히 살펴보면 Docker 데몬이 시스템 로그에 기록된 메모리 제한을 초과하여 컨테이너를 종료한 것으로 보입니다.

Jan 15 12:12:40 node01 kernel: [2411297.634996] httpd invoked oom-killer: gfp_mask=0x14200ca(GFP_HIGHUSER_MOVABLE), nodemask=(null), order=0, oom_score_adj=998
[...]
Jan 15 12:12:40 node01 kernel: [2411297.672084] oom_reaper: reaped process 519 (httpd), now anon-rss:0kB, file-rss:0kB, shmem-rss:68kB
  • httpd가 갑자기 메모리 제한을 초과하는 이유는 여전히 의문이지만 여기서는 범위를 벗어납니다.
  • Kubernetes가 메모리 제한 초과로 인해 컨테이너가 종료되었다고 보고하지 않는 이유(문서에 따른 lastState 보고서) 나에게 여전히 질문이 남아 있습니다.
  • 컨테이너가 stdout/stderr에 기록되기 전에 Docker 데몬에 의해 종료되기 때문에 로그에는 503 응답의 출력이 표시되지 않을 수 있습니다.
  • 메모리 부족이 원인인 경우 여기서 이벤트 순서를 여전히 이해하지 못합니다. 왜냐하면 먼저 정상적인 종료 신호를 수신하고 응답이 kubelet에 의해 503으로 기록되기 때문입니다(시간 초과 아님).

이것이 원인이라 하더라도 쿠버네티스 관리자가 찾아내기에는 매우 나쁜 UX이다.

관련 정보