【问题标题】:Increase URL length limit for K8S ingress增加 K8S 入口的 URL 长度限制
【发布时间】:2020-03-23 08:59:26
【问题描述】:

我有一个 GET 请求 URL 到我的 kubernetes 上的一个服务中,它大约 9k 长,并且该请求似乎卡在了 Kubernetes 的入口中。当我尝试从 docker 内或集群中的其他 docker 调用 url 时,它工作正常。但是,当我通过域名时,我得到以下响应标头:

【问题讨论】:

    标签: http kubernetes kubernetes-ingress nginx-ingress


    【解决方案1】:
    1. 在 nginx 入口控制器 pod 描述中找到 configmap 名称
    kubectl -n utility describe pods/test-nginx-ingress-controller-584dd58494-d8fqr |grep configmap
          --configmap=test-namespace/test-nginx-ingress-controller
    

    注意:在我的例子中,命名空间是“test-namespace”,配置映射名称是“test-nginx-ingress-controller”

    1. 创建一个 configmap yaml
    cat  << EOF > test-nginx-ingress-controller-configmap.yaml
    
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: test-nginx-ingress-controller
      namespace: test-namespace
    data:
      large-client-header-buffers: "4 16k"
    EOF
    

    注意:请根据步骤 1

    中的发现替换 namespaceconfigmap name >
    1. 部署 configmap yaml
    kubectl apply -f test-nginx-ingress-controller-configmap.yaml
    

    然后你会看到更改在几分钟后更新到 nginx 控制器 pod

    i.g.
    kubectl -n test-namespace exec -it test-nginx-ingress-controller-584dd58494-d8fqr -- cat /etc/nginx/nginx.conf|grep large
        large_client_header_buffers     4 16k;
    
    

    感谢NeverEndingQueueHow to use ConfigMap configuration with Helm NginX Ingress controller - Kubernetes的分享

    【讨论】:

      【解决方案2】:

      就我而言,我必须在我的入口 server-sn-p 注释中设置 http2_max_header_sizehttp2_max_field_size。例如:

      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        annotations:
          nginx.ingress.kubernetes.io/server-snippet: |
              http2_max_header_size 16k;
              http2_max_field_size 16k;
      

      我在 Google Chrome 中获得 ERR_CONNECTION_CLOSED 和 ERR_FAILED 并使用 curl 获得“空响应”,但如果直接从集群网络访问,后端将工作。

      在入口控制器 ConfigMap 中分配 client-header-buffer-sizelarge-client-header-buffers 似乎对我也不起作用,但我意识到如果使用 HTTP 1.1 (curl --http1.1),curl 会做到这一点

      【讨论】:

        【解决方案3】:

        我认为你必须修改的参数是Client Body Buffer Size

        为每个位置读取客户端请求正文设置缓冲区大小。如果 请求正文大于缓冲区,整个正文或仅其 部分被写入临时文件。默认情况下,缓冲区大小相等 到两个内存页。这是 x86、其他 32 位平台上的 8K 和 x86-64。在其他 64 位平台上通常为 16K。这个注解 应用于入口规则中提供的每个位置

        nginx.ingress.kubernetes.io/client-body-buffer-size: "1000" # 1000 bytes
        nginx.ingress.kubernetes.io/client-body-buffer-size: 1k # 1 kilobyte
        nginx.ingress.kubernetes.io/client-body-buffer-size: 1K # 1 kilobyte
        nginx.ingress.kubernetes.io/client-body-buffer-size: 1m # 1 megabyte
        

        所以你必须在你的 nginx 入口配置中添加一个annotation

        【讨论】:

        • 我们遇到了类似的问题,但这并没有帮助。使用 nginx-configmap 增加缓冲区大小的事件不起作用。
        猜你喜欢
        • 2011-02-04
        • 1970-01-01
        • 2018-03-26
        • 2015-11-22
        • 2011-03-20
        • 2010-09-19
        • 1970-01-01
        • 2012-12-01
        • 1970-01-01
        相关资源
        最近更新 更多