docker - Kubernetes:在同一个端口上运行的微服务?
问题描述
我正在构建一个微服务全栈 Web 应用程序(到目前为止):
ReactJS(客户端微服务):监听 3000
身份验证(Auth 微服务):监听 3000 // 意外分配了相同的端口
从技术上讲,到目前为止我所听到/了解到的是,我们不能让两个 Pod 在同一个端口上运行。我真的很困惑我如何能够(完美地)在不同的应用程序/pod上使用相同的端口运行应用程序?
入口-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 都有自己的网络命名空间和自己的 IP 地址,尽管特定于 Pod 的 IP 地址无法从集群外部访问,并且在集群内部也无法真正发现。由于每个 Pod 都有自己的 IP 地址,因此您可以拥有任意数量的 Pod,它们都侦听同一个端口。
每个服务也有自己的 IP 地址;同样,无法从集群外部访问,尽管它们具有 DNS 名称,因此应用程序可以找到它们。由于每个服务都有自己的 IP 地址,因此您可以拥有任意数量的服务,所有服务都侦听同一个端口。Service 端口可以与 Pod 端口相同或不同。
可以通过 HTTP 从集群外部访问 Ingress 控制器。您展示的 Ingress 规范定义了 HTTP 路由规则。.dev
如果我使用TLD设置 DNS 服务并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 或其他任何端口。
推荐阅读
- c++ - 检查路径是否引用目录,即使它不存在
- python - 索引numpy数组时numba @njit出错
- symfony - Symfony 4 - 为什么安全选民在返回 false 时会将我重定向到登录页面?
- node.js - Async / Await with NodeJS + Mongoose 不等待
- email - 从 SAS 中的电子邮件中获取数据
- python - 有人可以帮我简化我的 Python 函数吗?
- python - 尝试在 Path 对象 Python 上使用 /
- javascript - 用div jquery onload中的另一个div替换div文本
- java - 如何使用反射转储或写入修改后的 java.lang.Class 到文件?
- sql - 如何在 Oracle SQL 中将 max(0.10)+1 设为 0.11