Reduzieren Sie AWS-Kosten mit Kubernetes Ingress mit Classic ELB Balancer


Vor einigen Monaten schrieb ich einen Artikel über den Kubernetes Nginx Ingress- Controller, der in diesem Blog an zweiter Stelle steht. Das Hauptthema ist die Verwendung von Kubernetes Ingress für lokale Bereitstellungen. Die meisten Benutzer verwenden jedoch Kubernetes in der AWS-Cloud und in öffentlichen Cloud-Diensten anderer Anbieter. Das Problem ist jedoch, dass AWS für jeden Dienst vom Typ LoadBalancer einen neuen ELB (Elastic Load Balancer) erstellt. Dies kann eine zu teure Belohnung sein. Wenn Sie Kubernetes Ingress verwenden, benötigen Sie nur eine ELB.


Wie funktioniert es


Zum besseren Verständnis werde ich einige Diagramme geben. Ohne Ingress-Controller wird für jeden bereitgestellten Service ein separater klassischer ELB-Balancer erstellt:



Wenn Sie Ingress verwenden, benötigen Sie nur einen solchen ELB-Balancer, der alle Anforderungen an Ingress-Proxys weiterleitet, die im Cluster ausgeführt werden:



Betrachten Sie die Kosten des Classic Load Balancer:


Sie müssen für jede volle oder unvollständige Stunde des Load Balancers Classic Load Balancer und für jedes damit übertragene Gigabyte an Daten bezahlen.

Dies bedeutet, dass Sie bei Verwendung eines Clusters in der Region US-Ost für jeden erbrachten Service ungefähr 18,25 USD zahlen müssen. Sie müssen auch für jedes Gigabyte verarbeiteter Daten bezahlen. Mit Ingress können Sie die AWS-Kosten mit einer großen Anzahl von Services senken. Um eine hohe Verfügbarkeit sicherzustellen, können Sie natürlich mehrere Replikate des Ingress-Proxy-Pods verwenden.


Stellen Sie Nginx Ingress bereit


Für den Ingress-Controller stehen zahlreiche Optionen zur Verfügung, z. B. Traefik , Voyager (für HAProxy), Contour (für Envoy ) oder sogar den Ingress AWS ALB- Controller (Alpha-Version), der sich geringfügig von den anderen unterscheidet. In diesem Beitrag beschäftige ich mich mit dem derzeit am häufigsten verwendeten Ingress Nginx- Controller. Im Gegensatz zum vorherigen Artikel über den Ingress Nginx- Controller verwende ich dieses Mal Helm für die Bereitstellung:


cat > values.yaml <<EOF controller: replicaCount: 2 config: use-proxy-protocol: "true" service: annotations: service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: '*' EOF helm install --name ingress \ --namespace ingress \ -f values.yaml \ stable/nginx-ingress 

Hinweis Es gibt ein Problem mit Helm, dass Boolesche Werte bei Verwendung des set-Arguments nicht als Zeichenfolgen analysiert werden. Daher habe ich eine Datei mit Werten erstellt und --set Standardwerte nicht über --set und --set-string .


Wenn Sie den Herd überprüfen, werden standardmäßig zwei Dienste angezeigt, der Controller und die Serverseite:


 kubectl get pod -n ingress --selector=app=nginx-ingress NAME READY STATUS RESTARTS AGE ingress-nginx-ingress-controller-8689c87db7-jlwxv 1/1 Running 0 5m ingress-nginx-ingress-controller-8689c87db7-kv859 1/1 Running 0 5m ingress-nginx-ingress-default-backend-5f5888cc9b-jdjrp 1/1 Running 0 5m 

Einige Punkte sollten hier erklärt werden. Da alle Anforderungen unter dem Ingress-Controller ausgeführt werden, ist es wünschenswert, mindestens zwei seiner Replikate zu haben. Dies ist im Wesentlichen ein interner Proxyserver. Der Controller verwendet das Standard-Backend, um nicht vorhandene Ingress-Ressourcen weiterzuleiten. Die Serverseite ist standardmäßig ziemlich einfach. Um die Quell-IP-Adressen im Ingress-Proxy-Protokoll abzurufen, habe ich das Proxy-Protokoll für Nginx und ELB mit den folgenden beiden Einstellungen aktiviert:


 --set controller.service.annotations."service\\.beta\\.kubernetes\\.io/aws-load-balancer-proxy-protocol"='*' \ --set-string controller.config.use-proxy-protocol=true \ 

Das Proxy-Verbindungsprotokoll dient zur Kommunikation von Proxy-Servern, ohne dass Clientdaten verloren gehen.


Und als Bonus können Sie jetzt ganz einfach automatisches DNS erhalten. Erstellen Sie zunächst einen DNS-A- *.test.example.com mit Metazeichen wie *.test.example.com , der auf den Ingress ELB-Controller *.test.example.com . Die ELB-Adresse kann mit diesem Befehl abgerufen werden:


 kubectl get svc ingress-nginx-ingress-controller -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' -n ingress a00950ebcfd0411e740ee0207cf10ce8-1089949860.eu-west-1.elb.amazonaws.com 

Wenn Sie dann den Ingress-Einstiegspunkt mit dem Host site1.test.example.com , können site1.test.example.com diese Zeile sofort im Browser eingeben. DNS löst den Namen ohne zusätzliche Konfiguration auf. Die Verwendung eines DNS-Eintrags mit Metazeichen ist keine gute Idee, funktioniert aber. Um DNS im Detail zu konfigurieren, können Sie externes DNS für Kubernetes verwenden.


Fazit


Die Verwendung des Ingress-Controllers trägt wirklich dazu bei, einen höheren Automatisierungsgrad zu erreichen. Denken Sie jedoch daran, dass bei einem Ausfall auch alle externen Endpunkte ausfallen werden! Im nächsten Artikel werde ich zeigen, wie die automatische Aktualisierung und Installation von SSL-Zertifikaten mithilfe von Let's Encrypt konfiguriert wird. Danach können Sie standardmäßig automatisches DNS mit SSL-Endpunkten verwenden. Folgen Sie den Nachrichten.

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


All Articles