You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes Nginx Ingress后Jenkins登录重定向异常问题求助

问题:Jenkins登录后重定向到非标准端口2443

环境与配置

Jenkins Helm自定义配置(values.yaml)

controller:
  jenkinsUrlProtocol: https
  jenkinsUrl: https://jenkins.mydomain.com
  ingress:
    enabled: true
    apiVersion: networking.k8s.io/v1
    ingressClassName: jenkins-nginx # 对应ingressClass
    hostName: jenkins.mydomain.com

部署后生成的Ingress对象

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jenkins
  namespace: jenkins
spec:
  ingressClassName: jenkins-nginx
  rules:
  - host: jenkins.mydomain.com
    http:
      paths:
      - backend:
          service:
            name: jenkins
            port:
              number: 8080
        pathType: ImplementationSpecific

Ingress-Nginx控制器关键配置

Ingress-Nginx运行在AWS NLB之后,TLS终止于NLB,后端协议配置为aws-load-balancer-backend-protocol: http,额外包含以下http片段:

http-snippet: |
  server {
    listen 2443;
    return 308 https://$host$request_uri;
  }

问题现象

  • 访问https://jenkins.mydomain.com可正常加载登录页面
  • 提交用户名密码后,被异常重定向到https://jenkins.mydomain.com:2443/loginError
  • 本地端口转发Jenkins服务时无任何问题,同一Ingress-Nginx集群下的其他数百个服务运行正常

问题根源

Jenkins生成重定向URL时依赖自身感知到的端口信息:

  1. NLB终止TLS后以HTTP协议转发请求到Ingress-Nginx,Jenkins默认从Ingress-Nginx的请求头中获取端口
  2. Ingress-Nginx的http-snippet配置了监听2443端口,导致Jenkins错误地将该内部端口识别为外部访问端口
  3. 外部客户端无法访问2443端口,最终出现异常重定向

解决方案

方案1:强制Jenkins使用正确的外部端口

在Jenkins Helm values.yaml中添加环境变量,明确指定外部访问的协议和端口:

controller:
  # 保留原有配置
  jenkinsUrlProtocol: https
  jenkinsUrl: https://jenkins.mydomain.com
  ingress:
    enabled: true
    apiVersion: networking.k8s.io/v1
    ingressClassName: jenkins-nginx
    hostName: jenkins.mydomain.com
  # 添加以下配置
  additionalEnvironmentVars:
    - name: JENKINS_PROTOCOL
      value: "https"
    - name: JENKINS_HTTPS_PORT
      value: "443"
    - name: JENKINS_ARGS
      value: "--httpPort=8080 --httpsPort=-1 --prefix=/"
  # 确保rootUrl正确设置
  jenkinsOpts: >-
    --rootUrl=https://jenkins.mydomain.com

方案2:调整Ingress-Nginx的http-snippet配置

移除不必要的2443端口监听配置(该端口未暴露给NLB,无外部访问场景):

# 删除原http-snippet中的2443端口server块
http-snippet: |
  # 保留其他必要配置,移除监听2443的server段

方案3:配置Ingress传递正确的转发头

在Ingress对象中添加注解,让Ingress-Nginx传递正确的X-Forwarded头,同时开启Jenkins的代理兼容:

1. 更新Ingress注解

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jenkins
  namespace: jenkins
  annotations:
    nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
    nginx.ingress.kubernetes.io/x-forwarded-proto: "https"
    nginx.ingress.kubernetes.io/x-forwarded-port: "443"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: jenkins-nginx
  rules:
  - host: jenkins.mydomain.com
    http:
      paths:
      - backend:
          service:
            name: jenkins
            port:
              number: 8080
        pathType: ImplementationSpecific

2. 开启Jenkins代理兼容

登录Jenkins(通过端口转发),进入「Manage Jenkins」→「Configure Global Security」,勾选「Enable proxy compatibility」并保存。


验证步骤

  1. 应用修改后的配置,重启Jenkins Pod
  2. 访问https://jenkins.mydomain.com提交登录信息
  3. 确认重定向URL不再包含:2443端口

内容的提问来源于stack exchange,提问作者Ashish Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:13:29