Nginx Ingress运维相关知识点

本文介绍关于Nginx基础知识点,Nginx Ingress Controller实现原理,以及相关运维能力。

Nginx基础知识点

在Nginx中,可以采用指令来配置其转发代理功能逻辑。这些指令通常在/etc/nginx/nginx.conf配置文件中指定,或者在通过主配置文件include语句引入的其它配置文件中进行指定。其中Nginx配置文件主要由四部分:Main(全局设置)、Server(主机配置)、Upstream(负载均衡服务器设置)和Location(URL匹配特定位置设置)组成。

image

Nginx配置文件结构。

  1. Main块:配置影响Nginx全局的指令。一般有运行Nginx服务器的用户组、Nginx进程PID存放路径、日志存放路径、配置文件引入、允许生成Worker Process数等。

    # configuration file /etc/nginx/nginx.conf:
    # Configuration checksum: 15621323910982901520
    # setup custom paths that do not require root access
    pid /tmp/nginx/nginx.pid;
    daemon off;
    worker_processes 31;
    worker_cpu_affinity auto;
    worker_rlimit_nofile 1047552;
    worker_shutdown_timeout 240s ;
    access_log /var/log/nginx/access.log upstreaminfo  if=$loggable;
    error_log  /var/log/nginx/error.log notice;
  2. Events块:配置影响Nginx服务器或与发起网络请求的终端用户的网络连接,包括每个进程的最大连接数、选取哪种事件驱动模型处理连接请求等。

    events {
        multi_accept        on;
        worker_connections  65536;
        use                 epoll;
    }
  3. HTTP块:可以嵌套多个Server(每个server块配置了一个虚拟主机或服务器)、代理、缓存、日志定义等绝大多数功能和第三方模块的配置。例如文件引入、Mime-type定义、日志自定义、是否使用Sendfile传输文件、连接超时时间、单连接请求数等。

    http {
        lua_package_path "/etc/nginx/lua/?.lua;;";
        lua_shared_dict balancer_ewma 10M;
        lua_shared_dict balancer_ewma_last_touched_at 10M;
        lua_shared_dict balancer_ewma_locks 1M;
        lua_shared_dict certificate_data 20M;
        lua_shared_dict certificate_servers 5M;
        lua_shared_dict configuration_data 20M;
        lua_shared_dict global_throttle_cache 10M;
        lua_shared_dict ocsp_response_cache 5M;
        init_by_lua_block {
            collectgarbage("collect")
            -- init modules
            local ok, res
            ok, res = pcall(require, "lua_ingress")
            if not ok then
            error("require failed: " .. tostring(res))
            else
            lua_ingress = res
            lua_ingress.set_config({
                use_forwarded_headers = false,
                use_proxy_protocol = false,
                is_ssl_passthrough_enabled = false,
                http_redirect_code = 308,
                listen_ports = { ssl_proxy = "442", https = "443" },
                hsts = true,
                hsts_max_age = 15724800,
                hsts_include_subdomains = true,
                hsts_preload = false,
            ... 
        }
        ...
    }
  4. Server块:配置虚拟主机的相关参数,一个HTTP中可以有多个Server。

        ## start server www.exmaple.com
        server {
            server_name www.example.com ;
            listen 80  ;
            listen [::]:80  ;
            listen 443  ssl http2 ;
            listen [::]:443  ssl http2 ;
            set $proxy_upstream_name "-";
            ssl_certificate_by_lua_block {
                certificate.call()
            }
            location / {
                set $namespace      "xapi";
                set $ingress_name   "xapi-server";
                set $service_name   "xapi-server-rta";
                set $service_port   "80";
                set $location_path  "/";
                set $global_rate_limit_exceeding n;
                rewrite_by_lua_block {
                    lua_ingress.rewrite({
                        force_ssl_redirect = false,
                        ssl_redirect = false,
                        force_no_ssl_redirect = false,
                        preserve_trailing_slash = false,
                        use_port_in_redirects = false,
                        global_throttle = { namespace = "", limit = 0, window_size = 0, key = { }, ignored_cidrs = { } },
                    })
                    balancer.rewrite()
                    plugins.run()
                }
               ...
            }
    }
    ## end server www.example.com
  5. Location块:配置请求的路由,以及各种页面的处理情况。

    location / {
      proxy_pass http://upstream_balancer;
    }

下面是一个示例Nginx.conf文件,其中包含一些常见的指令块:

# the number of worker processes to use
worker_processes 4;

# include additional configuration files
include /etc/nginx/conf.d/*.conf;

http {
  # HTTP server settings
  server {
    # listen on port 80
    listen 80;

    # server name
    server_name www.example.com;

    # default location
    location / {
      # root directory
      root /var/www/html;

      # index file
      index index.html;
    }
  }
}

在此示例中:

  • worker_processes:指令指定Nginx应使用的工作进程数。

  • include:指令用于包含其他配置文件。

  • server:块包含特定服务器的设置。

  • location:块指定默认位置的设置,即服务器的根URL。

了解更多的指令详细信息,请参见Nginx官方文档

接下来,我们将概述在Nginx配置文件中最关键的几个部分。

指令块

HTTP块

HTTP块在Nginx配置文件中定义了HTTP服务器的全局配置参数。这些参数包括运行的工作进程的数量、允许的最大连接数、日志记录的细节等。以下是一个Nginx配置文件中HTTP块的示例:

http {
    worker_processes 4;  
    worker_rlimit_nofile 8192; 
    client_max_body_size 128m; 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 

    server {
        ...
    }
}

在该示例中,HTTP块设定了工作进程的数量、文件描述符的最大数量以及客户端请求允许的最大正文大小。它还指定了访问和错误日志的位置,并且该HTTP块内嵌了一个server块,用于指定Web服务器的配置。

Server块

在Nginx配置中,Server块用于定义特定域名或一组域名的流量请求处理规则。允许您为同一服务器上托管的多个网站或应用程序定义不同的设置和行为。

以下是Nginx配置文件中服务器块的示例:

server {
    listen 80;
    server_name www.example.com;

    location / {
        root /var/www/html/example;
        index index.html index.htm;
    }

    location /app {
        proxy_pass http://localhost:3000;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

在此示例中,服务器只处理端口80上www.example.com域的未加密流量。

  • listen指定服务器应侦听端口80上的传入连接。

  • server_name指定此服务器块应处理的域名。

  • listenserver_name一起使用来定义服务器应该侦听和处理流量的域和端口。

server_name指令

指定虚拟主机域名。

server_name name1 name2 name3

# example:
server_name www.example.com;

域名匹配的四种写法:

  • 精确匹配:server_name www.example.com

  • 左侧通配:server_name *.example.com

  • 右侧统配:server_name www.example.*

  • 正则匹配:server_name ~^www\.example\.*$

匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配

Location块

在Nginx中,Location块是用来定义服务器对于特定URL路径或URL模式的请求处理规则。允许您根据网站或应用程序的不同部分定义不同的行为,如为特定目录提供静态文件,或将请求代理到另一台服务器。

以下是Nginx配置文件中位置块的示例:

server {
    ...

    location / {
        root /var/www/html/example;
        index index.html index.htm;
    }

    location /app {
        proxy_pass http://localhost:3000;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

在此例子中:

  • / 的位置块指定应通过提供/var/www/html/example目录中的文件来处理对网站根URL的请求。

  • /app的位置块指定对/appURL的请求应代理到端口3000上的localhost

  • /50x.html的位置块指定服务器应如何通过提供特定文件来处理服务器错误。

在Nginx中,当存在多个location块时,请求的处理将根据location的匹配规则和优先级被第一个相匹配的location块捕获并处理。

语法拼接:

  • location [ = | ~ | ~* | ^~ ] uri { ... }

  • location @name { ... }

语法规则

描述

location = /uri

= 开头表示精确匹配,只有完全匹配上才能生效。

location ^~ /uri

^~ 开头对URL路径进行前缀匹配,并且在正则表达式之前,匹配到即停止搜索。

location ~ 正则表达式

~ 开头表示区分大小写的正则匹配。

location ~* 正则表达式

~* 开头表示不区分大小写的正则匹配。

location !~ 正则表达式

!~ 区分大小写不匹配的正则。

location !~*正则表达式

!~* 不区分大小写不匹配的正则。

location /uri

不带任何修饰符,也表示前缀匹配,但在正则匹配之后。

location /

通用匹配,任何未匹配到其他location的请求都会匹配到,相当于Switch中的Default。

location @名称

Nginx内部跳转。

匹配优先级: = > ^~ > ~ > ~* > 不带任何字符

参考示例如下:

# 通用的默认匹配,所有未匹配location的都会匹配此种匹配;
location = / {
}
# 前缀匹配
location ^~ /xx/ {
     # 匹配任何以 /xx/ 开头的请求并且停止搜索。
}
# 不带正则描述的前缀匹配;
location  /uri {
}

location / {
     # 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
}

# 正则匹配
location ~*.(gif|jpg|jpeg)$ {
     # 匹配任何已 gif、jpg 或 jpeg 结尾的请求。
}

Nginx Ingress会将Host下多个Ingress path按长度降序进行排序。了解更多详情,请参见Ingress路径匹配Nginx的服务器和位置块选择算法

指令继承和覆盖

在Nginx配置中,指令遵循从外到内的继承机制,位于内部的子上下文会从其外层的父上下文中继承配置指令。例如,在http{}上下文中设置的指令会被所有嵌套于其下的server{}location{}上下文所继承,同样,server{}上下文中的指令会被它所包含的所有location{}上下文继承。需要注意的是,当同一个指令在父子上下文中均被定义时,子上下文中的配置将覆盖父上下文中的相应设置,而不是叠加。

参考示例如下:

http {
    add_header X-HTTP-LEVEL-HEADER 1;
    add_header X-ANOTHER-HTTP-LEVEL-HEADER 1;

    server {
        listen 8080;
        location / {
            return 200 "OK";
        } 
    }

    server {
        listen 8081;
        add_header X-SERVER-LEVEL-HEADER 1;

        location / {
            return 200 "OK";
        }

        location /test {
            add_header X-LOCATION-LEVEL-HEADER 1;
            return 200 "OK";
        }

        location /correct {
            add_header X-HTTP-LEVEL-HEADER 1;
            add_header X-ANOTHER-HTTP-LEVEL-HEADER 1;

            add_header X-SERVER-LEVEL-HEADER 1;
            add_header X-LOCATION-LEVEL-HEADER 1;
            return 200 "OK";
        } 
    }
}

Nginx的反向代理配置

proxy_pass指令

Nginx反向代理配置使得Nginx作为代理服务器运行,它监听客户端请求并将其转发至一个或多个后端服务器。这使得Nginx能够接收请求并将其路由至合适的后端服务进行处理。配置Nginx反向代理,可以在Nginx配置中的位置块中使用proxy_pass指令。

以下是配置Nginx反向代理的示例:

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://localhost:3000;
    }
}

在此示例中,/的位置块指定对www.example.com域的所有请求都应代理到端口3000上的本地主机。这意味着Nginx将接收的请求都将其转发到在localhost上运行的服务器3000端口。

proxy_set_header指令

还可以使用proxy_set_header指令指定要添加到代理请求中的其他标头。

请参考,示例如下:

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://localhost:3000;
    }
}

在此示例中,proxy_set_header指令指定应将HostX-Real-IP标头添加到代理请求中,并将传入请求的主机名和发出请求的客户端的IP地址分别设置为对应的值。这对于将传入请求的信息传递到上游服务器非常有用。

Nginx常用指令

常用指令

描述

proxy_pass

指定将请求转发到哪个后端服务器,可以是IP地址加端口号,也可以是域名。

proxy_set_header

设置转发给后端服务器的请求头信息,如Host、X-Real-IP等。

proxy_read_timeout

设置与后端服务器建立连接的超时时间。

proxy_buffer_size和proxy_buffers

设置缓存后端服务器响应的缓冲区大小。

Nginx常用命令

常用命令

描述

nginx -s reload

向主进程发送信号,重新加载配置文件,进行热重启。

nginx -s reopen

重启Nginx。

nginx -s stop

快速关闭。

nginx -s quit

等待工作进程处理完成后关闭。

nginx -T

查看当前Nginx最终的配置。

nginx -t

检查配置是否有问题。

Nginx Ingress Controller

实现原理

Nginx Ingress Controller是一个集控制平面和数据平面于一体的实现方案。每个Pod下有一个Controller进程,同时也包含Nginx相关进程。

image

Nginx Ingress数据面相关核心模块

第三方模块:

了解更多模块详情,请参见Nginx官方文档

配置同步原理

了解配置同步的工作原理之后,我们便能够掌握如何减少配置Reload的频率,以及在何种情况下需要执行配置Reload。

image

Nginx Ingress Controller通过Watch Ingress、Service、Pod、Endpoint相关资源,将配置更新到nginx.conf或者lua table下。Lua部分主要包含了Upstream端点、灰度发布和证书部分,对应Nginx本身其他的相关变量参数,若修改了还是会导致nginx.conf发生变更,触发Reload。详细信息,请参见Nginx ingress社区文档部分《When a reload is required》。

Nginx Ingress控制面配置

启动参数说明

了解更多启动参数详情,请参见Ingress控制器命令行参数

查看Nginx Ingress对应的Deployment或者Pod Spec可以看到Nginx-ingress对应的Container的启动参数,大致如下:

containers:
  - args:
    - /nginx-ingress-controller
    - --election-id=ingress-controller-leader-nginx
    - --ingress-class=nginx
    - --watch-ingress-without-class
    - --controller-class=k8s.io/ingress-nginx
    - --configmap=$(POD_NAMESPACE)/nginx-configuration
    - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
    - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
    - --annotations-prefix=nginx.ingress.kubernetes.io
    - --publish-service=$(POD_NAMESPACE)/nginx-ingress-lb
    - --enable-annotation-validation
    - --validating-webhook=:8443
    - --validating-webhook-certificate=/usr/local/certificates/cert
    - --validating-webhook-key=/usr/local/certificates/key
    - --v=2

其中-v指定日志级别:

  • --v=2使用Diff显示有关Nginx中配置更改的详细信息。

  • --v=3显示有关服务、入口规则、端点更改的详细信息,并以JSON格式转储Nginx配置。

  • --v=5Debug调试模式。

负载均衡算法

Ingress Nginx允许设置全局默认的负载均衡算法,主要提供了Round_robin和Ewma两种选项,默认使用Round_robin。Round_robin算法循环遍历后端工作负载,使请求均匀分配,但如果后端性能差异较大,可能会出现负载不均衡。相反,Ewma算法可以将请求发送到加权平均负载最低的工作负载上,加权负载指数会随着请求的到来而逐渐变化,使得负载均衡更加均衡。

要使用IP或其他变量的一致哈希进行负载平衡,请考虑使用nginx.ingress.kubernetes.io/upstream-hash-by注释。要使用会话Cookie进行负载平衡,请考虑使用nginx.ingress.kubernetes.io/affinity注释。

相关实现:

相关超时配置

全局超时配置

可通过以下配置项进行Ingress Nginx的全局超时配置:

配置项

描述

默认值

proxy-connect-timeout

设置与代理服务器建立连接的超时时间。

默认5s,但通常不能超过75s。

proxy-read-timeout

设置从代理服务器读取响应的超时。该超时仅在两个连续的读取操作之间设置,而不是为整个响应的传输设置。

60s

proxy-send-timeout

设置向代理服务器传输请求的超时。该超时只在两个连续的写操作之间设置,而不是为整个请求的传输设置。

60s

proxy-stream-next-upstream-timeout

限制允许将连接传递到下一个服务器的时间。

默认为 600s,设置为0值则关闭此限制。

proxy-stream-timeout

设置客户端或代理服务器连接上两个连续的读或写操作之间的超时。如果在这个时间内没有传输数据,连接就会关闭

600s

upstream-keepalive-timeout

设置一个超时时间,在这个时间内,与上游服务器的空闲连接将保持开放。

60s

worker-shutdown-timeout

设置优雅停机的超时时间。

240s

proxy-protocol-header-timeout

设置接收代理协议头文件的超时值。默认的5秒可以防止TLS直通处理程序无限期地等待一个中断的连接。

5s

ssl-session-timeout

设置 SSL 会话缓存中的会话参数的有效时间。会话过期时间是相对于创建时间而言的。每个会话缓存会占用大约0.25MB的空间。

10m

client-body-timeout

定义读取客户端请求正文的超时。

60s

client-header-timeout

定义读取客户端请求头的超时。

60s

特定的资源自定义超时配置

以下是特定的资源自定义超时配置,以及相关的参数配置。

配置项

描述

nginx.ingress.kubernetes.io/proxy-connect-timeout

设置代理连接超时时间。

nginx.ingress.kubernetes.io/proxy-send-timeout

设置代理发送超时时间。

nginx.ingress.kubernetes.io/proxy-read-timeout

设置代理读取超时时间。

nginx.ingress.kubernetes.io/proxy-next-upstream

配置重试策略或者重试条件,可以使用多个组合用空格分隔,例如设置为http_500http_502、支持下列策略:

  • error:连接失败,直接返回。

  • timeout:连接超时,直接返回。

  • invalid_response:无效返回状态码,直接返回。

  • http_xxx:xxx可以替换为状态码,例如设置为http_500的含义是上游返回500时选择下一个工作负载。支持的状态码为:500、502、503、504、403、404、429。

  • off:关闭重试机制,不论任何错误都直接返回。

nginx.ingress.kubernetes.io/proxy-next-upstream-tries

如果满足重试条件,则可用的重试次数。

nginx.ingress.kubernetes.io/proxy-request-buffering

是否启用请求缓冲功能。

  • on启用请求缓冲。如果启用了请求缓冲功能,则会在接收到完整的请求数据之后才将其转发到后端工作负载,否则可能会在接收到部分请求数据时就开始转发请求。HTTP/1.1 Chunked编码的请求不受此参数限制,始终会进行缓冲。

  • off则禁用请求缓冲。如果禁用,发送过程中出现发送错误,就不会选择下一个工作负载进行重试。

通用全局配置ConfigMap

了解更多详情信息,请参见Nginx-configuration_configmap

其他Annotation

了解更多详情信息,请参见Nginx-configuration_annotations

自定义配置snippet

  • nginx.ingress.kubernetes.io/configuration-snippet:对应配置会生效到Location块下。

  • nginx.ingress.kubernetes.io/server-snippet:对应配置会生效到Server块下。

  • nginx.ingress.kubernetes.io/stream-snippet:对应配置会生效到Stream块下。

Nginx Ingress数据面配置

Nginx Ingress的数据平面是通过结合Nginx和ngx_lua模块(即OpenResty)来实现的。Nginx采用多模块化设计,把HTTP请求处理切分成多个阶段,允许多个模块协同工作,其中每个模块负责处理一个独立且简单的功能。使得处理更高效、更可靠,并提高了系统的可扩展性。

OpenResty依托NGINX的处理阶段,在Rewrite/Access阶段、Content阶段和Log阶段注入了自定义的Handler。加上系统启动的初始阶段,即Master阶段,总计OpenResty提供了11个阶段,这些阶段赋予了 Lua脚本在HTTP请求处理过程中介入的能力。接下来是OpenResty主要可用阶段的图示描述:

image

HTTP块

http {
    lua_package_path "/etc/nginx/lua/?.lua;;";
    lua_shared_dict balancer_ewma 10M;
    lua_shared_dict balancer_ewma_last_touched_at 10M;
    lua_shared_dict balancer_ewma_locks 1M;
    lua_shared_dict certificate_data 20M;
    lua_shared_dict certificate_servers 5M;
    lua_shared_dict configuration_data 20M;
    lua_shared_dict global_throttle_cache 10M;
    lua_shared_dict ocsp_response_cache 5M;
    ...
}

init_by_lua_block

init_by_lua_block {
        collectgarbage("collect")
        -- init modules
        local ok, res
        ok, res = pcall(require, "lua_ingress")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        lua_ingress = res
        lua_ingress.set_config({
            use_forwarded_headers = false,
            use_proxy_protocol = false,
            is_ssl_passthrough_enabled = false,
            http_redirect_code = 308,
            listen_ports = { ssl_proxy = "442", https = "443" },
            hsts = true,
            hsts_max_age = 15724800,
            hsts_include_subdomains = true,
            hsts_preload = false,
            global_throttle = {
                memcached = {
                    host = "", port = 11211, connect_timeout = 50, max_idle_timeout = 10000, pool_size = 50,
                },
                status_code = 429,
            }
        })
        end
        ok, res = pcall(require, "configuration")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        configuration = res
        configuration.prohibited_localhost_port = '10246'
        end
        ok, res = pcall(require, "balancer")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        balancer = res
        end
        ok, res = pcall(require, "monitor")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        monitor = res
        end
        ok, res = pcall(require, "certificate")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        certificate = res
        certificate.is_ocsp_stapling_enabled = false
        end
        ok, res = pcall(require, "plugins")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        plugins = res
        end
        ...
  }

初始化加载了Lua相关模块:

  • configuration

  • balancer

  • monitor

  • certificate

  • plugins

init_worker_by_lua_block

    init_worker_by_lua_block {
        lua_ingress.init_worker()
        balancer.init_worker()
        monitor.init_worker(10000)
        plugins.run()
    }

upstream和balancer_by_lua_block

    upstream upstream_balancer {
        ### Attention!!!
        #
        # We no longer create "upstream" section for every backend.
        # Backends are handled dynamically using Lua. If you would like to debug
        # and see what backends ingress-nginx has in its memory you can
        # install our kubectl plugin https://kubernetes.github.io/ingress-nginx/kubectl-plugin.
        # Once you have the plugin you can use "kubectl ingress-nginx backends" command to
        # inspect current backends.
        #
        ###
        server 0.0.0.1; # placeholder
        balancer_by_lua_block {
            balancer.balance()
        }
        keepalive 8000;
        keepalive_time 1h;
        keepalive_timeout  60s;
        keepalive_requests 10000;
    }

Stream块

stream {
    lua_package_path "/etc/nginx/lua/?.lua;/etc/nginx/lua/vendor/?.lua;;";
    lua_shared_dict tcp_udp_configuration_data 5M;
    resolver 192.168.0.10 valid=30s;
    init_by_lua_block {
        collectgarbage("collect")
        -- init modules
        local ok, res
        ok, res = pcall(require, "configuration")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        configuration = res
        end
        ok, res = pcall(require, "tcp_udp_configuration")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        tcp_udp_configuration = res
        tcp_udp_configuration.prohibited_localhost_port = '10246'
        end
        ok, res = pcall(require, "tcp_udp_balancer")
        if not ok then
        error("require failed: " .. tostring(res))
        else
        tcp_udp_balancer = res
        end
    }

    init_worker_by_lua_block {
        tcp_udp_balancer.init_worker()
    }
    lua_add_variable $proxy_upstream_name;
    log_format log_stream '[$remote_addr] [$time_local] $protocol $status $bytes_sent $bytes_received $session_time';
    access_log off;
    error_log  /var/log/nginx/error.log notice;
    upstream upstream_balancer {
        server 0.0.0.1:1234; # placeholder
        balancer_by_lua_block {
            tcp_udp_balancer.balance()
        }
    }
    server {
        listen 127.0.0.1:10247;
        access_log off;
        content_by_lua_block {
            tcp_udp_configuration.call()
        }
    }
  }

同HTTP类似,init_by_lua_block部分加载了TCP相关的Lua模块并进行了初始化。

日志相关

    access_log off;
    error_log  /var/log/nginx/error.log notice;
  • 关闭了access_log

  • 错误日志级别设置为了notice, 还可以设置为debug(debug_coredebug_allocdebug_eventdebug_http、...) 、infowarnerrorcritalertemerg等值,级别越高记录的信息越少。

执行以下命令,可以通过查看Nginx Ingress Pod日志是否有相关报错信息。

kubectl logs -f <nginx-ingress-pod-name> -n kube-system  |grep -E '^[WE]'

相关文档

关于Nginx Ingress的配置,请参见社区文档

关于Nginx Ingress排查方法,请参见常见检查方法

关于Nginx Ingress高级用法,请参见Nginx Ingress高级用法