Azure Kubernetes部署MLflow时Ingress访问异常问题排查
问题现象
在Azure Kubernetes Service部署MLflow服务时出现访问异常:
- 关联LoadBalancer类型Service时,通过Service公网IP的5000端口可正常访问MLflow服务
- 配置Nginx Ingress暴露服务后:
- 访问Ingress控制器公网IP的80端口,返回Nginx
404 not found - 访问Ingress控制器公网IP的5000端口请求超时,无法建立连接
- 访问Ingress控制器公网IP的80端口,返回Nginx
现有部署配置
Deployment 配置
apiVersion: apps/v1 kind: Deployment metadata: name: mlflow-deployment labels: app: mlflow spec: selector: matchLabels: app: mlflow replicas: 1 template: metadata: labels: app: mlflow spec: containers: - name: mlflow image: rjtshrm/mlflow:latest args: ["--backend-store-uri", "postgresql://psql:_Reply2022@mlflopgsql.postgres.database.azure.com:5432/postgres?sslmode=require", "--default-artifact-root", "wasbs://mlflow@mlflowsmodeltorage.blob.core.windows.net", "--host", "0.0.0.0"] ports: - containerPort: 5000
LoadBalancer 类型 Service 配置
apiVersion: v1 kind: Service metadata: name: mlflow labels: app: mlflow spec: selector: app: mlflow type: LoadBalancer ports: - port: 5000 targetPort: 5000
Ingress 配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: mlflow-server-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: mlflow-server-ingress rules: - http: paths: - path: /(.*) pathType: Prefix backend: service: name: mlflow port: number: 5000
Ingress 控制器安装命令
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm install ingress-nginx ingress-nginx/ingress-nginx --namespace default --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
故障根因
共3处配置错误导致访问异常:
- 端口认知错误:默认安装的Nginx Ingress控制器,其LoadBalancer Service仅监听80(HTTP)、443(HTTPS)两个端口,未开放5000端口的监听,访问该端口必然超时。Ingress为七层流量入口,设计逻辑是通过80/443端口接收流量,再根据域名、路径规则转发到后端不同服务,无需使用后端服务的业务端口访问Ingress。
- IngressClass配置不匹配:通过官方Helm chart安装的ingress-nginx控制器,默认创建的IngressClass名称为
nginx,现有Ingress配置中填写的mlflow-server-ingress不存在对应控制器,因此配置的路由规则根本没有被Nginx控制器加载,访问80端口时匹配不到任何规则,返回默认404页面。 - 重写规则配置错误:Ingress注解中配置的路径正则为
/(.*),仅存在1个捕获组对应$1,但rewrite-target配置为/$2,$2无匹配内容,即使规则被加载也会出现路径转发异常。
修复方案
- 替换原有Ingress配置为以下内容,删除不必要的正则、重写注解,修正IngressClass名称:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: mlflow-server-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: ingressClassName: nginx rules: - http: paths: - path: / pathType: Prefix backend: service: name: mlflow port: number: 5000
- 执行
kubectl apply -f 上述ingress配置文件.yaml应用配置,等待10秒左右待Nginx控制器加载规则。 - 直接访问Ingress控制器公网IP的80端口,即可正常打开MLflow服务页面,无需加5000端口。
补充说明
- 原有MLflow对应的LoadBalancer Service可根据需求保留,也可修改为ClusterIP类型,所有公网流量通过Ingress统一接入即可。
- 若有特殊场景必须通过5000端口访问Ingress,需要在安装ingress-nginx时额外添加对应参数暴露端口,该操作不符合Ingress常规使用逻辑,非必要不配置。
内容的提问来源于stack exchange,提问作者Rajat
相关产品推荐
相关产品推荐

