Zum Hauptinhalt springen

Static Egress

Die 'Static Egress'-Funktionalität ermöglicht es Pods innerhalb des Clusters, eine statische, vorhersehbare ausgehende IP-Adresse zu verwenden. Diese IP- Adresse kann dann in Systemen ausserhalb des NKE-Clusters verwendet werden, um den ausgehenden Datenverkehr der Pods zu restriktieren oder zu erlauben.

Details

Standardmässig verwenden Pods, die in NKE-Clustern laufen, die IP-Adresse des Nodes auf dem sie selbst laufen für Verbindungen zu externen (ausserhalb des Cluster) Systemen. Da sich die IP-Adressen von Nodes ändern und auch Pods auf verschiedenen Nodes gestartet werden können, ist es sehr schwierig, den Datenverkehr auf externen Systemen zu restriktieren. Die einzige Möglichkeit war bisher, den Verkehr von allen NKE-Subnetzen, die in Gebrauch sind, zu erlauben.

Mit der 'Static Egress'-Funktionalität wird diese Einschränkung überwunden. Sie erlaubt Pods, die ein bestimmtes Label gesetzt haben, eine statische IP für ausgehenden Datenverkehr zu verwenden. Der gesamte Egress-Verkehr dieser Pods wird über einen Node im NKE-Cluster geleitet und mit einer statischen Quell-IP versehen. Alle anderen Pods (die nicht über das spezifische Label verfügen) verwenden weiterhin die IP des Nodes, auf dem sie selbst laufen. Auf diese Weise kann der Datenverkehr von bestimmten Pods im Cluster auf externen Systemen (Firewalls usw.) zugelassen/verweigert werden.

Wenn die Node, welche für den statischen Egress-Verkehr ausgewählt wurde, während unseres Wartungsfensters ausgetauscht bzw. ersetzt wird, so wird automatisch eine neue Node ausgewählt, welche die 'Static Egress' Funktionalität für die Pods bereitstellt. Es werden nur Knoten aus dem "nine-Node-Pool" für diese Aufgabe ausgewählt.

Verfügbarkeit

Die 'Static Egress'-Funktionalität ist derzeitig für die folgenden Produkte verfügbar:

  • NKE Cluster
  • vClusters
  • Deploio-Applikationen

Benutzung

Die Konfiguration der statischen Egress-Funktion unterscheidet sich leicht, je nach verwendetem Produkt.

NKE Cluster

Um die Funktion auf NKE-Clustern zu aktivieren, musst du zuerst die Laufzeitumgebung des 'Static Egress'-Features auf dem NKE-Cluster selbst aktivieren. Die Laufzeitumgebung wählt den ausgehenden Node aus dem "nine"- Nodepool aus und bereitet alle Netzwerkkonfigurationen vor. Die Befehle, um die Laufzeitumgebung zu aktivieren, können aus untenstehender Liste entnommen werden. Die Aktivierung ist eine Voraussetzung, damit das "Static Egress"-Feature genutzt werden kann.

Aktivierung der Static Egress-Laufzeitumgebung

  1. Stelle sicher, dass du kubectl und nctl installiert hast.

  2. Starte die Authentifizierung gegenüber der API mit nctl:

    nctl auth login
  3. Erstelle eine Liste aller deiner Kubernetes Cluster um deinen präferierten NKE Cluster zu finden.

    nctl get clusters -A
  4. Sobald du einen NKE Cluster ausgewählt hast, kannst du die Laufzeitumgebung mittels kubectl und dem Kontext nineapis.ch aktivieren:

    kubectl --context=nineapis.ch patch kubernetescluster <NAME DES CLUSTERS> -n <PROJECT DES CLUSTERS> \
    --type=merge -p '{"spec":{"forProvider":{"nke":{"staticEgress":{"enabled":true}}}}}'

Erstellung einer Static Egress-Ressource

Nachdem die Laufzeitumgebung aktiviert wurde, kann eine entsprechende "Static Egress"-Ressource erstellt werden. Dies führt zur automatischen Erstellung einer statischen Egress-IP und eines entsprechenden Pod-Labels. Du kannst dieses Label dann allen Pods hinzufügen, welche die statische Egress-IP nutzen sollen.

  1. Stelle sicher, dass du kubectl und nctl installiert hast.

  2. Starte die Authentifizierung gegenüber der API mit nctl:

    nctl auth login
  3. Erstelle eine Liste aller deiner Kubernetes Cluster.

    nctl get clusters -A
  4. Erstelle eine Datei static-egress.yaml mit dem folgenden Inhalt und ersetze dabei die Platzhalter mit deinen entsprechenden Werten.

    apiVersion: networking.nine.ch/v1alpha1
    kind: StaticEgress
    metadata:
    name: my-static-egress
    namespace: <PROJEKT DES CLUSTERS>
    spec:
    forProvider:
    disabled: false
    target:
    group: infrastructure.nine.ch
    kind: KubernetesCluster
    name: <NAME DES CLUSTERS>
  5. Nutze nctl um die Datei gegenüber der API anzuwenden.

    nctl apply -f static-egress.yaml
  6. Nach kurzer Zeit wird der Ressource eine IP-Adresse und ein Pod Label zugewiesen.

    $> kubectl --context nineapis.ch get staticegress my-static-egress -n <NAME DES PROJEKTS> -o yaml
    ...
    status:
    atProvider:
    address: <AUTOMATISCH ZUGEWIESENE IP ADDRESSE>
    selectionLabel:
    name: networking.nine.ch/static-egress
    value: <WERT DES POD LABELS>

Zuweisung des Static Egress Labels zu Pods

