MiddleДебаггингЧастоЕщё не отвечали
Клиенты получают таймауты к Service web, хотя Pod работают — разберитесь.
Клиенты, обращающиеся к Service web, получают таймауты соединения, хотя Pod в Running и Ready. Ниже — что вы видите. Объясните, почему трафик не доходит до Pod и как это починить.
$ kubectl get svc web
NAME TYPE CLUSTER-IP PORT(S) AGE
web ClusterIP 10.96.0.42 80/TCP 10m
$ kubectl get endpoints web
NAME ENDPOINTS AGE
web <none> 10m
$ kubectl get pods -l app=web --show-labels
No resources found in default namespace.
$ kubectl get pods --show-labels
NAME READY STATUS LABELS
web-abc-123 1/1 Running app=webapp,role=frontend
web-abc-456 1/1 Running app=webapp,role=frontend
$ kubectl describe svc web | grep Selector
Selector: app=web
Дайте диагноз и фикс.
Список endpoints пуст, поэтому у Service нет бэкендов и запросы отваливаются по таймауту. Pod в Ready, но их метка app=webapp не совпадает с селектором Service app=web, поэтому ни один не включён. Чините выравниванием селектора или переметкой Pod.
- ✗Винить kube-proxy или DNS вместо чтения пустого Endpoints
- ✗Считать, что Service матчит Pod по префиксу имени, а не по селектору меток
- ✗Полагать, что больше реплик или ожидание заполнят пустой Endpoints
- →Как выглядел бы пустой Endpoints, если бы падала readiness?
- →Какая команда быстро проверит, матчит ли селектор хоть какие-то Pod?
Решение
Симптом — таймауты, а не отказ: значит трафик уходит на ClusterIP 10.96.0.42, но за ним никого нет.
- Ключевая улика —
kubectl get endpoints webпоказывает<none>. У Service нет ни одного бэкенда, поэтому kube-proxy некуда направлять пакеты, и клиент ждёт до таймаута. - Почему Endpoints пуст: Service отбирает Pod по селектору
app=web, но реальные Pod помеченыapp=webapp(см.--show-labels).kubectl get pods -l app=webне находит ничего — селектор не матчит ни один Pod. - Фикс — устранить несовпадение: либо выровнять селектор Service на
app=webapp, либо переметить Pod наapp=web. Обычно правят Service:
kubectl patch svc web -p '{"spec":{"selector":{"app":"webapp"}}}'
kubectl get endpoints web # теперь показывает IP:порт двух Pod
Правило: пустой Endpoints почти всегда значит несовпадение селектора и меток Pod — или что ни один Pod не в Ready. Здесь Pod готовы, значит дело в метках.