Azure应用网关结合AKS部署pgAdmin时登录后加载卡住,出现严格MIME类型检查启用问题
我太懂你这情况有多闹心了——明明用LoadBalancer部署pgAdmin一切正常,换成Azure应用网关Ingress之后,登录页能打开,点登录就卡在加载界面,还弹出MIME类型错误。你说的没错,这大概率不是pgAdmin本身的问题,毕竟LoadBalancer已经验证过了,问题基本出在Ingress的路径配置或者应用网关的请求转发逻辑上。
先给你拆解下那个错误:浏览器请求脚本文件时,服务器返回的是text/html类型(大概率是404页面或者重复的登录页),而不是预期的application/javascript,这说明脚本的请求路径不对,后端没找到对应的资源,反而返回了HTML内容。结合你的场景,核心原因几乎是pgAdmin不知道自己运行在/pgadmin4子路径下,导致它生成的静态资源URL缺少前缀,而应用网关的转发规则又没处理好这个差异。
给你几个针对性的解决方案,按顺序试:
1. 给pgAdmin配置子路径环境变量
pgAdmin支持通过SCRIPT_NAME环境变量指定自己的运行子路径,这样它生成的所有静态资源链接、接口请求都会自动带上/pgadmin4前缀,避免路径错误。
修改你的pgAdmin Deployment,添加这个环境变量:
apiVersion: apps/v1 kind: Deployment metadata: name: pgadmin spec: template: spec: containers: - name: pgadmin image: dpage/pgadmin4:6.21 env: # 新增这个环境变量,指定子路径 - name: SCRIPT_NAME value: "/pgadmin4" # 其他原有环境变量(比如PGADMIN_DEFAULT_EMAIL、PGADMIN_DEFAULT_PASSWORD)保留
2. 调整Ingress的路径配置
你的现有Ingress用了ImplementationSpecific路径类型,这个类型的匹配逻辑依赖Ingress控制器(这里是应用网关)的实现,容易出现匹配不精准的问题。建议改成Prefix类型,同时简化路径规则:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: pgadmin-ingress annotations: kubernetes.io/ingress.class: azure/application-gateway appgw.ingress.kubernetes.io/ssl-redirect: "false" appgw.ingress.kubernetes.io/appgw-ssl-certificate: "devaks-cert" appgw.ingress.kubernetes.io/cookie-based-affinity: "true" spec: rules: - http: paths: - path: /pgadmin4 pathType: Prefix backend: service: name: pgadmin port: number: 80
用Prefix类型会匹配所有以/pgadmin4开头的请求(包括/pgadmin4/login、/pgadmin4/static/js/xxx.js等),确保所有pgAdmin相关的请求都能正确转发到后端服务。
3. 排查应用网关的额外配置
如果你之前给应用网关配置过路径重写规则(比如用appgw.ingress.kubernetes.io/rewrite-rule-set注解),一定要暂时去掉,因为重写路径会导致pgAdmin收到的请求缺少/pgadmin4前缀,和我们设置的SCRIPT_NAME冲突。
4. 验证排查步骤
- 先重启pgAdmin Deployment和Ingress,确保配置生效。
- 登录后打开浏览器的「开发者工具」→「网络」面板,查看那些被拒绝的脚本请求URL:如果是
https://xxx.cloudapp.azure.com/static/js/xxx.js(缺少/pgadmin4前缀),说明SCRIPT_NAME没生效;如果是https://xxx.cloudapp.azure.com/pgadmin4/static/js/xxx.js但返回404,检查Ingress路径是否正确转发。 - 可以在AKS集群内用临时Pod测试后端服务:比如运行
kubectl run -it --rm --image=curlimages/curl curl-test,然后执行curl http://pgadmin:80/pgadmin4/static/js/app.bundle.js,如果能正常返回JS内容,说明后端服务本身没问题,问题在Ingress/应用网关。
按这个流程调整后,应该就能解决登录后卡住的问题了。
备注:内容来源于stack exchange,提问作者k.elgohary