Nehmen wir an, die angelegte Konfiguration des "Static Egress"-Features hat das Label networking.nine.ch/static-egress: production-egress für die Auswahl der zu selektierenden Pods definiert. Wenn du beispielsweise ein Kubernetes Deployment namens "production" hast, das deine Produktionsanwendung bereitstellt, kannst du das selektierte Label allen Pods dieses Deployments hinzufügen, indem du:

  1. Eine Datei label-patch.yaml mit folgendem Inhalt erstellst:
spec:
template:
metadata:
labels:
networking.nine.ch/static-egress: production-egress
  1. Dein Kubernetes-Deployment "production" patchst:
kubectl patch deploy production --patch-file=label-patch.yaml

Dies wird neue Pods für das Deployment ausrollen. Diese werden das spezielle "Static Egress"-Label angehängt haben und der gesamte ausgehende Traffic dieser Pods wird nun die statische Egress-IP nutzen.

Wenn du das Label wieder entfernst, werden die Pods, statt der statischen Egress-IP, wieder die Standard Node-IPs verwenden.

vCluster

Die Verwendung des "Static Egress"-Features auf virtuellen Clustern ist der von NKE Clustern sehr ähnlich. Der einzige Unterschied besteht darin, dass du die Laufzeitumgebung nicht extra aktivieren musst (dies wird automatisch erledigt). Du kannst einfach eine oder mehrere Static Egress-Ressourcen erstellen erstellen und das ausgewählte Kubernetes-Label an deine Pods anhängen, wie im Beispiel beschrieben.

Prometheus

Beim Sammeln von Metriken eines externen Ziels mit Prometheus, kann es nützlich sein wenn die Anfragen von einer statischen IP-Adresse kommen. Zuerst muss die Static Egress-Laufzeitumgebung aktiviert werden. Danach kann der Static Egress mit der entsprechenden Prometheus-Instanz als Ziel erstellt werden.

apiVersion: networking.nine.ch/v1alpha1
kind: StaticEgress
metadata:
name: my-static-egress
namespace: <PROJEKT DER PROMETHEUS INSTANZ>
spec:
forProvider:
disabled: false
target:
group: observability.nine.ch
kind: Prometheus
name: <NAME DER PROMETHEUS INSTANZ>

Deploio-Applikationen

Die Konfiguration der "Static Egress"-Funktionalität für Deploio-Applikationen ist sehr einfach. Erstelle einfach eine entsprechende Static Egress- Ressource für deine Applikation. Nach der Erstellung wird deine Deploio-Anwendung automatisch die statische Egress-IP für ausgehende Kommunikation verwenden.

Erstellen einer Static Egress-Ressource für eine Deploio-Applikation

  1. Stelle sicher, dass du kubectl und nctl installiert hast.

  2. Starte die Authentifizierung gegenüber der API mit nctl:

    nctl auth login
  3. Erstelle eine Liste aller deiner Deploio-Applikationen.

    nctl get apps -A
  4. Erstelle eine Datei deploio-static-egress.yaml mit dem folgenden Inhalt und ersetze dabei die Platzhalter mit deinen entsprechenden Werten.

    apiVersion: networking.nine.ch/v1alpha1
    kind: StaticEgress
    metadata:
    name: my-deploio-static-egress
    namespace: <PROJEKT DER APPLIKATION>
    spec:
    forProvider:
    disabled: false
    target:
    group: apps.nine.ch
    kind: Application
    name: <NAME DER APPLIKATION>
  5. Nutze nctl um die Datei gegenüber der API anzuwenden.

    nctl apply -f deploio-static-egress.yaml
  6. Nach kurzer Zeit wird der Ressource eine IP-Adresse zugewiesen. Die Deploio- Applikation wird automatisch diese IP-Adresse für ausgehenden Datenverkehr verwenden (es wird keine weitere Konfiguration benötigt).

    $> kubectl --context nineapis.ch get staticegress my-deploio-static-egress -n <NAME DES PROJEKTS> -o yaml
    ...
    status:
    atProvider:
    address: <AUTOMATISCH ZUGEWIESENE IP ADRESSE>

Temporäres Deaktivieren einer Static Egress-Ressource

Du kannst eine Static Egress-Ressource temporär deaktivieren. Im Gegensatz zum Löschen einer Static Egress-Resource wird dadurch die automatisch selektierte Egress-IP-Adresse nicht gelöscht und kann nach erneuter Aktivierung des Static Egress wieder verwendet werden.

  1. Stelle sicher, dass du kubectl und nctl installiert hast.

  2. Starte die Authentifizierung gegenüber der API mit nctl:

    nctl auth login
  3. Erstelle eine Liste aller deiner Static Egress-Ressourcen, um diejenige auszuwählen, welche du deaktivieren willst.

    nctl get staticegress
  4. Deaktiviere die Static Egress-Ressource mittels kubectl.

    kubectl --context=nineapis.ch patch staticegress <NAME DER RESOURCE> -n <PROJEKT DER RESOURCE> \
    --type=merge -p '{"spec":{"forProvider":{"disabled":true}}}'

Löschen einer Static Egress-Ressource

Wenn du das Static Egress-Feature wieder entfernen willst, so kannst du einfach die entsprechende Static Egress-Ressource von der API löschen.

  1. Stelle sicher, dass du kubectl und nctl installiert hast.

  2. Starte die Authentifizierung gegenüber der API mit nctl:

    nctl auth login
  3. Erstelle eine Liste aller deiner Static Egress-Ressourcen um diejenige auszuwählen, welche du löschen willst.

    nctl get staticegress
  4. Lösche die Ressource mit kubectl.

    kubectl --context nineapis.ch delete staticegress <NAME DER RESSOURCE> -n <PROJEKT DER RESSOURCE>