
Dans cet article, je veux parler de deux possibilités d'NGINX Ingress liées à l'affichage de pages d'erreur personnalisées, ainsi que des limitations existantes et des moyens de les contourner.
1. Modification du backend par défaut
Par dĂ©faut, NGINX Ingress utilise un backend par dĂ©faut, qui remplit la fonction correspondante. Cela signifie que lorsqu'une requĂȘte Ingress est effectuĂ©e avec un hĂŽte qui n'existe pas dans les ressources Ingress, nous obtenons une page avec le code de rĂ©ponse 404 :
![]()
Cependant, de plus en plus de nos clients demandent de montrer leur propre page avec le logo de l'entreprise et d'autres commoditĂ©s au lieu du standard 404. Pour cela, NGINX Ingress dispose d'une pour remplacer default-backend-service. Nous passons en argument Ă l'option Ă©ponyme une entrĂ©e au format namespace/servicename. Le port du service doit ĂȘtre 80.
Pour cela, il est nécessaire de créer votre propre pod (déploiement) et service avec votre application ( du dépÎt ingress-nginx), qui sera renvoyé à la place du backend par défaut.
Voici une petite illustration :
~$ curl -i -XGET http://sadsdasdas.kube-cloud.my/
HTTP/1.1 404 Not Found
Date: Mon, 11 Mar 2019 05:38:15 GMT
Content-Type: */*
Transfer-Encoding: chunked
Connection: keep-alive
<span>La page que vous recherchez est introuvable.</span> Ainsi, tous les domaines qui ne sont pas explicitement créés via YAML avec kind: Ingress, tombent dans le backend par défaut. Dans la liste ci-dessus, ce domaine est devenu sadsdasdas.
2. Traitement des erreurs HTTP dans l'application par le backend par défaut
Une autre situation concerne les requĂȘtes se terminant par des erreurs HTTP (404, 500, 502âŠ) vers une application qui ne gĂšre pas de telles situations (les pages d'erreur correspondantes ne sont pas gĂ©nĂ©rĂ©es). Cela peut Ă©galement ĂȘtre dĂ» au dĂ©sir des dĂ©veloppeurs de renvoyer des pages d'erreur identiques dans plusieurs applications.
Pour réaliser ce cas du cÎté serveur, nous devons :
- Exécuter l'instruction ci-dessus du point concernant le backend par défaut ;
- Ajouter la clé
custom-http-errorsau ConfigMap de nginx-ingress, par exemple, avec la valeur404,503(clairement, correspond aux codes d'erreur auxquels la nouvelle rĂšgle s'applique).
Le rĂ©sultat attendu est atteint : lors du fonctionnement de l'application client, si une erreur avec un code de rĂ©ponse 404 ou 503 est obtenue, la requĂȘte sera automatiquement redirigĂ©e vers le nouveau backend par dĂ©fautâŠ
Cependant, lors du développement d'une application pour le backend par défaut et les custom-http-errors, il est important de prendre en compte un aspect essentiel :
!!! Important Le backend personnalisĂ© est censĂ© renvoyer le code d'Ă©tat HTTP correct au lieu de 200. NGINX ne change pas la rĂ©ponse du backend par dĂ©faut personnalisĂ©.Le fait est qu'en redirigeant la requĂȘte, des informations utiles sur l'ancien code de rĂ©ponse et des informations supplĂ©mentaires seront dans les en-tĂȘtes (liste complĂšte disponible ).
Cela signifie que vous devez vous-mĂȘme vous assurer que le code de rĂ©ponse est correct. de la documentation sur le fonctionnement de cela.
Différentes applications nécessitent un backend par défaut différent
Pour que la solution ne soit pas globale à tout le cluster, mais soit uniquement liée à des applications spécifiques, il faut d'abord vérifier la version de l'Ingress. Si elle est conforme à 0.23 ou supérieure, utilisez les annotations "natales" d'Ingress :
- Nous pouvons redéfinir
default-backendpour chaque d'Ingress en utilisant l'annotation ; - Nous pouvons redéfinir
custom-http-errorspour chaque d'Ingress en utilisant l'annotation .
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: {{ .Chart.Name }}-app2 annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/custom-http-errors: "404,502" nginx.ingress.kubernetes.io/default-backend: error-pages spec: tls: - hosts: - app2.example.com secretName: wildcard-tls rules: - host: app2.example.com http: paths: - path: / backend: serviceName: {{ .Chart.Name }}-app2 servicePort: 80
Dans ce cas, les erreurs 404 et 502 seront redirigĂ©es vers le service error-pages avec tous les en-tĂȘtes nĂ©cessaires.dans les versions prĂ©cĂ©dentes d'Ingress, cette possibilitĂ© n'Ă©tait pas disponible
Dans le commit marquant dans 0.23 (Ingress < 0.23 : premiĂšre approche
Cette option est plus simple. En tant qu'application qui fournit ses pages, nous avons un simple HTML qui ne sait pas lire les en-tĂȘtes et fournir des codes de rĂ©ponse corrects. Cette application est dĂ©ployĂ©e avec Ingress Ă l'url
, et dans le répertoire /error-pagesws se trouvera le HTML fourni. Illustration en YAML :
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: {{ .Chart.Name }}-app2 annotations: kubernetes.io/ingress.class: "nginx" ingress.kubernetes.io/server-snippet: | proxy_intercept_errors on; error_page 500 501 502 503 504 @error_pages; location @error_pages { rewrite ^ /error-pages/other/index.html break; proxy_pass http://error-pages.prod.svc.cluster.local; } spec: tls: - hosts: - app2.example.com secretName: wildcard-tls rules: - host: app2.example.com http: paths: - path: / backend: serviceName: {{ .Chart.Name }}-app2 servicePort: 80
Le service pour ce dĂ©ploiement doit ĂȘtre de type ClusterIP.Dans l'application oĂč nous traiterons l'erreur, nous ajoutons un server-snippet ou un configuration-snippet dans l'Ingress avec le contenu suivant :
Dans l'application oĂč nous allons traiter l'erreur, nous ajoutons un server-snippet ou un configuration-snippet dans l'Ingress avec le contenu suivant :
nginx.ingress.kubernetes.io /server-snippet: |
proxy_intercept_errors on;
error_page 500 501 502 503 504 @error_pages;
location @error_pages {
rewrite ^ /error-pages/ws/index.html break;
proxy_pass http://error-pages.prod.svc.cluster.local;
}Ingress < 0.23: deuxiĂšme approche
Option pour une application capable de traiter les en-tĂȘtes⊠D'ailleurs, c'est un chemin plus correct, empruntĂ© Ă custom-http-errors. Son utilisation manuelle (copie) permettra de ne pas modifier les paramĂštres globaux.
Les Ă©tapes suivantes. CrĂ©ons avec une application capable d'Ă©couter les en-tĂȘtes requis et de rĂ©pondre correctement. Ajoutons dans l'Ingress de l'application le server-snippet avec le contenu suivant :
nginx.ingress.kubernetes.io /server-snippet: |
proxy_intercept_errors off;
error_page 404 = @custom_404;
error_page 503 = @custom_503;
location @custom_404 {
internal;
proxy_intercept_errors off;
proxy_set_header X-Code 404;
proxy_set_header X-Format $http_accept;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Namespace $namespace;
proxy_set_header X-Ingress-Name $ingress_name;
proxy_set_header X-Service-Name $service_name;
proxy_set_header X-Service-Port $service_port;
proxy_set_header Host $best_http_host;
rewrite ^ /error-pages/ws/index.html break;
proxy_pass http://error-pages.prod.svc.cluster.local;
}
location @custom_503 {
internal;
proxy_intercept_errors off;
proxy_set_header X-Code 503;
proxy_set_header X-Format $http_accept;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Namespace $namespace;
proxy_set_header X-Ingress-Name $ingress_name;
proxy_set_header X-Service-Name $service_name;
proxy_set_header X-Service-Port $service_port;
proxy_set_header Host $best_http_host;
rewrite ^ /error-pages/ws/index.html break;
proxy_pass http://error-pages.prod.svc.cluster.local;
}Comme on peut le voir, pour chaque erreur que nous voulons traiter, il est nĂ©cessaire de crĂ©er un emplacement oĂč tous les en-tĂȘtes nĂ©cessaires seront insĂ©rĂ©s, comme dans le « natif » . Ainsi, nous pouvons crĂ©er diffĂ©rentes pages d'erreur personnalisĂ©es mĂȘme pour des emplacements et des serveurs distincts.
P.S.
Autre extrait de la série K8s tips & tricks :
- «»;
- «»;
- «»;
- «».
Lisez aussi dans notre blog :
- «»;
- «».
Source : habr.com
