Kubernetes 上 Jenkins 的 Nginx 重定向

Nginx Redirection of Jenkins on Kubernetes

我正在尝试在 Kubernetes 上部署 Jenkins。我已经在 AKS 上使用 ClusterIP 和 Nginx Ingress Controller 部署了它。

当我访问 Ingress-Controller 的 IP 时,出现 Jenkins 登录 URL (http://ExternalIP/login?from=%2F) .然而,Jenkins 页面的 UI 没有出现,并且发生了某种重定向并不断增长(http://ExternalIP/login?from=% 2F%3Ffrom%3D%252F%253Ffrom%253D%25252F%25253F)。我对 Ingress 控制器和注释非常陌生。我无法弄清楚导致此重定向的原因。

下面是我的配置文件。任何人都可以帮助解决问题吗?

集群IP-Service.yml

kind: Service
apiVersion: v1
metadata:
  name: jenkins-nodeport-svc
  namespace: jenkins
  labels:
    env: poc
    app: myapp_jenkins
spec:
  ports:
  - name: "http"
    port: 80
    targetPort: 8080
  type: ClusterIP
  selector:
      app: myapp_jenkins

Ingress.yml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: jenkins-ingress
  namespace: jenkins
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
    nginx.ingress.kubernetes.io/cors-allow-headers: Authorization, origin, accept
    nginx.ingress.kubernetes.io/cors-allow-methods: GET, OPTIONS
    nginx.ingress.kubernetes.io/enable-cors: "true"

spec:
  rules:
  - http:
      paths:
       - backend:
          serviceName: jenkins-nodeport-svc
          servicePort: 80
         path: /(.*)

你的入口有东西:

path: /(.*)

是一个正则表达式,带有一个匹配所有内容的捕获组。例如,使用以下 url:http://ExternalIP/login?from=myurl 您的捕获组 </code>(第一个也是唯一一个)将匹配 <code>login?from/myurl.

现在的问题是 nginx.ingress.kubernetes.io/rewrite-target: / 注释正在用一个不存在的捕获组重写您的 url。

你不需要重写,你只需要将每个请求简单地转发给服务。
Here you can find Rewrite Examples如果你感兴趣的话。

但是在你的情况下你可以设置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: jenkins-ingress
  namespace: jenkins
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
    nginx.ingress.kubernetes.io/cors-allow-headers: Authorization, origin, accept
    nginx.ingress.kubernetes.io/cors-allow-methods: GET, OPTIONS
    nginx.ingress.kubernetes.io/enable-cors: "true"

spec:
  rules:
  - http:
      paths:
       - backend:
          serviceName: jenkins-nodeport-svc
          servicePort: 80
         path: /

一切顺利。