Nginx Ingress 给 404 未找到任何入口资源

Posted

技术标签:

【中文标题】Nginx Ingress 给 404 未找到任何入口资源【英文标题】:Nginx Ingress giving 404 not found for any ingress resource 【发布时间】:2019-12-16 22:41:15 【问题描述】:

nginx 控制器在本地为任何入口资源设置抛出 404 错误。

nginx-ingress 控制器设置是根据以下文档中详述的步骤进行的,并且入口控制器在本地设置中公开为 NodePort 服务

https://github.com/nginxinc/kubernetes-ingress/blob/master/docs/installation.md#5-access-the-live-activity-monitoring-dashboard--stub_status-page

以下示例入口资源用于测试入口 香蕉.yaml

kind: Pod
apiVersion: v1
metadata:
  name: banana-app
  namespace: nginx-ingress
  labels:
    app: banana
spec:
  containers:
    - name: banana-app
      image: hashicorp/http-echo
      args:
        - "-text=banana"

---

kind: Service
apiVersion: v1
metadata:
  name: banana-service
  namespace: nginx-ingress
spec:
  selector:
    app: banana
  ports:
    - port: 5678 

apple.yaml

kind: Pod
apiVersion: v1
metadata:
  name: apple-app
  namespace: nginx-ingress
  labels:
    app: apple
spec:
  containers:
    - name: apple-app
      image: hashicorp/http-echo
      args:
        - "-text=apple"

---

kind: Service
apiVersion: v1
metadata:
  name: apple-service
  namespace: nginx-ingress
spec:
  selector:
    app: apple
  ports:
    - port: 5678 # 

ingressfile.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  namespace: nginx-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - http:
      paths:
        - path: /apple
          backend:
            serviceName: apple-service
            servicePort: 5678
        - path: /banana
          backend:
            serviceName: banana-service
            servicePort: 5678

以下是服务列表

NAMESPACE       NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
nginx-ingress   apple-service          ClusterIP   10.111.230.109   <none>        5678/TCP                     95m
nginx-ingress   banana-service         ClusterIP   10.102.139.127   <none>        5678/TCP                     95m
nginx-ingress   nginx-ingress          NodePort    10.97.65.187     <none>        80:30207/TCP,443:31031/TCP   6d23h
[root@kube01 ingress]# kubectl get ing
NAME              HOSTS              ADDRESS   PORTS     AGE
example-ingress   *                            80        131m
[root@kube01 ingress]# kubectl describe ing example-ingress
Name:             example-ingress
Namespace:        default
Address:
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *
        /apple    apple-service:5678 (10.244.2.7:5678)
        /banana   banana-service:5678 (10.244.1.11:5678)
Annotations:
  ingress.kubernetes.io/rewrite-target:  /
Events:                                  <none>

如果我按如下方式直接卷曲 pod,它会按预期工作

[root@kube01 ingress]# curl http://10.244.2.7:5678/apple
apple
[root@kube01 ingress]# curl http://10.244.1.11:5678/banana
banana
[root@kube01 ingress]#

但是,如果我尝试通过 Nodeport 入口控制器访问它,我总是找不到如下所示

[root@kube01 ingress]# curl http://xx.xx.xx.193:30207/apple
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.17.2</center>
</body>
</html>
[root@kube01 ingress]# curl http://xx.xx.xx.193:30207/banana
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.17.2</center>
</body>
</html>
[root@kube01 ingress]#

卷曲http://xx.xx.xx.193:30207/apple 卷曲http://xx.xx.xx.193:30207/banana 从外部或浏览器访问时,上述语句应分别显示apple和banana

更新:我进入了 ingress 控制器正在运行的 pod 并检查了它的配置文件,发现 ingress 资源没有应用于控制器。我尝试重新启动容器,但没有成功。我也尝试重新应用入口资源,但 pod 中的配置文件没有改变。进入控制器的所有内容都在配置文件中的位置标记中抛出 404。任何关于为什么资源没有被应用到控制器的帮助表示赞赏

root@nginx-ingress-685d7964cd-djvgf:/etc/nginx# cat nginx.conf

user  nginx;
worker_processes  auto;
daemon off;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events 
    worker_connections  1024;


http 
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';


    access_log  /var/log/nginx/access.log  main;


    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout 65s;
    keepalive_requests 100;

    #gzip  on;

    server_names_hash_max_size 512;


    variables_hash_bucket_size 256;
    variables_hash_max_size 1024;

    map $http_upgrade $connection_upgrade 
        default upgrade;
        ''      close;
    





    server 
        listen 80 default_server;
        listen 443 ssl default_server;

        ssl_certificate /etc/nginx/secrets/default;
        ssl_certificate_key /etc/nginx/secrets/default;

        server_name _;
        server_tokens "on";
        access_log off;



        location / 
           return 404;
        
    
    # stub_status
    server 
        listen 8080;

        allow 127.0.0.1;
        deny all;
        location /stub_status 
            stub_status;
        
    

    include /etc/nginx/config-version.conf;
    include /etc/nginx/conf.d/*.conf;

    server 
        listen unix:/var/run/nginx-502-server.sock;
        access_log off;

        location / 
            return 502;
        
    


stream 
    log_format  stream-main  '$remote_addr [$time_local] '
                      '$protocol $status $bytes_sent $bytes_received '
                      '$session_time';

    access_log  /var/log/nginx/stream-access.log  stream-main;



root@nginx-ingress-685d7964cd-djvgf:/etc/nginx#

【问题讨论】:

嗨,我可以看到这是旧案子。你解决了吗? 您好,已解决。我没有为入口设置主机地址。为 ingress 设置主机地址后,就解决了 【参考方案1】:

我在我的情况下修复了它。

我的入口看起来像这样(ingress.yaml):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  namespace: sample
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

我为路径添加了一个通配符,如下::

          - path: /*

并重新应用此入口资源:kubectl apply -f ingress.yaml

然后它起作用了!

【讨论】:

【参考方案2】:

我的 cmets 很少(我注意到的):

1,您的入口在默认命名空间中工作:

  Namespace:        default
  instead of nginx-ingress namespace

2,在您的kubectl describe ing example-ingress 中没有如下注释:

kubernetes.io/ingress.class:  nginx

3,我遇到了同样的问题,我无法访问该服务,但是当您使用 ssl-redirect: "false" 选项更改入口控制器的 configmap 时,它会起作用。然后它会在你的入口资源中没有spec.rules.host parameter 的情况下工作。

希望有帮助

【讨论】:

当我尝试没有“https”的网址时工作

以上是关于Nginx Ingress 给 404 未找到任何入口资源的主要内容,如果未能解决你的问题,请参考以下文章

Django 静态文件 404 未找到 nginx

Kubernetes Ingress Nginx 加载资源 404

未找到 nginx 位置 404

phpMyAdmin 显示 404 未找到(Ubuntu 18.04 Nginx)

Laravel 8 + nginx - 来自公共/未加载的 app.css 和 app.js 资源 - 未找到 404

服务未准备好:gitlab-managed-apps/ingress-nginx-ingress-controller