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可以访问.

ingress 302跳转 ingress 网络错误_容器


解决:统一改成*或者域名