Estoy tratando de poner en pie a un par de trabajadores de Kubernetes en instancias EC2 y me encuentro con un problema en el que el servicio no parece "ver" todos los pods que debería poder ver.
Mi entorno exacto es un par de AWS Snowballs, rojo y azul, y mi clúster se parece a control
, worker-red
y worker-blue
[1]. Estoy implementando un servidor Python ficticio que espera un GET en el puerto 8080 y responde con el nombre de host local. Lo configuré con suficientes réplicas para que ambas worker-red
tengan worker-blue
al menos una cápsula cada una. Finalmente, creé un servicio, cuyas especificaciones se ven así
spec:
type: NodePort
selector:
app: hello-server
ports:
- port: 8080
targetPort: 8080
nodePort: 30080
Ahora puedo comprobar que mis pods están activos.
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>
Ahora puedo intentar rizarlos.
curl worker-red:30080
greetings from hello-world-deployment-587468bdb7-hf4dq
curl worker-blue:30080
greetings from hello-world-deployment-587468bdb7-mclhm
Eso es lo que sucede aproximadamente la mitad de las veces. La otra mitad de las veces, el rizo falla con un error de tiempo de espera. Específicamente, rizar el rojo trabajador SÓLO producirá una respuesta de hf4dq, y rizar el azul trabajador SÓLO producirá una respuesta de mclhm. Si acordono y drenando el azul trabajador para que mis dos pods funcionen en rojo, nunca habrá un tiempo de espera y ambos pods responderán.
Parece que el servicio NodePort no llega a los pods que no están en el host que estoy rizando. Según tengo entendido, no es así como se supone que funcionan los servicios. ¿Qué me estoy perdiendo?
[1] Si configuro de modo que tenga dos trabajadores en Red, ocurre el mismo problema que estoy describiendo, pero este es mi caso de uso principal, por lo que me concentraré en él.
Respuesta1
Es difícil decir simplemente qué podría estar mal aquí, pero hay algunos pasos que puedes seguir para solucionar tu problema:
- Pods de depuración, especialmente verifique si hay algo sospechoso en los registros:
kubectl logs ${POD_NAME} ${CONTAINER_NAME}
kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}
- Servicios de depuración, por ejemplo marcando:
¿Existe el Servicio?
¿El Servicio funciona por nombre DNS?
¿El Servicio funciona por IP?
¿Está el Servicio definido correctamente?
¿El Servicio tiene algún punto final?
¿Está funcionando el proxy kube?
Seguir esos pasos le ayudará a encontrar la causa de su problema y también a comprender mejor los mecanismos detrás de los servicios.
Respuesta2
Está utilizando NodePort
un servicio de tipo, en cuyo caso lo que está observando es muy esperado.
Su servicio hace coincidir 2 pods que se ejecutan en dos nodos diferentes. Dado que el servicio es de tipo NodePort
, existe una asociación inherente entre un pod de su servicio y el nodo en el que se ejecuta. Si curva el worker-red
punto final, obtendráSOLOobtener la respuesta del worker-red
pod, esto se debe a que el otro pod está vinculado a otro punto final worker-blue:<node-port>
y no se puede acceder a él desde el worker-red
punto final. Sí, es el mismo servicio, pero está respaldado por 2 puntos finales, cada uno con diferentes nombres de host.
Básicamente así es como NodePort
funcionan los servicios.
Cuando los agrupa a ambos en el mismo nodo, se puede acceder a ambos pods desde el mismo nombre de host del nodo, por lo que rizar ambos funcionará. Desde ahora, ambos puntos finales se asignan a puertos diferentes, pero elmismo nombre de host.
Como una forma de mejorar su comprensión de esto. Puede intentar cambiar su tipo de servicio a LoadBalancer
. Y notará que podrá acceder a ambos pods utilizando el mismo nombre de host, independientemente de dónde se programen. Y este nombre de host/dirección IP será la dirección que LoadBalancer
todos los pods del servicio tendrán en común.
¡Espero que esto aclare tu confusión!