Home Technische Artikel Implementierung des Edgio Delivery CDN als Ingress Provider in Ihrem Kubernetes Cluster
Applications

Implementierung des Edgio Delivery CDN als Ingress Provider in Ihrem Kubernetes Cluster

About The Author

Outline

Vorwort

Im Folgenden finden Sie ein Beispiel für die Integration von Kubernetes in den CDN-Service Edgio Delivery für erfahrene Kubernetes-Praktizierende. Es setzt Kenntnisse in Kubernetes und Kenntnisse über Standard-Internetprotokolle wie TCP, DNS und HTTP/HTTPS voraus. Das letzte Ziel besteht darin, eine Möglichkeit zu demonstrieren, wie der Edgio Delivery CDN-Service als Standard-Eingangsleistung angezeigt wird. Der Kubernetes-Benutzer kann die Eingangskonfiguration in vertrauten Systemen wie Portainer oder Terraform beibehalten .

Kubernetes

Kubernetes.io definiert Kubernetes als „ein Open-Source-System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung von containerisierten Anwendungen“. Es gibt mehrere Möglichkeiten, einen Cluster zu öffnen. Die schnellste und einfachste Möglichkeit besteht darin, einen der vielen Cloud-Anbieter zu nutzen, die Bereitstellungen mit nur einem Klick ermöglichen.

Kubernetes-Cluster enthalten viele Teile. In der Demo konzentrieren wir uns auf eine Teilmenge der Gesamtsumme.

Kubernetes Teile

  • Knoten: Maschine oder VM, die die Workloads und Services hostet.
  • Workload: Anwendung einfach oder komplex
  • Pod: Container, in denen die Anwendungssoftware ausgeführt wird. Ein oder mehrere Pods stellen eine Arbeitslast dar.
  • Service: Ein Mechanismus, der eine Workload anderen Workloads oder Eingängen zugänglich macht
  • Ingress: Ein Mechanismus, um Dienstleistungen der Außenwelt zugänglich zu machen

Edgio

Edgio macht Connected Living schneller, sicherer und einfacher zu verwalten, indem wir unübertroffene Geschwindigkeit, Sicherheit und Einfachheit an der Peripherie mit unseren nahtlos integrierten Bereitstellungs-, Anwendungs- und Streaming-Lösungen bereitstellen. Unsere weltweit skalierte Technologie und unsere Expertenservices verleihen den weltweit führenden Marken die Fähigkeit, jedem Nutzer die schnellsten, dynamischsten und reibungslosesten Bildungs-, Unterhaltungs-, Event- und Anwendungsprogramme zu bieten. Edgio ist ein Partner erster Wahl, der den weltweiten Internetverkehr fördert, um die beliebtesten Shows, Filme, Sport, Spiele und Musik zu unterstützen und Websites sofort zu laden.

Architektur

Edgio Delivery CDN

Für diese Demo verwenden wir das Edgio Python SDK bei GitHub – llnw/llnw-sdk-python: Limelight Networks Python SDK. Die Basiskonfiguration wird einfach gehalten.

Beim Konfigurieren des CDN sind die folgenden Daten (außer der Authentifizierung) erforderlich.

  • SHORTNAME: Eine eindeutige ID innerhalb des Edgio Delivery CDN, die CDN-Regeln enthält.
  • Veröffentlichter Hostname: Der Hostname, der vom CDN aus auf das Internet gerichtet ist. Im Fall dieser Demo wurde der Hostname cstradtman.s.llnwi.net bereits konfiguriert.
  • Veröffentlichter URL-Pfad: Der Pfad, der der betreffenden Regel zugeordnet ist.
  • Quell-Hostname: Der Hostname des Ursprungs. In diesem Fall weist ein Round-robin-Rekord auf den Kubernetes-Cluster hin.
  • Quell-URL-Pfad: Der Zielpfad, der mit dem Hostnamen verknüpft ist. In diesem Fall ist es leer, da wir es später in diesem Dokument beschreiben. In dieser Demo werden Workloads nach Portnummer und nicht nach Pfad unterschieden.

DNS

Die Demo verwendet die Vultr DNS-API. Das Konfigurieren des CDN mit IP-Adressen als Ursprung ist keine bewährte Vorgehensweise. Die Demo verwendet eine API zum Erstellen oder Ändern eines Round-robin-Datensatzes, der auf die Clusterknoten verweist.

Cluster

Die Demo befindet sich in Vultr auf einem Cluster mit drei Knoten.

Namespaces

Die Demo wird unter dem Standard-Namespace vorhanden sein, da sie das einzige Element ist, das auf diesem Cluster ausgeführt wird

Knoten

  • VKE-Cluster – je 3 Knoten mit
    • 4G-Zylinder
    • 80G-Festplatte
    • 2 vCPU
    • 1 G-Netzwerk

Workloads

Die Workload ist ein einfaches Python-Programm, das grundlegende Informationen über die HTTP-Verbindung zurückgibt. Wir stellen diese Demo inline bereit, was keine typische Bereitstellungsmethode ist. Sie ermöglicht es jedoch, dass die Demo vollständig in sich geschlossen ist, anstatt externe Abhängigkeiten zum Erstellen und Speichern der Container zu haben. Der Quellcode befindet sich in Anhang 1. Der tatsächliche Python-Code wird kursiv dargestellt, der YAML-Code, der das Deployment beschreibt, ist dies nicht. Die Workload verwendet TCP-Port 8000.

Services

Es stehen mehrere Servicetypen zur Verfügung. Wir verwenden den Servicetyp „NodePort“. Der Dienst wird auf den externen IP-Adressen des Clusters auf einer zufällig ausgewählten hohen Portnummer angegeben. Kubernetes kümmert sich um die Verbindung zu einem Knoten, auf dem die Workload ausgeführt wird.

Eindringen

Kubernetes Ingress ist ein Softwareobjekt, das das Verhalten einer Sammlung von Ressourcen beschreibt, die einen Kubernetes-Service außerhalb des Clusters verfügbar machen.

Ein Eingangssteuergerät kombiniert Software und/oder Hardware, die das Eingangssoftware-Objekt instanziiert.

