【发布时间】:2020-03-23 08:59:26
【问题描述】:
我有一个 GET 请求 URL 到我的 kubernetes 上的一个服务中,它大约 9k 长,并且该请求似乎卡在了 Kubernetes 的入口中。当我尝试从 docker 内或集群中的其他 docker 调用 url 时,它工作正常。但是,当我通过域名时,我得到以下响应标头:
【问题讨论】:
标签: http kubernetes kubernetes-ingress nginx-ingress
我有一个 GET 请求 URL 到我的 kubernetes 上的一个服务中,它大约 9k 长,并且该请求似乎卡在了 Kubernetes 的入口中。当我尝试从 docker 内或集群中的其他 docker 调用 url 时,它工作正常。但是,当我通过域名时,我得到以下响应标头:
【问题讨论】:
标签: http kubernetes kubernetes-ingress nginx-ingress
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”
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
中的发现替换 namespace 和 configmap name >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;
感谢NeverEndingQueue在How to use ConfigMap configuration with Helm NginX Ingress controller - Kubernetes的分享
【讨论】:
就我而言,我必须在我的入口 server-sn-p 注释中设置 http2_max_header_size 和 http2_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-size 或 large-client-header-buffers 似乎对我也不起作用,但我意识到如果使用 HTTP 1.1 (curl --http1.1),curl 会做到这一点
【讨论】:
我认为你必须修改的参数是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。
【讨论】: