1.说明
本次是总结我自己在使用ingress遇到的各种问题.希望能帮助到同样使用这个组件并且遇到一样的问题的朋友.
2.访问ingress产生404问题
2.1.pod问题
ingress对应的服务存在 但pod未启动/pod启动存在异常
2.2 service问题(确认清楚pod的服务端口)
绑定到错误的pod或者容器真正使用的服务端口与service配置的端口不一致
2.3 ingress配置的文根与实际项目的不一致
比如以下的规则:
spec:
rules:
- http: paths: - backend: serviceName: init servicePort: 8000 path: /init1 可以看到配置的文根(path)是init1,但是实际项目的访问文根是init 当访问/init时(ingress层面返回404),由于配置的文根是init,不会访问pod,ingress层面返回404 当访问/init1(pod层面访问404),ingress转发请求到了pod,但是由于pod层面的文根是init,对应不上,pod层面一样也会返回404.
我的一个名为init-xxx的pod,是一个nginx项目,里面放置了一个名为init的前端文件夹(工程)
查看pod日志,可以看到请求是已经接受到了,只是文根不对,找不到项目
10.244.2.125 - - [21/Oct/2022:02:39:35 +0000] “GET /init1/ HTTP/1.1” 404 555 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.49” “10.244.0.0”
2022/10/21 02:39:35 [error] 6#6: *12 “/opt/init1/index.html” is not found (2: No such file or directory), client: 10.244.2.125, server: localhost, request: “GET /init1/ HTTP/1.1”, host: "192.168.72.128:31385
[root@k8s-master testingress]# kubectl get po
NAME READY STATUS RESTARTS AGE
init-bc788486c-vmrcb 1/1 Running 3 3d19h
2.4.访问时候没有携带/收尾(针对nginx工程)
这个是我工程Pod的nginx配置
server {
listen 8000;
server_name localhost;
location /init {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
root /opt/;
index index.html index.htm;
}
}
http://xxx:31385/init (访问文件-错误的示范)
http://xxx:31385/init/ (访问文件夹-正确)
由于不携带/被判定为文件,按道理前端工程需要有/收尾,让他去访问文件夹才可以
3.访问ingress产生503问题
3.1 ingress配置的serviceName错误
ingress没有找到对应的service服务这个如何确认?通过kubectl describe ingress查看详情,如果看到error: endpoints “xxxx” not found,代表服务的指向有问题
看看是不是服务不存在或服务名称写错了,下面演示一个错误的例子:可以看到错误信息,访问也是503 Service Temporarily Unavailable错误
[root@k8s-master testingress]# kubectl describe ingress
Name: bddev-ingress
Namespace: default
Address: 10.106.115.156
Default backend: default-http-backend:80 ()
Rules:
Host Path Backends
/init init1:8000 (<error: endpoints "init1" not found>)
Annotations: kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-body-size: 500M
注意这行endpoints “init1” not found,代表serviceName是有问题的
spec:
rules:
- http: paths: - backend: serviceName: init
3.2 ingress配置的servicePort端口有问题
比如我的前端服务配置是8000 但配置错了8001,也是会触发503错误,这个一定要确认应用的端口 写正确!
spec:
rules:
- http: paths: - backend: serviceName: init servicePort: 8001 path: /init [root@k8s-master testingress]# kubectl describe ingress Name: bddev-ingress Namespace: default Address: 10.106.115.156 Default backend: default-http-backend:80 () Rules: Host Path Backends
/init init:8001 (10.244.2.123:8000)
Annotations: kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-body-size: 500M
3.3 service服务端口配置错误
比如前端端口是8000 配置成8001也是会导致503
kubectl expose deployment init --port=8001 --target-port=8001
3.4 其他命名空间的ingress服务配置的影响
比如自己的服务配置的是* 任何域名都能访问
但是其他命名空间配置了host 比如 xxx.com.
尝试使用ip访问看看 是否能正常访问 如果可以那大概率是这个问题.
例如:我的bddev-ingress配置的是* 但其他配置的是域名 被影响到了 访问域名无法访问.ip可以访问.
解决:统一改成*或者域名
版权归原作者 遗忘曲线的美好 所有, 如有侵权,请联系我们删除。