Nginx Ingress Controller访问Jenkins报404错误求助
核心问题分析
从提供的配置和日志来看,导致404错误的主要原因有以下几点:
1. Ingress 重写规则配置不匹配
当前Ingress使用了nginx.ingress.kubernetes.io/rewrite-target: /$2注解,但路径规则仅定义为/jenkins,未设置正则捕获组。这会导致$2变量为空,请求被错误重写到Jenkins服务的根路径/,无法匹配Jenkins的路由逻辑。
2. Ingress Address 为空
kubectl get ingress结果中Address字段为空,说明Ingress Controller未成功为Ingress资源绑定有效访问地址,流量无法正确路由到后端服务。
3. 未验证后端服务的直接可达性
尚未确认Jenkins Service本身是否能正常响应请求,需要先排除后端服务的问题。
修复步骤
步骤1:修正Ingress重写规则
调整Ingress的路径为正则捕获格式,确保rewrite-target能正确匹配Jenkins的路由:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: jenkins-ingress namespace: jenkins annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: nginx rules: - host: jenkins.company.com http: paths: - path: /jenkins(/|$)(.*) pathType: Prefix backend: service: name: jenkins-svc port: number: 80
应用修改:
kubectl apply -f jenkins-ingress.yaml -n jenkins
步骤2:验证Ingress Controller与IngressClass的关联
检查集群中是否存在名为nginx的IngressClass资源:
kubectl get ingressclass
如果不存在,创建对应的IngressClass:
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: nginx spec: controller: k8s.io/ingress-nginx
应用后,Ingress的Address字段会自动填充为Ingress Controller所在节点的IP(因使用DaemonSet+HostPort模式)。
步骤3:验证后端服务的可达性
在集群内节点直接访问Jenkins Service,确认服务本身正常:
curl http://10.96.180.240
如果返回Jenkins的登录页面,说明后端服务无问题;若仍报错,需检查Jenkins Pod的配置和日志。
步骤4:确认HA-Proxy转发配置
确保HA-Proxy已将jenkins.company.com的80端口流量转发到Kubernetes集群中所有运行Ingress Controller的节点的80端口(或Ingress Controller配置的HostPort端口)。
步骤5:集群内验证Ingress路由
使用节点IP直接测试Ingress规则:
curl -H "Host: jenkins.company.com" http://<ingress-controller-node-ip>/jenkins
若能正常访问,说明Ingress规则生效,问题出在HA-Proxy或DNS解析环节;若仍报错,需检查Ingress Controller的日志和配置。
内容的提问来源于stack exchange,提问作者user4948798

