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时依赖自身感知到的端口信息:
- NLB终止TLS后以HTTP协议转发请求到Ingress-Nginx,Jenkins默认从Ingress-Nginx的请求头中获取端口
- Ingress-Nginx的
http-snippet配置了监听2443端口,导致Jenkins错误地将该内部端口识别为外部访问端口 - 外部客户端无法访问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」并保存。
验证步骤
- 应用修改后的配置,重启Jenkins Pod
- 访问
https://jenkins.mydomain.com提交登录信息 - 确认重定向URL不再包含
:2443端口
内容的提问来源于stack exchange,提问作者Ashish Kumar
相关产品推荐
相关产品推荐