Ein CDN ist ein funktionsreicher verteilter Reverse-Proxy. Neben der Reverse-Proxy-Funktion verfügen CDNs normalerweise über flexible Cache-Algorithmen, geografische Vielfalt, Sicherheitsfunktionen (ACLs (GEO, Method, regex), Webanwendungen Firewalls, Wasserzeichen und andere erweiterte Funktionen, die in einfachen Reverse-Proxys nicht zu finden sind.

Die APIs für die Kubernetes-Objektüberwachung sind gut definiert, und eine Reihe von HTTP-Reverse-Proxys und Load Balancer wurden erweitert, um als Eingangscontroller zu arbeiten. NGINX und HAProxy sind beispielsweise Proxys der alten Schule, die als Eingangsregler erweitert wurden, und solche wie Traefik und Itsio wurden parallel zu Kubernetes entwickelt. Ein CDN ist eine natürliche nächste Progression von einfachen Reverse Proxys. Im Fall dieser Demo erstellen wir einen benutzerdefinierten Eingangscontroller, der das Edgio Delivery CDN steuert. Die Daten, die normalerweise zur Beschreibung eines Eingangs erforderlich sind, sind

  • Öffentlicher Hostname: Der Hostname, auf dem der Kubernetes-Service verfügbar ist
  • Öffentlicher Pfad: Der Pfad, der mit dem öffentlichen Hostnamen verknüpft ist, auf dem die Kubernetes-Dienste verfügbar sind
  • Backend Service-Name: Service-Name, der von einer Kubernetes-Service-Stanz definiert wird
  • Backend-Port: Ein Name, der mit der Portbeschreibung in der Servicebeschreibung übereinstimmt

Edgio Delivery CDN-Asset-Zuordnungen:

Kubernetes

Edgio Delivery CDN

Öffentlicher Hostname

Veröffentlichter Hostname

Öffentlicher Pfad

Veröffentlichter URL-Pfad

Backend Service-Name

Einzigartig innerhalb des Kubernetes-Clusters

Nicht bekannt/für die Außenwelt verfügbar

Hostname der Quelle

Vollständig angegebener Domainname

Nicht wirklich eins zu eins

Die Logik dahinter ist:

  • Auf Namespace-Eingangsereignis aus dem Cluster horchen
  • Wenn der Ereignistyp „hinzugefügt“ ist.
    • Ruft die IP-Adresse der Knoten im Cluster ab
    • DNS-Datensatz in vultr erstellen
    • Erstellen Sie CDN-Regeln in Edgio CDN, die auf die erstellten DNS-Datensätze und den vom NodePort-Service zugewiesenen Port verweisen.
  • Wenn der Ereignistyp „geändert“ ist.
    • Suchen Sie CDN-Regeln in Edgio CDN, die mit dem vorhandenen Eingang übereinstimmen
    • Ändern Sie die Regeln in Edgio CDN, um neue Daten im Ereignis wiederzugeben
  • Wenn der Ereignistyp „gelöscht“ ist.
    • Suchen Sie CDN-Regeln in Edgio CDN, die mit entferntem Eingang übereinstimmen
    • Entfernen Sie DNS-Datensätze in Vultr, die mit diesem Eingang verknüpft sind
    • Entfernen Sie die CDN-Regeln in Edgio, die mit dem entfernten Eingang übereinstimmen

Konfiguration

Objekte

Kubernetes-Objekte werden in YAML-Dateien beschrieben. In Kubernetes ist jede Konfiguration ein Objekt. Sie können alle Deployment-Konfigurationen in einer einzigen Datei ablegen. Es ist gängige Praxis, sie nach dem Teil der Bereitstellung aufzuteilen, den sie beschreiben.

Bereitstellung

In Anhang 1 befindet sich eine große YAML-Datei, die eine Kombination aus Python-Code und YAML ist. Alles nach „spec.template.spec.containers.command”“ ist der Python-Code, der während der Bereitstellung in einen Container umgewandelt wird. Aus Sicht des Kubernetes-Objekts sind für uns folgende Zeilen wichtig:

  • Art: Deployment – beschreibt das Objekt als Deployment
  • Metadata.name: Der Name wird vom Service-Objekt verwendet, um die Verknüpfung zwischen den beiden zu erstellen.
  • Spec.selector.matchlabels.app: gibt an, auf welche Pods die Bereitstellung angewendet wird.
  • Spec.template.spec.Containers.image: Zeigt auf das offizielle Bild des Docker Hub Python 3
  • Spec.template.spec.containers.ports.name: Ein Label für den Port, der in diesem Fall in einem anderen Objects-Service referenziert werden soll
  • Spec.template.spec.Containers.Ports.containerport: Führt den TCP-Port auf, der vom ausgeführten Container bereitgestellt wird

Service

  • Art: Deployment – beschreibt das Objekt als Deployment
  • Metadata.name: Der Name wird vom eingehenden Objekt verwendet, um die Verknüpfung zwischen den beiden zu erstellen.
  • Spec.selector.app: verweist auf den Namen des Deployments – pywai-inline-Service, der im Deployment-Objekt genannt wird.
  • Spec.selector.type: Nodeport Hiermit wird dieser Service als Typ Nodeport definiert, wie oben beschrieben
  • Spec.ports.name: Das Label für den Port, der von anderen Objekten referenziert werden soll (in diesem Fall Eingang)
  • Spec.ports.protocol: definiert das verwendete IP-Protokoll – TCP
  • SPEC.Ports.Port: Definiert den Port, der von diesem Service angegeben wird
  • SPEC.Ports.targetPort: Verweist auf den Port, der von der Bereitstellung bereitgestellt wird – in diesem Fall pywai-inline-Deployment

Eindringen

In Anhang 3 sehen Sie die YAML-Datei, die das Kubernetes-Objekt für den Edgio Ingress Controller beschreibt. Es handelt sich um folgende Objekte:

  • Art: Ingress – Dies sagt Kubernetes, dass es sich um ein Ingress-Objekt handelt
  • Medatdata.name – alles in Kubernetes muss einen Namen haben
  • Metadaten.Labels.cdn – dieses Tag wird verwendet, um dem Eingangscontroller zu signalisieren, dass dieses Objekt für den Edgio-Eingangscontroller ist
  • Spec.rules.host – öffentlicher Hostname für die Bereitstellung des Dienstes.
  • Spec.rules.http.paths.path – Pfad, der mit dem Dienst verknüpft ist.
  • Spec.rules.http.paths.backend.service.name – Etikett des zu entdeckenden Dienstes
  • Spec.rules.http.paths.backend.service.port.name – Kennzeichnung des Ports des Dienstes, der offengelegt werden soll

Zuordnungen Konfigurieren

Geheimnisse

Kubernetes verfügt über ein integriertes Konzept von Geheimnissen für die Speicherung sensibler Daten. Diese Demo nutzt dies für die Benutzernamen und freigegebenen Schlüssel sowohl für Edgio SDK als auch für die Vultr DNS-API

Codebeispiele

Der Code für diese Demonstration, der im GIT-Repos enthalten ist

Zukünftige Erweiterungen und Verbesserungen des aktuellen Designs

In einem zukünftigen Beitrag zeigen wir Ihnen, wie Sie andere Edgio-Lösungen nutzen können, z. B. Anwendungen. Wir könnten den Kubernetes-Cluster als Möglichkeit verwenden, Konfigurationen zwischen mehreren Edgio CDN-Angeboten für verschiedene Workflows zu nutzen und zu synchronisieren.

Anhang 1 – pywai-inline-Deployment.yaml

ApiVersion: Apps/v1

Art: Bereitstellung

Metadaten:

Name: Pywai-inline-Deployment

Spez.:

Wahlschalter:

MatchLabels:

App: Pywai-Inline-Deployment

Replikate: 1

Vorlage:

Metadaten:

Etiketten:

App: Pywai-Inline-Deployment

Spez.:

Container:

– Name: python

Bild: python:3

Befehl:

– /Bin/sh

– „-c“

– |

Kat. > /test.py <<EOF

#!/usr/bin/env python3

“””

Sehr einfacher HTTP-Server in Python zum Protokollieren von Anforderungen

Verwendung:

./server.py [<Hafen>]

“””

Importieren Sie von http.server BaseHTTPRequestHandler, HTTPServer

Protokollierung importieren

pprint importieren

Klasse S (BaseHTTPRequestHandler):

def_Set_Response(Self):

self.send_response(200)

self.send_header(‘Content-type’, „Text/html“)

Self.end_headers()

def do_GET(Self):

logging.info(“GET Anforderung,\nPfad: %S\nHeader:\n%s\n“, str(Self.path), str(pprint.pformat(Self.Header))

Self._Set_response()

Headerinfo=pprint.pformat(self.headers.items())

clientinfo=pprint.pformat(Self.Client_address)

Lineinfo=pprint.pformat(Self.requestline)

versioninfo=pprint.pformat(Self.Request_Version)

Self.wfile.write(„<pre> {} </pre>”.Format(headerinfo).encode(‘utf-8’))

Self.wfile.write(„<pre> {} </pre>”.Format(clientinfo).encode(‘utf-8’))

Self.wfile.write(„<pre> {} </pre>”.Format(lineinfo).encode(‘utf-8’))

Self.wfile.write(„<pre> {} </pre>”.Format(versioninfo).encode(‘utf-8’))

def Run(Server_class=HTTPServer, Handler_class=S, Port=8080):

Logging.basicConfig(Level=Logging.INFO)

Server_address = (”, Port)

Httpd = Server_class(Server_address, Handler_class)

logging.info(‘Starting httpd…\n’)

Versuchen Sie es:

httpd.serve_forever()

Außer KeyboardInterrupt:

Pass

httpd.server_close()

logging.info(‘Stopping httpd…\n’)

Wenn __NAME__ == „__Main__“:

Aus SYS importieren argv

Wenn len(argv) == 2:

Run(Port=int(argv[1]))

Sonst:

Run()

EOF

exec Python /test.py 8000

Anschlüsse:

– Name: http

Containerport: 8000

Anhang 2 – pywai-inline-Service.yaml

ApiVersion: v1

Art: Service

Metadaten:

Name: Pywai-inline-Service

Spez.:

Wahlschalter:

App: Pywai-Inline-Deployment

Typ: NodePort

Anschlüsse:

– Name: http

protokoll: TCP

Hafen: 80

Zielport: 8000

Anhang 3 – pywai-edgio-ingress.yaml

ApiVersion: Networking.k8s.io/v1

Art: Eindringen

Metadaten:

Name: External-pywai-Inline-Inress

Anmerkungen:

kubernetes.io/ingress.class: Edgio

Etiketten:

cdn: Edgio

Spez.:

Regeln:

– Gastgeber: <Geben Sie den eindeutigen Kurznamen>.s.llnwi.net ein

http:

Pfade:

– Pfad: /fred

Pfadtyp: Exakt

Backend:

Service:

Name: External-pywai-inline-Service

Anschluss:

Name: Pywai-Port