微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ingress - 简单的扇出配置不起作用

如何解决Ingress - 简单的扇出配置不起作用

我使用的是 Ubuntu 20.04.2 LTS。我安装了 microk8s 1.20.6 rev 2143 并尝试了 ingress。我一定遗漏了一些东西 - 但它并没有像我期望的那样工作。我将奇怪的行为归结为以下配置:

ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
Metadata:
  name: my-ubuntu
  annotations:
    Nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my-ubuntu
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: Nginx
            port:
              number: 80
      - path: /Nginx
        pathType: Prefix
        backend:
          service:
            name: Nginx
            port:
              number: 80

Nginx-service.yaml:

apiVersion: v1
kind: Service
Metadata:
  name: Nginx
spec:
  ports:
    - port: 80
      name: http
    - port: 443
      name: https
  type: ClusterIP
  selector:
    app: Nginx

现在

curl my-ubuntu/                     # this returns Welcome page,as expected
curl my-ubuntu/Nginx                # this returns Welcome page,as expected
curl my-ubuntu/bad-page.html        # this returns 404 Not Found,as expected
curl my-ubuntu/Nginx/bad-page.html  # this returns Welcome page. WHY?

my-ubuntu/Nginx/* 下的任何请求都会返回欢迎页面,即使 url 是正确的并且应该返回不同的内容。我配置错了吗?

我能够使用 Docker for Windows + WSL2 + Ubuntu + ingress 来重现同样的奇怪行为:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-Nginx/controller-v0.41.2/deploy/static/provider/cloud/deploy.yaml

编辑

我使用的Nginx-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
Metadata:
  name: Nginx
  labels:
    app: Nginx
spec:
  replicas: 1
  revisionHistoryLimit: 0
  selector:
    matchLabels:
      app: Nginx
  template:
    Metadata:
      labels:
        app: Nginx
    spec:
      containers:
      - image: Nginx
        imagePullPolicy: Always
        name: Nginx

当我像@HarshManvar 建议的那样尝试 /Nginx/ 而不是 /Nginx 时,我得到了这种行为:

curl my-ubuntu/                     # this returns Welcome page,as expected
curl my-ubuntu/Nginx                # this returns 404 Not Found
curl my-ubuntu/Nginx/               # this returns Welcome page
curl my-ubuntu/Nginx/bad-page.html  # this returns Welcome page

Kubernetes Ingress documentation about Simple fanout 也确实使用了 /Nginx 模式,但不能按上述方式工作。

解决方法

https://kubernetes.github.io/ingress-nginx/examples/rewrite/ 解释了如何使用 rewrite-target 注释。我能够使用以下 ingress.yaml 使其工作:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ubuntu
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: localhost
    http:
      paths:
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80
      - path: /nginx($|/.*)
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

每个path( )定义正则表达式,产生$1$2等,也就是。正则表达式捕获组变量。现在您使用这些变量放置 rewrite-target,这将是传递到处理请求的服务容器的实际 URL。

也许还有另一种方法,但这是我能够让它发挥作用的唯一方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。