Auf dieser Seite wird gezeigt, wie Sie mithilfe von Netzwerkrichtlinien für Cluster steuern, ob ein Pod eingehenden (bzw. Ingress-) Netzwerktraffic empfangen kann und ob er ausgehenden (bzw. Egress-) Traffic senden kann.
Mit Netzwerkrichtlinien können Sie Verbindungen zwischen Pod-Objekten beschränken, um die Anfälligkeit für Angriffe zu reduzieren.
Netzwerkrichtlinien dienen als Firewall auf Ebene 3 oder Ebene 4 des OSI-Modells. Sie bieten keine zusätzlichen Funktionen wie Autorisierung oder Verschlüsselung.
Eingehenden Traffic zu Pod-Objekten beschränken
Mit einem NetworkPolicy-Objekt können Sie Netzwerkzugriffsrichtlinien für einen Pod konfigurieren. NetworkPolicy-Objekte enthalten die folgenden Informationen:
Pod-Objekte, für die die Richtlinie gilt. Pod-Objekte und -Arbeitslasten werden mit Labels und Selektoren definiert.
Die Art des Internettraffics, auf den sich die Netzwerkrichtlinien auswirken: Ingress für eingehenden Traffic, Egress für ausgehenden Traffic oder beides.
Bei Ingress-Richtlinien die Pod-Objekte, die eine Verbindung zu den angegebenen Pod-Objekten herstellen können.
Bei Egress-Richtlinien die Pod-Objekte, zu denen die angegebenen Pod-Objekte eine Verbindung herstellen können
Beispiel für eine Beschränkung des eingehenden Traffics
In diesem Abschnitt wird das Erstellen einer Beschränkung für eingehenden Traffic für eine Beispielanwendung gezeigt. Ändern Sie dieses Beispiel entsprechend Ihrer eigenen Anwendungsumgebung.
Führen Sie eine Webserveranwendung mit dem Label
app=helloaus und geben Sie sie intern im Cluster frei:kubectl run hello-web --labels app=hello \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 \ --port 8080 --exposeKonfigurieren Sie eine
NetworkPolicy, um Traffic zum Podhello-webnur von den Pod-Objektenapp=foozuzulassen. GKE on AWS blockiert eingehenden Traffic von Pod-Objekten, die dieses Label nicht haben, sowie externen Traffic und Traffic von Pod-Objekten in einem anderen Namespace.Mit dem folgenden Manifest werden Pod-Objekte mit dem Label
app=helloausgewählt und eine Ingress-Richtlinie angegeben, die nur Traffic von Pod-Objekten mit dem Labelapp=foozulässt:Wenden Sie diese Richtlinie auf den Cluster an:
kubectl apply -f hello-allow-from-foo.yaml
Ingress-Richtlinie prüfen
Führen Sie einen temporären Pod mit dem Label
app=fooaus. Senden Sie eine Anfrage an den Endpunkthello-web:8080, um zu prüfen, ob der eingehende Traffic zulässig ist:kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080Wenn Traffic vom Pod
app=foozu den Pod-Objektenapp=helloaktiviert ist, sieht die Ausgabe so aus:Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6zFühren Sie einen temporären Pod mit einem anderen Label (
app=other) aus und stellen Sie dieselbe Anfrage, um zu bestätigen, dass der Traffic nicht zulässig ist:kubectl run -l app=other --image=alpine --restart=Never --rm -i -t other-app \ -- wget -qO- --timeout=2 http://hello-web:8080Die Ausgabe bestätigt, dass die Verbindung keine Antwort empfängt:
wget: download timed out
Ausgehenden Traffic von Pod-Objekten einschränken
Sie können den ausgehenden Traffic genau wie den eingehenden Traffic beschränken.
Zum Abfragen interner Hostnamen wie hello-web oder externer Hostnamen wie www.example.com müssen Sie jedoch eine Egress-Richtlinie erstellen, die DNS-Traffic an Port 53 mit TCP- und UDP-Protokollen zulässt.
Stellen Sie für Egress-Netzwerkrichtlinien eine NetworkPolicy bereit, die den ausgehenden Traffic von Pod-Objekten mit dem Label app=foo steuert und gleichzeitig Traffic nur an Pod-Objekte mit dem Label app=hello sowie den DNS-Traffic erlaubt.
Das folgende Manifest gibt eine NetworkPolicy an, die den ausgehenden Traffic von Pod-Objekten mit dem Label app=foo mit zwei zulässigen Zielen steuert:
- Pod-Objekte im selben Namespace mit dem Label
app=hello - Interne oder externe Endpunkte an Port 53 (UDP und TCP)
Wenden Sie diese Richtlinie auf den Cluster an:
kubectl apply -f foo-allow-to-hello.yaml
Egress-Richtlinie validieren
Stellen Sie eine neue Webanwendung namens
hello-web-2bereit und geben Sie sie intern im Cluster frei:kubectl run hello-web-2 --labels app=hello-2 \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --exposeFühren Sie einen temporären Pod mit dem Label
app=fooaus und prüfen Sie, ob der Pod Verbindungen zuhello-web:8080herstellen kann:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080Der Pod antwortet auf die Anfrage:
Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6zBestätigen Sie, dass der Pod keine Verbindungen zu
hello-web-2:8080herstellen kann:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web-2:8080Die Ausgabe bestätigt, dass die Verbindung keine Antwort empfängt:
wget: download timed outBestätigen Sie, dass der Pod keine Verbindungen zu externen Websites wie
www.example.comherstellen kann.kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://www.example.comDie Ausgabe bestätigt, dass die Verbindung keine Antwort empfängt:
wget: download timed out
Bereinigen
Führen Sie die folgenden Befehle aus, um die in dieser Anleitung erstellten Ressourcen zu entfernen:
kubectl delete pods --labels app=hello-2
kubectl delete pods --labels app=hello
kubectl delete -f foo-allow-to-hello.yaml
kubectl delete -f hello-allow-from-foo.yaml
Nächste Schritte
- Kubernetes-Dokumentation zu Netzwerkrichtlinien
- Verwenden Sie das Logging von Netzwerkrichtlinien, um aufzuzeichnen, wann Verbindungen zu Pod-Objekten von den Netzwerkrichtlinien Ihres Clusters zugelassen oder verweigert werden.