• nginx-ingress-controller自定义参数


    记录真实IP地址

    有时候我们需要在容器中获取客户端真实的IP等信息,而经过NginxIngressController转发后,这些信息不一定拿得到,所以我们需要对NginxIngressController进行配置。

    $ kubectl -n ingress-nginx edit configmap ingress-nginx-controller 
    # 在 data 字段添加下面三行
    data:
      compute-full-forwarded-for: "true"
      forwarded-for-header: X-Forwarded-For
      use-forwarded-headers: "true"
    
    # 重启 ingress-nginx-controller 容器
    $ kubectl -n ingress-nginx delete pod -l app.kubernetes.io/component=controller    
    pod "ingress-nginx-controller-6c979c5b47-hrb4k" deleted
    

    请注意:如果在 ingress-nginx-controller 高可用上的负载均衡器没有传递 X-Forwarded-For 的话,同样是获取不到真实IP地址的。

    如果 ingress-nginx-controller 是高可用的话,那么会出现多个节点有pod,必定是有一个负载均衡器。那么就获取不到真实IP地址,使用 nginx 做七层代理的话,需要在 location 加上以下几行参数

    map $http_x_forwarded_for $full_x_forwarded_for {
            default          "$http_x_forwarded_for, $realip_remote_addr";
            ''               "$realip_remote_addr";
    }
    
                    # Allow websocket connections
                    proxy_set_header                        Upgrade           $http_upgrade;
                    proxy_set_header X-Real-IP              $remote_addr;
                    proxy_set_header X-Forwarded-For        $full_x_forwarded_for;
    
                    # Pass the original X-Forwarded-For
                    proxy_set_header X-Original-Forwarded-For $http_x_forwarded_for;
    

    完整的nginx示例:

    下面的日志是通过 ingress 设置的域名访问,客户端收集的日志

    20.0.135.128 - - [24/Sep/2021:07:04:29 +0000] "GET /test/demo/ HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36" "192.168.32.1, 192.168.32.137"
    

    该行的第一个段是指 上一级的访问IP地址 。最后一段是指 真实客户端IP地址, 反向代理的后端IP地址

    设置日志格式

    修改 ingress-nginx-controller 的输出日志格式

    $ kubectl -n ingress-nginx edit configmap ingress-nginx-controller
    # 在 data 字段添加下面内容
    data:
      log-format-upstream: '{"time": "$time_iso8601", "k8s_service_name":"$service_name",
        "remote_addr": "$remote_addr", "x_forward_for": "$http_x_forwarded_for", "request_id":
        "$req_id", "remote_user": "$remote_user", "bytes_sent": $bytes_sent, "request_time":
        $request_time, "status": $status, "vhost": "$host", "request_proto": "$server_protocol",
        "path": "$uri", "request_query": "$args", "request_length": $request_length, "duration":
        $request_time,"method": "$request_method", "http_referrer": "$http_referer", "http_user_agent":
        "$http_user_agent" }'
    
    # 重启 ingress-nginx-controller 容器
    $ kubectl -n ingress-nginx delete pod -l app.kubernetes.io/component=controller
    pod "ingress-nginx-controller-6c979c5b47-n6stn" deleted
    

    优化参数

    $ kubectl -n ingress-nginx edit cm ingress-nginx-controller
    # 在 data 字段添加下面内容
    data:
      # 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
      client-header-buffer-size: 4k
      # 设置保持活动的客户端连接在服务器端保持打开状态的时间
      keep-alive: "60"
      # 设置可以通过一个保持活动连接提供的最大请求数。
      keep-alive-requests: "100"
      # 设置每个工作进程可以打开的最大并发连接数
      max-worker-connections: "65535"
      # 设置每个工作进程可以打开的最大文件数
      max-worker-open-files: "65535"
      # 激活缓存以连接到 upstream servers。 连接参数设置保留在每个工作进程的缓存中的 upstream servers 的空闲保持连接的最大数量。 超过此数量时,将关闭最近最少使用的连接。
      upstream-keepalive-connections: "10000"
      # 设置可以通过一个 keepalive 连接服务的最大请求数。 发出最大请求数后,连接关闭。
      upstream-keepalive-requests: "100"
      # 设置超时,在此期间,与 upstream servers 的空闲保持连接将保持打开状态。
      upstream-keepalive-timeout: "60"
    
    # 重启 ingress-nginx-controller 容器
    $ kubectl -n ingress-nginx delete pod -l app.kubernetes.io/component=controller
    pod "ingress-nginx-controller-6c979c5b47-csmcj" deleted
    
  • 相关阅读:
    PHP 抽象类
    PHP使用rabbitmq发邮件简单使用
    自定义Chrome插件Vimium
    用Paint Tool SAI绘制漫画
    AutoHotkey 使用笔记
    Unity 性能
    VS2015解决非Unicode编码包含中文字段无法编译的问题
    高DPI设置时禁用显示的方法
    Excel 统计在某个区间内数值的个数
    自定义宏把Word打造成全快捷键编辑器
  • 原文地址:https://www.cnblogs.com/mycloudedu/p/15262843.html
Copyright © 2020-2023  润新知