首页 > 解决方案 > 根据端口号从入口 nginx 控制器转发到不同的 nginx pod

问题描述

在我的 k8s 系统中,我有一个 nginx 入口控制器作为 LoadBalancer,并将其访问到像 hedehodo.ddns.net 这样的 ddns 地址,这会触发将 Web 流量转发到另一个 nginx 端口。现在我部署了另一个适用于 node.js 应用程序的 nginx,但我无法将 nginx 入口控制器转发到端口 3000 的任何请求以转到另一个 nginx

这是 nginx 入口控制器 yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  namespace: default
spec:
  rules:
  - host: hedehodo.ddns.net
    http:
      paths:
      - path: /
        backend:
          serviceName: my-nginx
          servicePort: 80
      - path: /
        backend:
          serviceName: helloapp-deployment
          servicePort: 3000

helloapp 部署工作负载均衡器,我可以从 IP:3000 访问它

任何机构都可以帮助我吗?

标签: nginxkuberneteskubernetes-ingressnginx-ingress

解决方案


每个主机不能共享多个重复路径,因此在您的示例中,对 host: 的请求hedehodo.ddns.net将始终映射到列出的第一个服务:my-nginx:80

要使用其他服务,您必须指定不同的路径。该路径可以使用您想要的任何服务。您的入口应始终指向服务,并且该服务可以指向部署。

您还应该默认使用 HTTPS 作为您的入口。

入口示例:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
    - host: my.example.net
      http:
        paths:
          - path: /
            backend:
              serviceName: my-nginx
              servicePort: 80
          - path: /hello
            backend:
              serviceName: helloapp-svc
              servicePort: 3000

服务示例:

---
apiVersion: v1
kind: Service
metadata:
  name: helloapp-svc
spec:
  ports:
    - port: 3000
      name: app
      protocol: TCP
      targetPort: 3000
  selector:
    app: helloapp
  type: NodePort

部署示例:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloapp
  labels:
    app: helloapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helloapp
  template:
    metadata:
      labels:
        app: helloapp
    spec:
      containers:
        - name: node
          image: my-node-img:v1
          ports:
            - name: web
              containerPort: 3000

推荐阅读