400 Bad Request – cookie too large
28 de julho de 2021O NGINX INGRESS é um dos recursos utilizados no Kubernetes para receber as requisições externas e realizar um direcionamento para o serviço apropriado no cluster do Kubernetes.
Em alguns cenários na integração com o Keycloak, Identity Server e outros provedores de identidade pode vir a acontecer o erro 400 no nginx devido ao tamanho do request e/ou cookie. Para resolver esse problema é necessário uma configuração adicional no nginx ingress.
No meu contexto utilizei o Azure Kubernetes Service (AKS) como plataforma de kubernetes e nele adicionei um Ingress controller publicando usando o HELM padrão. Para adicionar as configurações foi necessário modificar o arquivo Configmap do Ingress aumentando o buffer do nginx.
1) Verifique no deployment do ingress uma referência ao configmap no item “Args:” e o valor “–configmap”.
Exeute o comando abaixo:
kubectl get deployment -n ingress-basic
2) No meu cenário encontrei item de deployment
nginx-ingress-ingress-nginx-controller
3) Execute um describe no deployment para verficar a indicação do configmap.
kubectl describe deployment nginx-ingress-ingress-nginx-controller -n ingress-basic
ou
kubectl edit deployment nginx-ingress-ingress-nginx-controller -n ingress-basic
4) Localize o arquivo configmap existente. Se não exitir crie um novo.
kubectl get configmap -n ingress-basic
5) Edit o arquivo arquivo configmap com as configurações aumentando o buffer no campo data.
Abra o configmap para edição. Modifique apenas os itens em negrito.
kubectl edit configmap nginx-ingress-ingress-nginx-controller -n ingress-basic
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
client-header-buffer-size: 64k
http2-max-field-size: 16k
http2-max-header-size: 128k
large-client-header-buffers: 8 64k
proxy-buffer-size: 128k
proxy-buffers: 4 256k
proxy-busy-buffers-size: 256k
kind: ConfigMap
metadata:
annotations:
meta.helm.sh/release-name: nginx-ingress
meta.helm.sh/release-namespace: ingress-basic
creationTimestamp: "2022-04-24T17:56:34Z"
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: nginx-ingress
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.2.0
helm.sh/chart: ingress-nginx-4.1.0
name: nginx-ingress-ingress-nginx-controller
namespace: ingress-basic
Após salvar e fechar ele já atualiza novamente.
6) Agora é necessário renicair os pods do ingress
Execute o comando e se ocorrer tudo certo os pods do nginx vão reiniciar e atualizar com essas configurações.
kubectl set env deployment nginx-ingress-ingress-nginx-controller DEPLOY_DATE=”$(date)” -n ingress-basic
Lembre que o “nginx-ingress-ingress-nginx-controller” pode mudar. Altere se necessário.
Obs: Esse artigo foi baseado no Azure AKS, Nginx Ingress publicado pelo helm no namespace ingress-basic. Modifique conforme a necessidade. Consulte os links de referência.
Para mais informações:
– Identity Server and NGINX Ingress Controller in Kubernetes
– Fixing Nginx “upstream sent too big header” error when running an ingress controller in Kubernetes
– How to Fix a 400 Bad Request Error [Causes and Fixes]
Para desenvolver o seu primeiro microsserviço em 30 minutos consulte os aceleradores do DevPrime Plataform e acelere a modernização de aplicações Cloud-Native.
[],
Ramon Durães