【问题标题】:How can I redirect traffic to my web service via ingress annotations?如何通过入口注释将流量重定向到我的 Web 服务?
【发布时间】:2019-08-15 17:36:35
【问题描述】:

我已将 Jenkins 实例部署到 Kubernetes,可从 jenkins.company.com 访问。 我想设置第二条路线 jenkins.company.com/admin 将附加一个标头,然后将请求转发到同一个服务。

我的问题是 Jenkins 主页所依赖的所有后续请求都返回 404 http 响应。

Request URL: https://jenkins.company.com/admin
Request Method: GET Status Code: 200 
Request URL: https://jenkins.company.com/static/1d6021a8/css/layout-common.css
Method: GET Status Code: 404 
Request URL: https://jenkins.company.com/static/1d6021a8/css/style.cssRequest 
Method: GET Status Code: 404 
Request URL: https://jenkins.company.com/static/1d6021a8/scripts/prototype.js
Method: GET Status Code: 404 
...

我尝试了各种入口注释,但没有成功。

nginx.ingress.kubernetes.io/use-regex: "true"

with spec.rules.paths[].path 使用正则表达式试图获取重写目标值。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/auth-realm: Authentication Required - ok
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/configuration-snippet: |-
      proxy_set_header User $remote_user;
    nginx.ingress.kubernetes.io/rewrite-target: $1
  name: jenkins-master-ingress
  namespace: default
spec:
  rules:
  - host: jenkins.company.com
    http:
      paths:
      - backend:
          serviceName: my-jenkins
          servicePort: 8080
        path: /a
  tls:
  - secretName: my-secret
status:
  loadBalancer:
    ingress:
    - {}
~                  

有趣的是,我还发现添加另一条路径可以解决所有问题,尽管我无法解释如何。添加“stati”作为路径会解除阻塞,但使用“static”或“static/(.+)”会将其中断并返回 404。

spec:
  rules:
  - host: jenkins.company.com
    http:
      paths:
      - backend:
          serviceName: my-jenkins
          servicePort: 8080
        path: /a
      - backend:
          serviceName: my-jenkins
          servicePort: 8080
        path: /stati

如何让 /static 文件通过?我的入口缺少什么?

【问题讨论】:

  • 你试过用这个nginx.ingress.kubernetes.io/rewrite-target:/annotations吗?
  • 是的,我上面的例子中有这个注释。

标签: nginx kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

请考虑有关标头更改的注释将影响 ingress 中的所有规则,并且您的 ingress 规则只允许 /a 的传入请求,而不是 /static 的传入请求。因此,它永远不会被送达。

现在,rewrite-target 指令将变为transform any incoming URI for each path (for instance: /a) before sending it into the specified backend。为此,它使用captured groups

在您的第二个 sn-p 案例中,捕获 static/(.+) 将留下 $1 以及 static/ 之后的任何内容,并且将其从原始 URI 中完全删除,以将其发送到后端,总是导致 404,因为那里不存在这样的 URI。

目前似乎无法通过入口注释将特定标头添加到选定路径,如custom headers are part of the global configuration of the ingress controller

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2016-06-06
    • 2019-06-16
    • 2023-03-04
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多