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=hello
aus 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 --expose
Konfigurieren Sie eine
NetworkPolicy
, um Traffic zum Podhello-web
nur von den Pod-Objektenapp=foo
zuzulassen. 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=hello
ausgewählt und eine Ingress-Richtlinie angegeben, die nur Traffic von Pod-Objekten mit dem Labelapp=foo
zulä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=foo
aus. 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:8080
Wenn Traffic vom Pod
app=foo
zu den Pod-Objektenapp=hello
aktiviert ist, sieht die Ausgabe so aus:Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z
Fü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:8080
Die 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-2
bereit 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 --expose
Führen Sie einen temporären Pod mit dem Label
app=foo
aus und prüfen Sie, ob der Pod Verbindungen zuhello-web:8080
herstellen kann:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080
Der Pod antwortet auf die Anfrage:
Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z
Bestätigen Sie, dass der Pod keine Verbindungen zu
hello-web-2:8080
herstellen kann:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web-2:8080
Die Ausgabe bestätigt, dass die Verbindung keine Antwort empfängt:
wget: download timed out
Bestätigen Sie, dass der Pod keine Verbindungen zu externen Websites wie
www.example.com
herstellen kann.kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://www.example.com
Die 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.