kubernetes 通过nginx路由到基于输入路径的服务

cgvd09ve  于 2023-03-22  发布在  Kubernetes
关注(0)|答案(1)|浏览(125)

我部署了一个名为“web-server-service”的测试服务。它连接到一个容器,当它工作时,它只在屏幕上显示一条消息(如浏览器等):“It works!". Purley作为连通性测试。

Ingress控制器= Nginx。所有这些都在AWS中运行。
我已经设置了一个入口控制器并创建了一个入口资源

apiVersion: v1
kind: Namespace
metadata:
  name: web
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
  namespace: web
spec:
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: httpd
        image: httpd:2.4.48-alpine3.14
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: web-server-service
  namespace: web
spec:
  selector:
    app: web
  ports:
    - protocol: TCP
      port: 5000
      targetPort: 80

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-server-ingress
  namespace: web
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: nginx
  rules:
  - host: somehost.com
    http:
      paths:
      - path: / #this works
        pathType: Prefix
        backend:
          service:
            name: web-server-service
            port:
              number: 5000
      - path: /test #this does not work. returns 404
        pathType: Prefix
        backend:
          service:
            name: web-server-service
            port:
              number: 5000

我遇到的问题是,只要我将路径保持为“/”,那么当我通过浏览器、curl等进行连接时,它就可以工作。但一旦我实际添加了一个不同的路径(如“/test”),它就会发送回404。这几乎就像它在执行poxy_pass时将该路径添加到proxy_path url的末尾,使其无法找到正确的目的地。
我希望它像一个代理一样将请求发送到一个服务。在这种情况下,它是同一个服务,但最终将是不同的服务正在运行。

使用Rewrite:

我知道有一些重写功能,但我无法让它工作。它仍然返回相同的404。这是我尝试的ingress配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-server-ingress
  namespace: web
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
  - host: somehost.com
    http:
      paths:
      - path: / #this works
        pathType: Prefix
        backend:
          service:
            name: web-server-service
            port:
              number: 5000
      - path: /test(/|$)(.*) #this still does not work. returns 404
        pathType: Prefix
        backend:
          service:
            name: web-server-service
            port:
              number: 5000

也许我的重写是不正确的。
我实际上只是希望它将请求沿着给服务,而不是在传递时添加任何路径。我希望“/”和“/test”的路径都能够显示“It works!”消息。
有谁知道我做错了什么吗?谢谢

5lwkijsr

5lwkijsr1#

调试步骤:

1.检查您的入口控制器pod日志,看看它实际上是在后台发出的请求,由于你得到404。
详细介绍了w.r.t. Ingress,以获得重写目标功能沿着用例

$ echo '
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  ingressClassName: nginx
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - path: /something(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: http-svc
            port: 
              number: 80
' | kubectl create -f -

在这个入口定义中,(.*)捕获的任何字符都将被分配给占位符$2,然后将其用作rewrite-target注解中的参数。
例如,上述入口定义将导致以下重写:

rewrite.bar.com/something rewrites to rewrite.bar.com/
rewrite.bar.com/something/ rewrites to rewrite.bar.com/
rewrite.bar.com/something/new rewrites to rewrite.bar.com/new

来源:https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/rewrite

相关问题