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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:37:32