【问题标题】:Kubernetes nginx-ingress how to deal with routing in ExpressKubernetes nginx-ingress 在 Express 中如何处理路由
【发布时间】:2019-07-18 19:54:34
【问题描述】:

我有一个 Azure Kubernetes 集群,其中运行了几个 NodesJS Express 应用程序。 我通过 nginx-ingress 处理传入的请求

nginx 入口

控制器:https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

服务:https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml

入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    #nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
  - http:
      paths:
      - path: /app1(/|$)(.*)
        backend:
          serviceName: app1-service
          servicePort: 80
      - path: /app2(/|$)(.*)
        backend:
          serviceName: app2-service
          servicePort: 80

示例 app1-service

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: app1
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: app1
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
      - name: nodejs
        image: xxx.azurecr.io/app1:v1.0
        imagePullPolicy: Always
        ports:
        - containerPort: 80
          protocol: TCP
---
kind: Service
apiVersion: v1
metadata:
  name: app1-service
spec:
  selector:
    app: app1
  ports:
    - port: 80
      protocol: TCP
  type: NodePort

就像你可以看到 kubernetesurl.com/app1 上的所有流量都被转发到 app1-service。直到一切正常。

示例应用程序1

Docker 文件: 从节点:8 WORKDIR /opt

COPY package.json /opt
RUN npm install

COPY . /opt

CMD ["npm", "start"]

server.js:

app.get('/', function(request, response) {
    response.sendFile(path.join(__dirname + '/login.html'));
});
app.post('/auth', function(request, response) {
    ... some auth stuff
    response.redirect('/home');
});
app.get('/home', function(request, response) {
    response.sendFile(path.join(__dirname + '/home.html'));
})

login.html:

<form action="auth" method="POST">
    <input type="text" name="username" placeholder="Username" required>
    <input type="password" name="password" placeholder="Password" required>
    <input type="submit">
</form>

问题

  1. 如果我提交表单,我会被重定向到 kubernetesurl.com/auth

    但我需要 kubernetesurl.com/app1/auth。

  2. 如果我在 '/' 中使用 response.redirect('/home'),我会被重定向到 kubernetesurl.com/home

    但我需要 kubernetesurl.com/app1/home。

  3. 如果我向 index.html 添加一个带有相对 url 的链接,比如 home,我会被重定向到 kubernetesurl.com/home

    但我需要 kubernetesurl.com/app1/home。

当我在我的 VM 上启动 express 作为服务时,一切正常(当然,因为应用程序在“/”上运行而无需代理)。

如何通过代理运行它?

【问题讨论】:

    标签: node.js express nginx kubernetes


    【解决方案1】:

    由于您有两个不同的位置,指向两个不同的服务,您可以尝试对相对 URL 进行分组和重写。

    annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /app$2/$3
        kubernetes.io/ingress.class: "nginx"
    spec:
      rules:
      - host: example.com
        http:
          paths:
          - path: /(location)(1)/(.*)
            backend:
              serviceName: service1
              servicePort: 80
          - path: /(location)(2)/(.*)
            backend:
              serviceName: service2
              servicePort: 80
    

    所以基本上你只使用第一组(location1location2)在 Ingress 级别路由到正确的服务。

    然后,该组可以被重写规则解散,该规则将只保留第二组用于重写正确的应用程序编号,第三组用于匹配您需要在 URL 中传递的所有其他内容。

    【讨论】:

    • 非常感谢您的回答。我会尽快测试的。
    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2018-02-23
    • 1970-01-01
    • 2022-01-08
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多