首页 > 解决方案 > Kubernetes入口控制器相同路径多个端口

问题描述

我在 node js 中有一个应用程序,它公开 2 个端口,80 个用于 web,5000 个用于带有 websockets 的通知服务。我想在 azure kubernetes 服务中进行部署,并按照教程https://docs.microsoft.com/en-us/azure/aks/ingress-tls进行操作。一切正常,但 websockets 不行。

这是入口控制器的 yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dih-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/use-regex: "true"
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  tls:
  - hosts:
    - www.mydomain.com
    secretName: tls-secret
  rules:
  - host: www.mydomain.com
    http:
      paths:
            
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: dihkub-9865
            port:
              number: 80

这是服务 yaml 中的端口配置:

spec:
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
    - name: websocket
      protocol: TCP
      port: 5000
      targetPort: 5000
  selector:
    app: dihkub-9865
  clusterIP: 10.0.147.128
  type: ClusterIP

我是新手,很抱歉我的英语不好,谢谢

编辑:这是入口控制器的新 yaml 文件

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dih-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/use-regex: "true"
    cert-manager.io/cluster-issuer: letsencrypt

 
spec:
  tls:
  - hosts:
    - www.mydomain.com
    
    secretName: tls-secret
  rules:
  - host: www.mydomain.com
    http:
      paths:
      - path: /socket.io/(.*)
        backend:
          service: 
            name: dihkub-9865
            port: 
              number: 5000
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: dihkub-9865
            port:
              number: 80

带有 url /socket.io/ 的请求返回错误 502,现在我将服务与负载均衡器一起放置,所以现在我有 2 个公共 IP,入口控制器处理对端口 80 的请求,服务处理来自 websocket 的请求。这是不对的,但现在它有效:(

尽管 websockets 使用的证书无效,因为它们不适用于入口控制器中配置的域,并且拥有 2 个公共 IP 有点贵。

标签: kubernetesazure-aksnginx-ingress

解决方案


You probably need something like:

      - path: /websockets
        pathType: Prefix
        backend:
          service:
            name: dihkub-9865
            port:
              number: 5000

Or whatever path you want to use for the websockets server.


推荐阅读