400 Bad Request – cookie too large

28 de julho de 2021 Por Ramon Durães

O 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