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

Kubernetes中Ingress加载静态文件失败的问题排查

Nginx静态图片通过Ingress访问404问题排查

问题现象

使用镜像holysemicolon/uwu-nginx:1.0部署带静态图片的Nginx测试页面时,出现以下差异:

  • 当Service类型设为ClusterIP,通过Ingress访问页面,静态图片加载失败,提示404 not found
  • 将Service改为NodePort后,直接访问服务,图片加载正常
  • 直接通过Ingress访问图片路径192.168.42.110/Holy_semicolon.png(携带Host:app1.com请求头,或执行命令curl -H "Host:app1.com" 192.168.42.110)可正常获取图片

现象截图

  • Nginx页面(加载失败):Nginx页面(加载失败)
  • Nginx页面(加载正常,Service为NodePort时):Nginx页面(加载正常)

环境说明

  • 容器内HTML页面与图片同存于/var/www/html目录
  • HTML中图片引用代码:<IMG SRC="./Holy_semicolon.png">

配置文件

Deployment配置(app-one.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-one
spec:
  selector:
    matchLabels:
      app: app-one
  replicas: 1
  template:
    metadata:
      labels:
        app: app-one
    spec:
      containers:
      - name: app-one
        image: holysemicolon/uwu-nginx:1.0
        ports:
        - containerPort: 80

Service配置(app-one-service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: app-one
spec:
  selector:
    app: app-one
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: ClusterIP
#type: NodePort

Ingress配置(ingress.yaml)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  namespace: default
  #annotations:
    #nginx.ingress.kubernetes.io/use-regex: "true"
    #nginx.ingress.kubernetes.io/rewrite-target: /Enjine/$1
spec:
  rules:
  - host: app1.com  #Host Name 
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: app-one
            port:
              number: 80

集群状态

资源列表

$ kubectl get all
NAME                           READY   STATUS    RESTARTS   AGE
pod/app-one-78b7874867-g2b92   1/1     Running   0          6m46s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.43.0.1     <none>        443/TCP   165m
service/app-one      ClusterIP   10.43.23.19   <none>        80/TCP    6m42s

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/app-one   1/1     1            1           6m46s

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/app-one-78b7874867   1         1         1       6m46s

节点信息

$ kubectl get node -o wide
NAME       STATUS   ROLES                  AGE    VERSION        INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
iltafahs   Ready    control-plane,master   3h2m   v1.28.5+k3s1   192.168.42.110   <none>        CentOS Linux 7 (Core)   3.10.0-1160.99.1.el7.x86_64   containerd://1.7.11-k3s2

问题原因与解决方法

原因分析

HTML使用相对路径./Holy_semicolon.png引用图片,通过Ingress访问时:

  • 若直接用IP访问(未配置Host映射),浏览器请求图片时携带的Host头为Ingress IP,无法匹配Ingress规则中host: app1.com的转发条件,导致Ingress不将图片请求转发到app-one服务,返回404
  • 用NodePort访问时,请求直接发送到后端服务,无需匹配Ingress的Host规则,因此图片加载正常

解决方案

方案1:配置本地Host映射

在本地hosts文件中添加:

192.168.42.110 app1.com

之后通过http://app1.com访问页面,浏览器会自动为所有请求(包括图片)携带Host: app1.com头,Ingress可正常匹配转发。

方案2:修改Ingress规则,移除Host限制

修改ingress.yaml,删除host: app1.com字段,让Ingress接收所有到该IP的请求:

spec:
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: app-one
            port:
              number: 80

修改后执行kubectl apply -f ingress.yaml,直接用Ingress IP访问即可正常加载图片。

内容的提问来源于stack exchange,提问作者Holy semicolon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:47:03