我正在构建一个微服务全栈Web应用程序(到目前为止):
ReactJS (client microservice) : listens on 3000
Authentication (Auth microservice) : listens on 3000 // accidently assigned the same port
从技术上讲,到目前为止,我已经听到/了解到的是,我们不能在同一端口上运行两个Pod。
我真的很困惑如何在不同的应用程序/容器上使用相同的端口(完全)运行这样的应用程序?
ingress-nginx配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
## our custom routing rules
rules:
- host: ticketing.dev
http:
paths:
- path: /api/users/?(.*)
backend:
serviceName: auth-srv
servicePort: 3000
- path: /?(.*)
backend:
serviceName: client-srv
servicePort: 3000
我真的很好奇,我在这里想念什么吗?
最佳答案
每个Pod都有自己的网络 namespace 和IP地址,尽管Pod专用的IP地址无法从群集外部访问,也无法在群集内部真正发现。由于每个Pod都有其自己的IP地址,因此您可以拥有任意数量的Pod,让他们都收听同一端口。
每个服务还具有自己的IP地址。同样,尽管它们具有DNS名称,但从群集外部无法访问,因此应用程序可以找到它们。由于每个服务都有其自己的IP地址,因此您可以拥有所有要监听同一端口的任意数量的服务。服务端口可以与Pod端口相同或不同。
可通过HTTP从群集外部访问Ingress Controller 。您显示的Ingress规范定义了HTTP路由规则。如果我使用.dev
TLD设置了DNS服务,并为指向入口 Controller 的ticketing.dev
定义了A记录,则http://ticketing.dev/api/users/anything
将转发到集群中的http://auth-srv.default.svc.cluster.local:3000/
,而http://ticketing.dev/otherwise
会转到http://client-srv.default.svc.cluster.local:3000/
。这些反过来将被转发到他们所连接的任何Pod。
没有特别禁止多个具有相同端口的Pod或服务。我倾向于将所有HTTP服务设置为侦听端口80,因为它是标准HTTP端口,即使各个Pod侦听端口3000或8000或8080或其他端口也是如此。
关于docker - Kubernetes:在同一端口上运行的微服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62734966/