Kubernetes Ingress mit den Augen eines Anfängers

Was ist Ingress?


Ingress ist der grundlegende Ressourcentyp in Coubertene. Wenn Sie in kubernetis einfach ein Objekt vom Typ Ingress deklarieren, geschieht nichts.


Damit diese Ressource im Kubernetis-Cluster funktioniert, muss der Ingress Controller installiert sein, der den Reverse-Proxy gemäß dem Ingress-Objekt konfiguriert.


Ingress Controller besteht aus zwei Komponenten - einem Reverse-Proxy und einem Controller, der mit dem Kubernetes-API-Server kommuniziert. Der Reverse-Proxy wartet auf eingehenden Datenverkehr an den in den Einstellungen angegebenen Ports (normalerweise ist in den Standardeinstellungen nur Port 80 angegeben). Der Controller kann entweder ein separater Daemon (wie in Nginx) oder ein im Proxy integrierter (wie in Traefik) sein.


Nicht alle Cloud-Kubernetes-Anbieter installieren Ingress Controller standardmäßig vor.


Controller können entweder als DaemonSet oder als Bereitstellung ausgeführt werden. Es ist ideal, DaemonSet als einzigen Ingress Controller zu verwenden, damit der Reverse Proxy alle IP-Adressen von Workern überwacht. Die Bereitstellung ist perfekt, wenn sich vor dem Ingress-Controller ein Balancer befindet - vom Kubernetis-Anbieter (GKE, AKS), MetalLB, wenn auf dem Server ein Premium- oder regulärer Haproxy / Nginx installiert ist (manuelle Konfiguration erforderlich). Mit dieser Installation können mehrere Ingress Controller installiert werden.


Wie eingehender Datenverkehr zum Ingress Controller gelangt


In allen Fällen überwacht der Reverse-Proxy im Ingress Controller Ports, an denen er auf http / https-Verbindungen wartet.


Auf den Verkehr an diesen Ports kann auf drei Arten zugegriffen werden:


  • NodePort (an zufälligen Ports im Bereich von 30000-32767)
  • HostPort (kann an die Ports 80, 443 gehängt werden)
  • Host-Netzwerk - Der Pod setzt seine Ports auf der öffentlichen Netzwerkschnittstelle (d. H. Alle Container-Ports sind geöffnet).

NodePort


Die Installation des Ingress Controllers auf einem NodePort ohne LoadBalancer ist wenig sinnvoll, da die URL den in NodePort http://domain.example.org:32200/ angegebenen Port enthält.


Für diese Option ist es besser, Bereitstellungen zu verwenden. Dies erleichtert das Skalieren der Anzahl der Pods, die für eingehenden Datenverkehr verantwortlich sind, das Registrieren von nodeAffinity für sie und das Ausführen mehrerer Ingress-Controller (z. B. für Produktion und Staging).


Hostport


Bei Verwendung von HostPort wird der Port von dem Host weitergeleitet, auf dem er unter demselben Pod ausgeführt wird. Ein LoadBalancer wird für die Eingabe nicht benötigt, aber damit die Site in DNS funktioniert, müssen Sie angeben, dass sich die Domänenadresse auf allen Knoten befindet.


Beispiel für eine DNS-Konfiguration für 3 Worker:


ingress.example.org A 10.0.0.1 ingress.example.org A 10.0.0.2 ingress.example.org A 10.0.0.3 www.example.org CNAME ingress.example.org 

Für diese Installation ist es am besten, DaemonSet seitdem zu verwenden Sie können nicht mehr als einen Pod auf einem Host ausführen. Eine Bereitstellung ist möglich, macht aber seitdem wenig Sinn Die Affinität muss registriert sein, damit 2 Pods nicht einem Host zugewiesen werden, da sonst ein Konflikt an den Ports auftritt.


Konfigurationsbeispiel für traefik
 kind: DaemonSet apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-controller namespace: traefik labels: k8s-app: traefik-ingress-lb spec: template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb namespace: traefik spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 containers: - image: traefik:1.7.6 name: traefik-ingress-lb ports: - name: http containerPort: 80 hostPort: 80 - name: https containerPort: 443 hostPort: 443 - name: admin containerPort: 8080 hostPort: 8080 securityContext: capabilities: drop: - ALL add: - NET_BIND_SERVICE args: - --api - --kubernetes - --logLevel=DEBUG - --entrypoints=Name:https Address::443 TLS - --entrypoints=Name:http Address::80 - --defaultentrypoints=http 

Host-Netzwerk


Beim Starten von Ingress Controller in einem gemeinsam genutzten Netzwerk mit dem Host ist keine Portweiterleitung erforderlich. In diesem Fall sind jedoch alle im Pod geöffneten Ports über das Internet zugänglich. Verwenden Sie zum Ausführen besser DaemonSet. Die Gründe sind dieselben wie bei HostPort - um Portkonflikte zu vermeiden.


Was zu wählen


Wenn sich in der Eingabe ein LoadBalancer befindet - NodePort, wenn nicht - HostPort + DNS Round Robin. Für Experimente können Sie das Host-Netzwerk ausprobieren, dies ist jedoch nicht sicher.

Source: https://habr.com/ru/post/de434524/


All Articles