如何在具有一个80端口的一个入口中公开具有多个端口的服务

问题描述

我想通过一个80端口的入口公开我的两个API服务。

apiVersion: v1
kind: Service
metadata:
  name: my-api
spec:
  selector:
    app: my-api
  ports:
  - name: api1
    port: 3000
    targetPort: 3000
  - name: api2
    port: 4000
    targetPort: 4000
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  tls:
  - hosts:
    - example.com
    secretName: app-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /my-api(/|$)(.*)
        backend:
          serviceName: my-api
          servicePort: 80

但是当我尝试到达https://example.com/my-api时,它总是返回503状态代码。

解决方法

servicePort: 80并不意味着Nginx入口正在端口80上运行。这实际上是后端服务上的端口,听起来您有两个端口:30004000

默认情况下,nginx入口控制器在端口80上运行,并且如果您还启用了TLS或/和443。就您而言,如果您想同时使用这两个API,则只需将路径分开即可。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  tls:
  - hosts:
    - example.com
    secretName: app-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /my-api1(/|$)(.*)
        backend:
          serviceName: my-api
          servicePort: 3000
      - path: /my-api2(/|$)(.*)
        backend:
          serviceName: my-api
          servicePort: 4000

✌️

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...