Azure Kubernetes Ingress访问Quarkus服务/microservice1/hello报502错误求助
问题:Azure Ingress访问Quarkus服务出现502 Bad Gateway错误
在Azure Kubernetes集群中配置了Ingress,其中microservice1是Quarkus应用,本地访问/microservice1/hello端点正常,但通过Azure Ingress访问时返回502 Bad Gateway错误。集群内其他服务(quarkus-service、react-service)可通过Ingress正常访问。
集群内其他服务
- quarkus-service:可通过
/qs路径访问 - react-service:可通过
/web路径访问
配置详情
Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: cert-manager.io/acme-challenge-type: http01 cert-manager.io/issuer: letsencrypt-prod kubernetes.io/ingress.class: azure/application-gateway name: simple-frontend-ingress namespace: dev spec: rules: - host: example.dev.company.com http: paths: - path: /microservice1/ pathType: Prefix backend: service: name: microservice1-service port: number: 80 - path: /qs pathType: Prefix backend: service: name: quarkus-service port: number: 80 - path: /web pathType: Prefix backend: service: name: react-service port: number: 80 tls: - hosts: - example.dev.company.com secretName: frontend-tls-prod
Service配置
apiVersion: v1 kind: Service metadata: name: microservice1-service spec: selector: app: microservice1 ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIP
Deployment配置
apiVersion: apps/v1 kind: Deployment metadata: name: microservice1 spec: replicas: 1 selector: matchLabels: app: microservice1 template: metadata: labels: app: microservice1 spec: containers: - name: microservice1 image: myregistry.azurecr.io/microservice1:latest ports: - containerPort: 8080 env: - name: quarkus.http.root-path value: /microservice1/
Quarkus application.properties
# Quarkus HTTP Configuration quarkus.http.host=0.0.0.0 quarkus.http.port=8080 quarkus.http.root-path=/microservice1/ # OIDC Configuration quarkus.oidc.provider=microsoft quarkus.oidc.client-id=YOUR_CLIENT_ID quarkus.oidc.credentials.secret=YOUR_SECRET quarkus.oidc.auth-server-url=https://example.b2clogin.com/example.onmicrosoft.com/B2C_1_susi/v2.0/ # Logging Configuration quarkus.log.category."io.quarkus.oidc".min-level=TRACE quarkus.log.category."io.quarkus.oidc".level=TRACE # Microservices quarkus.rest-client.microservice2.url=${MICROSERVICE2} quarkus.rest-client.microservice3.url=${MICROSERVICE3} # Database Configuration quarkus.datasource.db-kind=postgresql quarkus.datasource.jdbc.url=${DB_URL} quarkus.datasource.username=${DB_USERNAME} quarkus.datasource.password=${DB_PASSWORD} quarkus.datasource.jdbc.max-size=20 quarkus.datasource.jdbc.min-size=2 quarkus.hibernate-orm.database.generation=update
Dockerfile
FROM registry.access.redhat.com/ubi8/openjdk-17:1.19 ENV LANGUAGE='en_US:en' # We make four distinct layers so if there are application changes the library layers can be re-used COPY --chown=185 build/quarkus-app/lib/ /deployments/lib/ COPY --chown=185 build/quarkus-app/*.jar /deployments/ COPY --chown=185 build/quarkus-app/app/ /deployments/app/ COPY --chown=185 build/quarkus-app/quarkus/ /deployments/quarkus/ # Set environment variables in Dockerfile ENV DB_URL="" ENV DB_USERNAME="" ENV DB_PASSWORD="" EXPOSE 8080 USER 185 ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ]
观察结果
- 本地访问
http://localhost:8080/microservice1/hello完全正常 - 同一Ingress下的quarkus-service(/qs)和react-service(/web)可正常访问
- Ingress整体配置无明显问题,其他服务可正常路由
排查思路与解决方案
1. 路径重复匹配问题(核心嫌疑)
当前Ingress路径为/microservice1/(Prefix匹配),同时Quarkus配置了quarkus.http.root-path=/microservice1/,导致请求路径重复:
- 外部请求
https://example.dev.company.com/microservice1/hello时,Ingress会将完整路径/microservice1/hello转发给后端服务 - Quarkus根路径为
/microservice1/,实际会寻找端点/microservice1/microservice1/hello,因该端点不存在返回404,最终导致Azure Application Gateway返回502
解决办法二选一:
- 方案A:修改Quarkus的根路径为
/,删除Deployment中的quarkus.http.root-path环境变量,或设置为/。此时Ingress路径/microservice1/转发的请求/microservice1/hello会匹配到Quarkus的/hello端点 - 方案B:保留Quarkus根路径,为Azure Application Gateway配置路径重写。需要先创建RewriteRuleSet资源,将
/microservice1/(.*)重写为/$1,然后在Ingress的annotations中添加appgw.ingress.kubernetes.io/rewrite-rule-set: <your-rewrite-rule-set-name>
2. 验证集群内服务连通性
在集群内临时启动一个curl Pod,测试服务是否可正常响应:
kubectl run -it --rm curl-pod --image=curlimages/curl -- curl microservice1-service.dev.svc.cluster.local/microservice1/hello
如果返回正常,说明服务本身无问题,问题出在Ingress路由或路径处理;如果返回异常,查看Pod日志排查服务启动或运行错误:
kubectl logs <microservice1-pod-name> -n dev
3. 检查Azure Application Gateway状态
- 查看Application Gateway的后端健康状况,确认microservice1对应的后端池是否标记为健康
- 查看Application Gateway的访问日志,定位502错误的具体原因(如连接超时、后端返回4xx/5xx等)
4. 环境变量注入验证
检查Deployment中是否正确注入了所有必要的环境变量(如MICROSERVICE2、MICROSERVICE3、数据库连接信息),缺失的环境变量可能导致Quarkus服务启动异常或无法处理请求。可通过以下命令查看Pod的环境变量:
kubectl exec <microservice1-pod-name> -n dev -- printenv
5. Ingress路径匹配优先级调整
如果调整路径后仍有冲突,可修改Ingress路径的顺序,将更精确的路径放在前面(Azure Application Gateway会按顺序匹配路径)。例如将/microservice1/的路径规则放在其他服务之前,避免被更宽泛的路径规则匹配。
内容的提问来源于stack exchange,提问作者user16993210
相关产品推荐
相关产品推荐

