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
原文地址:https://www.cnblogs.com/mycloudedu/p/15262843.html