我在kubernetes上的服务中有一个GET请求URL,该请求URL的长度约为9k,似乎请求被卡在Kubernetes的入口中。当我尝试从Docker内部或群集中的其他Docker调用URL时,它可以正常工作。但是,当我查询域名时,会得到以下响应标题:
答案 0 :(得分:1)
我认为您必须修改的参数是客户端主体缓冲区大小
设置缓冲区大小,以读取每个位置的客户端请求正文。如果 请求主体大于缓冲区,整个主体或仅是其主体 部分被写入一个临时文件。默认情况下,缓冲区大小相等 到两个内存页面。在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。
答案 1 :(得分:0)
就我而言,我必须在入口服务器代码段注释中设置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可以做到这一点< / p>
答案 2 :(得分:0)
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
的分享