Зонд живучести, Зонд готовности не вызывается в ожидаемый срок
В GKE я попытался использовать зонд готовности / зонд живучести и опубликовать оповещение с помощью мониторинга https://cloud.google.com/monitoring/alerts/using-alerting-ui
в качестве теста я создаю контейнер с тестом готовности / живучести. Как я и ожидал, проверка датчика каждый раз терпела неудачу.
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: k8s.gcr.io/liveness
args:
- /server
readinessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 0
periodSeconds: 10
timeoutSeconds: 10
successThreshold: 1
failureThreshold: 3
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 20
periodSeconds: 60
timeoutSeconds: 30
successThreshold: 1
failureThreshold: 3
И, проверив журнал GCP, оба журнала ошибок сначала появились на основе периода в секундах.
Зонд готовности: каждые 10 секунд
2021-02-21 13:26:30.000 Ошибка проверки готовности JST: ошибка проверки HTTP с кодом состояния: 500
2021-02-21 13:26:40.000 Ошибка проверки готовности JST: сбой проверки HTTP с кодом состояния: 500
Зонд живучести: каждые 1 минуту
2021-02-21 13:25:40.000 Ошибка проверки работоспособности JST: ошибка проверки HTTP с кодом состояния: 500
2021-02-21 13:26:40.000 Ошибка проверки работоспособности JST: ошибка проверки HTTP с кодом состояния: 500
Но после запуска этого модуля несколько минут
- Проверка живучести больше не вызывалась
- Вызывается проверка готовности, но интервал становится длинным (максимальный интервал составляет около 10 минут)
$ kubectl get event
LAST SEEN TYPE REASON OBJECT MESSAGE
30m Normal Pulling pod/liveness-http Pulling image "k8s.gcr.io/liveness"
25m Warning Unhealthy pod/liveness-http Readiness probe failed: HTTP probe failed with statuscode: 500
20m Warning BackOff pod/liveness-http Back-off restarting failed container
20m Normal Scheduled pod/liveness-http Successfully assigned default/liveness-http to gke-cluster-default-pool-8bc9c75c-rfgc
17m Normal Pulling pod/liveness-http Pulling image "k8s.gcr.io/liveness"
17m Normal Pulled pod/liveness-http Successfully pulled image "k8s.gcr.io/liveness"
17m Normal Created pod/liveness-http Created container liveness
20m Normal Started pod/liveness-http Started container liveness
4m59s Warning Unhealthy pod/liveness-http Readiness probe failed: HTTP probe failed with statuscode: 500
17m Warning Unhealthy pod/liveness-http Liveness probe failed: HTTP probe failed with statuscode: 500
17m Normal Killing pod/liveness-http Container liveness failed liveness probe, will be restarted
В моем плане я бы создал политику предупреждений, состояние которой похоже на
- если ошибка датчика живучести происходит 3 раза за 3 минуты
но если зондирование не вызвало, как я ожидал, эта политика не сработала; даже если модуль не запущен, предупреждение стало исправлено
Почему не запускалась проверка живучести, а интервал проверки готовности изменился?
Примечание: если есть другая хорошая политика предупреждений для проверки работоспособности модуля, меня бы не волновало такое поведение. Я признателен, если кто-нибудь посоветует мне, какая политика предупреждений идеально подходит для проверки модуля.
1 ответ
Фон
В документации Configure Liveness, Readiness и Startup Probes вы можете найти информацию:
Кублет использует, чтобы знать, когда перезапустить контейнер. Например, проверки работоспособности могут обнаружить взаимоблокировку, когда приложение работает, но не может двигаться вперед. Перезапуск контейнера в таком состоянии может помочь сделать приложение более доступным, несмотря на ошибки.
Кублет использует
readiness probes
чтобы узнать, когда контейнер готов начать принимать трафик. Pod считается готовым, когда готовы все его контейнеры. Одно из применений этого сигнала — контролировать, какие поды используются в качестве серверных частей для сервисов. Когда под не готов, он удаляется из балансировщиков нагрузки службы.
Поскольку master управляется Google, вы не найдете
kubelet
журналы с использованием
CLI
(вы можете попробовать использовать
Stackdriver
). Я протестировал его на кластере и установил
verbosity
уровень до
8
.
При использовании вы получаете события только за последний час (это можно изменить в настройках Kubernetes —
Kubeadm
но я не думаю, что его можно изменить, так как мастер управляется Google.)
$ kubectl get events
LAST SEEN TYPE REASON OBJECT MESSAGE
37m Normal Starting node/kubeadm Starting kubelet.
...
33m Normal Scheduled pod/liveness-http Successfully assigned default/liveness-http to kubeadm
33m Normal Pulling pod/liveness-http Pulling image "k8s.gcr.io/liveness"
33m Normal Pulled pod/liveness-http Successfully pulled image "k8s.gcr.io/liveness" in 893.953679ms
33m Normal Created pod/liveness-http Created container liveness
33m Normal Started pod/liveness-http Started container liveness
3m12s Warning Unhealthy pod/liveness-http Readiness probe failed: HTTP probe failed with statuscode: 500
30m Warning Unhealthy pod/liveness-http Liveness probe failed: HTTP probe failed with statuscode: 500
8m17s Warning BackOff pod/liveness-http Back-off restarting failed container
Снова та же команда после
~1 hour
.
$ kubectl get events
LAST SEEN TYPE REASON OBJECT MESSAGE
33s Normal Pulling pod/liveness-http Pulling image "k8s.gcr.io/liveness"
5m40s Warning Unhealthy pod/liveness-http Readiness probe failed: HTTP probe failed with statuscode: 500
15m Warning BackOff pod/liveness-http Back-off restarting failed container
Тесты
Проверка выполняется каждые 10 секунд в течение более одного часа.
Mar 09 14:48:34 kubeadm kubelet[3855]: I0309 14:48:34.222085 3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 14:48:44 kubeadm kubelet[3855]: I0309 14:48:44.221782 3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 14:48:54 kubeadm kubelet[3855]: I0309 14:48:54.221828 3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
...
Mar 09 15:01:34 kubeadm kubelet[3855]: I0309 15:01:34.222491 3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4
562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 15:01:44 kubeadm kubelet[3855]: I0309 15:01:44.221877 3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 15:01:54 kubeadm kubelet[3855]: I0309 15:01:54.221976 3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
...
Mar 09 15:10:14 kubeadm kubelet[3855]: I0309 15:10:14.222163 3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 15:10:24 kubeadm kubelet[3855]: I0309 15:10:24.221744 3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 15:10:34 kubeadm kubelet[3855]: I0309 15:10:34.223877 3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
...
Mar 09 16:04:14 kubeadm kubelet[3855]: I0309 16:04:14.222853 3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 16:04:24 kubeadm kubelet[3855]: I0309 16:04:24.222531 3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Кроме того, есть
Liveness probe
записи.
Mar 09 16:12:58 kubeadm kubelet[3855]: I0309 16:12:58.462878 3855 prober.go:117] Liveness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 16:13:58 kubeadm kubelet[3855]: I0309 16:13:58.462906 3855 prober.go:117] Liveness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 16:14:58 kubeadm kubelet[3855]: I0309 16:14:58.465470 3855 kuberuntime_manager.go:656] Container "liveness" ({"docker" "95567f85708ffac8b34b6c6f2bdb4
9d8eb57e7704b7b416083c7f296dd40cd0b"}) of pod liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a): Container liveness failed liveness probe, will be restarted
Mar 09 16:14:58 kubeadm kubelet[3855]: I0309 16:14:58.465587 3855 kuberuntime_manager.go:712] Killing unwanted container "liveness"(id={"docker" "95567f85708ffac8b34b6c6f2bdb49d8eb57e7704b7b416083c7f296dd40cd0b"}) for pod "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a)"
Общее время испытаний:
$ kubectl get po -w
NAME READY STATUS RESTARTS AGE
liveness-http 0/1 Running 21 99m
liveness-http 0/1 CrashLoopBackOff 21 101m
liveness-http 0/1 Running 22 106m
liveness-http 1/1 Running 22 106m
liveness-http 0/1 Running 22 106m
liveness-http 0/1 Running 23 109m
liveness-http 1/1 Running 23 109m
liveness-http 0/1 Running 23 109m
liveness-http 0/1 CrashLoopBackOff 23 112m
liveness-http 0/1 Running 24 117m
liveness-http 1/1 Running 24 117m
liveness-http 0/1 Running 24 117m
Вывод
Проверка Liveness probe больше не вызывалась
Liveness check
создается, когда Kubernetes создает pod, и воссоздается каждый раз, когда
Pod
перезапускается. В вашей конфигурации вы установили
initialDelaySeconds: 20
поэтому после создания Kubernetes будет ждать 20 секунд, а затем вызовет
liveness
зонд 3 раза (как вы установили
failureThreshold: 3
). После сбоя 3 Kubernetes перезапустит этот модуль в соответствии с
RestartPolicy
. Также в логах вы сможете найти в логах:
Mar 09 16:14:58 kubeadm kubelet[3855]: I0309 16:14:58.465470 3855 kuberuntime_manager.go:656] Container "liveness" ({"docker" "95567f85708ffac8b34b6c6f2bdb4
9d8eb57e7704b7b416083c7f296dd40cd0b"}) of pod liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a): Container liveness failed liveness probe, will be restarted
Почему он будет перезапущен? Ответ можно найти в Container probes .
livenessProbe:
Указывает, запущен ли контейнер. Если проверка живучести дает сбой, kubelet убивает контейнер, и на контейнер распространяется его политика перезапуска.
Политика перезапуска по умолчанию в
GKE
является
Always
. Таким образом, ваш модуль будет перезапускаться снова и снова.
Проверка зонда готовности вызвана, но интервал стал длинным (максимальный интервал составляет около 10 минут)
Я думаю, что вы пришли к такому выводу, поскольку основывались на
$ kubectl get events
а также
$ kubectl describe po
. В обоих случаях события по умолчанию удаляются через 1 час. В моей части вы можете видеть, что записи из
14:48:34
пока
16:04:24
, поэтому каждые 10 секунд Kubernetes вызывает
Readiness Probe
.
Почему не запустилась проверка Liveness, а интервал проверки готовности изменился?
Как я показываю вам в
Tests
часть,
Readiness probe
не изменился. Вводящим в заблуждение в данном случае было использование
$ kubectl events
. Касательно
Liveiness Probe
он все еще звонит, но только 3 раза после того, как pod будет
created
/
restarted
. Также я включил вывод
$ kubectl get po -w
. Когда
pod
воссоздан, вы можете найти в журналах kubelet те
liveness probes
.
В моем плане я бы создал политику предупреждений, условие которой выглядит следующим образом:
- если ошибка проверки живучести происходит 3 раза за 3 минуты
Если
liveness probe
терпит неудачу 3 раза, с вашими текущими настройками он перезапустит этот модуль. В этой ситуации вы можете использовать каждый
restart
создать
alert
.
Metric: kubernetes.io/container/restart_count
Resource type: k8s_container
Некоторая полезная информация, которую вы можете найти в кейсах Stackoverflow, касающихся
Monitoring alert
как: