gpt4 book ai didi

kubernetes - 使用 Nginx Controller 的基于路径的路由不起作用

转载 作者:行者123 更新时间:2023-12-02 12:01:09 26 4
gpt4 key购买 nike

我一直在尝试我的 Nginx 基于路径的路由工作,但是,在花了将近 4 个小时之后,我无法理解,为什么它不起作用。在任何人降级我的问题之前,我已经在 StackOverflow 上完成了几乎所有可能的答案,但没有一个对我有用。

所以在这里我做了什么:

  • 我在单独的命名空间中使用 Helm 3 ( https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-helm/ ) 安装了 nginx-ingress - nginx-test:
    helm install my-release nginx-stable/nginx-ingress

  • 入口 Controller 的一个版本( https://hub.helm.sh/charts/nginx-edge/nginx-ingress ):
    $ POD_NAME=$(kubectl get pods -l app=nginx-controller-nginx-ingress -o jsonpath='{.items[0].metadata.name}')
    $
    $ kubectl exec -it $POD_NAME -- /nginx-ingress --version
    Version=edge GitCommit=50e908aa
    $
  • 有 2 个基本的 nginx 部署,2 个服务已经配置在同一个命名空间中,当我为它们配置基于主机的路由时工作正常。
  • 下面一个对我来说很好用(当我定义基于主机的路由并在运行两个单独的 URL 时获得所需的页面 index.html 时):
  • apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
    name: nginx-ingress
    annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    spec:
    rules:
    - host: nginx1.example.com
    http:
    paths:
    - path: /
    backend:
    serviceName: nginx1
    servicePort: 80

    - host: nginx2.example.com
    http:
    paths:
    - path: /
    backend:
    serviceName: nginx2
    servicePort: 80

    现在我想使用基于路径的路由来实现相同的结果,其中将有 1 个 URL 和 2 个路径/nginx1(指向 nginx1 服务)和/nginx2(指向 nginx2 服务)。所以我配置了下面的入口资源(以及我根据互联网上的不同示例应用的许多排列和组合),它们都不适合我。
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
    name: ingress-path-based
    annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    kubernetes.io/ingress.class: "nginx"
    spec:
    rules:
    - host: nginx.example.com
    http:
    paths:
    - path: /nginx1
    backend:
    serviceName: nginx1
    servicePort: 80
    - path: /nginx2
    backend:
    serviceName: nginx2
    servicePort: 80

    当我直接访问服务时,它工作正常,但是当我尝试访问时 - curl http://nginx.example.com/nginx1curl http://nginx.example.com/nginx2 - 我得到 404 Not Found错误。

    我期待收到与基于主机的路由相同的响应。但它似乎不起作用。

    最佳答案

    所以最后我不得不使用 list 安装 Controller ,而不是 Helm chart (边缘版本)。

    我从这里安装它( https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal ),将 NodePort 更改为 LoadBalancer 以获得 LoadBalancer IP。我正在使用 MetalLB在裸机上。

    $ POD_NAME=$(kubectl get pods -n $POD_NAMESPACE -l app.kubernetes.io/component=controller -o jsonpath='{.items[0].metadata.name}')
    $ kubectl exec -it $POD_NAME -n $POD_NAMESPACE -- /nginx-ingress-controller --version
    -------------------------------------------------------------------------------
    NGINX Ingress controller
    Release: 0.32.0
    Build: git-446845114
    Repository: https://github.com/kubernetes/ingress-nginx
    nginx version: nginx/1.17.10

    -------------------------------------------------------------------------------

    $

    我的 Ingress 资源看起来与我在提问时发布的资源相同。
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
    name: ingress-path-based
    annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    spec:
    rules:
    - host: nginx.gofork8s.com
    http:
    paths:
    - path: /nginx1
    backend:
    serviceName: nginx1
    servicePort: 80
    - path: /nginx2
    backend:
    serviceName: nginx2
    servicePort: 80

    修改/etc/hosts 文件中的新 LoadBalancer IP 以使域工作。
    192.168.0.1 nginx.example.com

    现在我可以访问 - http://nginx.example.com/nginx1http://nginx.example.com/nginx2 .

    我希望它会帮助某人。我仍然需要弄清楚 Helm Charts 的设置。

    关于kubernetes - 使用 Nginx Controller 的基于路径的路由不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62122359/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com