如何在一个 80 端口的入口中暴露多个端口的服务

How to expose service with multiple port in one ingress with one 80 port

我想通过一个 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: /
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 时,它总是 returns 503 状态码。

servicePort: 80 并不意味着 nginx 入口在端口 80 上服务。这实际上是后端服务上的端口,听起来您有 2 个端口:30004000.

默认情况下,nginx 入口控制器在端口 80 上提供服务,如果您启用了 TLS,还可以 or/and 443。在您的情况下,如果您想为这两个 API 提供服务,您只需将路径分开即可。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
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

✌️