首页 > 解决方案 > 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 

我真的很好奇,我在这里错过了什么吗?

标签: dockerkubernetesgoogle-cloud-platformmicroservices

解决方案


每个 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 或其他任何端口。


推荐阅读