web-dev-qa-db-fra.com

Le chemin d'entrée de Kubettes réécrit

Je suis en cours d'exécution Ingress pour certains services sur Kubettes, et bien que les services soient réaffectés à ces IP de groupe (un peu correctement), je ne sais pas comment résoudre correctement les chemins après que ces chemins de base, par exemple, si J'ai Tomcat dans le chemin / et nginx sur le chemin /nginx, n'importe quel chemin Tomcat après / ne résout pas et aucun chemin Nginx ne résolvait pas non plus pour même /. J'ai déjà nginx.ingress.kubernetes.io/rewrite-target: / défini dans mon ingress.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: Tomcat-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  namespace: kube-system
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: Tomcat-deployment-service 
          servicePort: 8080
      - path: /nginx
        backend:
          serviceName: nginx-deployment-service 
          servicePort: 80

Si Tomcat nécessite un /main.css Fichier, par exemple, le navigateur essaierait de chercher /main.css, mais cela retourne le default-backend.

En outre, si j'essaie de visiter /nginx (Tentative de frapper /) Sur le serveur Nginx, Nginx dit /nginx n'est pas trouvé (évidemment).

2019/03/02 08:12:04 [error] 8#8: *343 open() "/usr/share/nginx/html/nginx" failed (2: No such file or directory), client: 10.128.0.7, server: localhost, request: "GET /nginx HTTP/1.1", Host: "REDACTED_SERVER_IP"
10.128.0.7 - - [02/Mar/2019:08:12:04 +0000] "GET /nginx HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0" "REDACTED_CLIENT_IP, REDACTED_SERVER_IP"
10.40.1.1 - - [02/Mar/2019:08:12:05 +0000] "GET /nginx HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0" "REDACTED_CLIENT_IP, REDACTED_SERVER_IP"
2019/03/02 08:12:05 [error] 8#8: *344 open() "/usr/share/nginx/html/nginx" failed (2: No such file or directory), client: 10.40.1.1, server: localhost, request: "GET /nginx HTTP/1.1", Host: "REDACTED_SERVER_IP"

Comment puis-je faire des chemins après un path dans ingress.yaml Résolvez en considérant la partie de début du chemin tel que consulté depuis le service?

c'est à dire.

  1. Si Tomcat était une entrée en route pour /Tomcat, comment pourrais-je faire /Tomcat/main.css apparaître comme /main.css au serveur Tomcat (et ne pas résoudre à votre sauvegarde par défaut)?
  2. Si Nginx était une entrée en route pour /nginx, comment pourrais-je faire /nginx apparaître comme / au serveur Nginx (et ne pas apparaître comme /nginx)?

Je pensais que c'était ce que /rewrite-target supposait faire.

aurais-je besoin d'utiliser des caractères génériques ou quelque chose?

Mon entrée est la suivante:

Name:             Tomcat-ingress
Namespace:        kube-system
Address:          REDACTED_SERVER_IP
Default backend:  default-http-backend:80 (10.40.0.6:8080)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *         
        /        Tomcat-deployment-service:8080 (10.40.2.15:8080)
        /nginx   nginx-dep-ser:80 (10.40.0.26:80,10.40.1.46:80)
Annotations:
  ingress.kubernetes.io/url-map:                     k8s-um-kube-system-Tomcat-ingress--b0fc8aa23db1001d
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"nginx.ingress.kubernetes.io/rewrite-target":"/"},"name":"Tomcat-ingress","namespace":"kube-system"},"spec":{"rules":[{"http":{"paths":[{"backend":{"serviceName":"Tomcat-deployment-service","servicePort":8080},"path":"/"},{"backend":{"serviceName":"nginx-dep-ser","servicePort":80},"path":"/nginx"}]}}]}}

  nginx.ingress.kubernetes.io/rewrite-target:  /
  ingress.kubernetes.io/backends:              {"k8s-be-30985--b0fc8aa23db1001d":"HEALTHY","k8s-be-31229--b0fc8aa23db1001d":"HEALTHY","k8s-be-32736--b0fc8aa23db1001d":"HEALTHY"}
  ingress.kubernetes.io/forwarding-rule:       k8s-fw-kube-system-Tomcat-ingress--b0fc8aa23db1001d
  ingress.kubernetes.io/target-proxy:          k8s-tp-kube-system-Tomcat-ingress--b0fc8aa23db1001d
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  CREATE  33m                nginx-ingress-controller  Ingress kube-system/Tomcat-ingress
  Normal  ADD     33m                loadbalancer-controller   kube-system/Tomcat-ingress
  Normal  UPDATE  3m (x65 over 33m)  nginx-ingress-controller  Ingress kube-system/Tomcat-ingress
  Normal  CREATE  3m (x31 over 33m)  loadbalancer-controller   ip: REDACTED_SERVER_IP
6

Je suppose que vous avez une version assez récente du contrôleur d'entrée, et selon la Documentation :

Démarrer la version 0.22.0, Définitions d'entrée utilisant l'annotation nginx.ingress.kubernetes.io/rewrite-target ne sont pas compatibles avec les versions précédentes. Dans la version 0.22.0 et au-delà, toutes les sous-chaînes de l'URI de la demande devant être transmises au chemin de réécriture doivent être définies explicitement dans un groupe de capture .

Par exemple:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  name: Tomcat-ingress
  namespace: default 
spec:
  rules:
  - Host: rewrite.bar.com
    http:
      paths:
      - backend:
          serviceName: Tomcat-deployment-service
          servicePort: 8080
        path: /Tomcat/?(.*)
      - backend:
          serviceName: nginx-deployment-service
          servicePort: 80
        path: /nginx/?(.*)

Votre configuration actuelle fonctionne bien pour / et /nginx Destinations uniquement avec la version récente du contrôleur d'entrée.

Une autre chose importante, l'objet d'entrée doit être créé dans le même espace de noms avec le (s) service (s) qu'il fait référence. Sinon ingressant-nginx retourne généralement 503 Service Temporarily Unavailable Erreur.

Et il n'est pas autorisé à se référer à un service dans l'espace de noms différent du serviceName:

une étiquette DNS-1035 doit être constituée de caractères alphanumériques minuscules ou de '-', commencez par un caractère alphabétique et se terminer par un caractère alphanumérique (par exemple, "nom mon-nom" ou "ABC-123", le regex utilisé pour la validation est ' az? ')

3
VAS