Uma coisa problemática que ocorre no OpenShift 4.4+ e o fato de ignorar case sensitive em requisições (www-authenticate em vez de WWW-Authenticate).
Essas requests são prejudicadas da seguinte forma:
Detecção do Erro:
Em um POD para outro POD no mesmo namespace sua request curl funciona (sem mudar os textos), exemplo:
curl –verbose -X POST -H “Content-Type: application/json” -d ‘{}’ https://endpoint/api/v1/metrics/
WWW-Authenticate é WWW-Authenticate
Como gerar os sintomas? De um POD de fora do mesmo namespace o curl quebra (mexe no resultado dos caracteres), veja que WWW-Authenticate se torna www-authenticate.
Por que isso ocorre?
Openshift 4.4 subiu Haproxy para 2.0 forçando também as requests de http para 2 e isso tornou http 1 quebrado. Nesse HaProxy 2.0 tudo é direcionado para lowercase.
E para sanar?
Tenho 4 sugestões para isso:
1 – http-use-htx option
2 – h1-case-adjust-bogus-server option haproxy 2.1+ (Openshift currently uses 2.0)
3 – (mais para testes – ingress deve matar ainda):
curl –http1.1 -v -X POST -H “Content-Type: application/json” -d ‘{}’ \ https://endpoint/api/v1/metrics/
Forçando a request como 1.1 deve contornar o problema se precisar de muitas mudanças.
4 – rode:oc -n openshift-ingress-operator patch ingresscontrollers/default \
--type=merge \
--patch='{"spec":{"httpHeaders":{"headerNameCaseAdjustments":["WWW-Authenticate"]}}}'
Então por que o ponto 4 é o mais indicado?
https://docs.redhat.com/en/documentation/openshift_container_platform/4.13/html/networking/configuring-ingress
Na documentação temos o trecho:
For request headers, these adjustments are applied only for routes that have the haproxy.router.openshift.io/h1-adjust-case=true annotation. For response headers, these adjustments are applied to all HTTP responses. If this field is empty, no request headers are adjuste
Mas aí é onde mora a danada da pegadinha do malandro, vamos questionar algo?
O ajuste de nomes de headers vale sempre para respostas; para requisições só funciona em rotas que tenham a annotation haproxy.router.openshift.io/h1-adjust-case=true. como eu busco resposta então não precisa por annotation na route, certo?
Para encerrar o caso…
Esse ajuste só se aplica quando o tráfego é HTTP/1 (e em cleartext, edge-terminated ou re-encrypt). Passthrough não é ajustado porque o router não mexe nos headers…
