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页面(加载正常,Service为NodePort时):

环境说明
- 容器内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
相关产品推荐
相关产品推荐

