Я пытаюсь установить пару рабочих kubernetes на инстансах EC2 и сталкиваюсь с проблемой, когда служба, похоже, не «видит» все поды, которые она должна видеть.
Моя точная среда - это пара AWS Snowballs, красный и синий, и мой кластер выглядит как control
, worker-red
, и worker-blue
[1]. Я развертываю фиктивный сервер python, который ждет GET на порту 8080 и отвечает локальным именем хоста. Я установил достаточно реплик, чтобы оба worker-red
и worker-blue
иметь по крайней мере по одной капсуле. Наконец, я создал сервис, спецификация которого выглядит как
spec:
type: NodePort
selector:
app: hello-server
ports:
- port: 8080
targetPort: 8080
nodePort: 30080
Теперь я могу проверить, поднялись ли мои стручки
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-world-deployment-587468bdb7-hf4dq 1/1 Running 0 27m 192.168.1.116 worker.red <none> <none>
hello-world-deployment-587468bdb7-mclhm 1/1 Running 0 27m 192.168.1.126 worker.blue <none> <none>
Теперь я могу попытаться завить их
curl worker-red:30080
greetings from hello-world-deployment-587468bdb7-hf4dq
curl worker-blue:30080
greetings from hello-world-deployment-587468bdb7-mclhm
Так бывает примерно в половине случаев. В другой половине времени завиток завершается с ошибкой тайм-аута. В частности, curling worker-red даст ответ ТОЛЬКО от hf4dq, а curling worker-blue даст ответ ТОЛЬКО от mclhm. Если я оцеплю и осушу рабочий-синий, чтобы оба моих модуля работали на рабочем-красном, таймаута никогда не будет, и оба модуля ответят.
Похоже, что служба NodePort не достигает модулей, которых нет на узле, который я скручиваю. Насколько я понимаю, сервисы должны работать не так. Что мне не хватает?
[1] Если я настрою так, что у меня будет два воркера на Red, произойдет та же проблема, которую я описываю, но это мой основной вариант использования, поэтому я сосредоточусь на нем.
Трудно просто сказать, что здесь может быть не так, но есть несколько шагов, которые вы можете предпринять, чтобы устранить вашу проблему:
kubectl logs ${POD_NAME} ${CONTAINER_NAME}
kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}
Сервис существует?
Работает ли Сервис по DNS-имени?
Сервис работает по IP?
Правильно ли определена служба?
Есть ли у службы какие-либо конечные точки?
Кубе-прокси работает?
Выполнение этих шагов поможет вам найти причину вашей проблемы, а также лучше понять механизмы, стоящие за услугами.