Auf dieser Seite wird erläutert, wie Sie clusterweite Netzwerkrichtlinien für Google Kubernetes Engine (GKE) konfigurieren.
Netzwerkrichtlinien und FQDN-Netzwerkrichtlinien unterstützen Sie dabei, Regeln für den Kommunikationstraffic zwischen Pods zu definieren. Netzwerkrichtlinien steuern, wie Pods innerhalb ihrer Anwendungen und mit externen Endpunkten miteinander kommunizieren.
Als Clusteradministrator können Sie clusterweite Cilium-Netzwerkrichtlinien (CCNP) konfigurieren, um die Einschränkungen der Netzwerkrichtlinien für die Verwaltung von clusterweiten administrativem Traffic zu umgehen. Clusterweite Cilium-Netzwerkrichtlinien erzwingen strenge Netzwerkregeln für alle Arbeitslasten im gesamten Cluster und in allen Namespaces und überschreiben alle anwendungsspezifischen Regeln.
Die clusterweite Cilium-Netzwerkrichtlinie für GKE ist eine clusterbezogene CustomResourceDefinition (CRD), die von GKE erzwungene Richtlinien angibt. Wenn Sie die clusterweite Cilium-Netzwerkrichtlinie in GKE aktivieren, können Sie Netzwerkregeln für Ihren gesamten Cluster zentral verwalten. Sie können den grundlegenden Zugriff der Ebenen 3 (IP-Ebene) und 4 (Port-Ebene) für Traffic steuern, der in den Cluster eintritt und diesen verlässt.
Vorteile
Mit der clusterweiten Cilium-Netzwerkrichtlinie können Sie:
- Zentralisierte Sicherheit erzwingen: Mit CCNP können Sie Netzwerkzugriffsregeln definieren, die für Ihr gesamtes Netzwerk gelten. Diese CCNP-Regeln dienen als übergeordnete Sicherheitsebene und überschreiben alle potenziell in Konflikt stehenden Richtlinien auf Namespace-Ebene.
- Mehrmandantenfähigkeit schützen: Wenn Ihr Cluster mehrere Teams oder Mandanten hostet, können Sie die Isolation innerhalb eines freigegebenen Clusters sichern, indem Sie CCNP-Regeln implementieren, die auf der Steuerung des Netzwerkverkehrs ausgerichtet sind. Sie können die Trennung auf Netzwerkebene erzwingen, indem Sie bestimmten Teams Namespaces oder Namespace-Gruppen zuweisen.
- Flexible Standardrichtlinien definieren: Mit CCNP können Sie Standard-Netzwerkregeln für den gesamten Cluster definieren. Sie können diese Regeln bei Bedarf anpassen, ohne die allgemeine Clustersicherheit zu beeinträchtigen.
Aktivieren Sie GKE Dataplane V2 in Ihrem Cluster, um CCNP zu implementieren. Sorgen Sie dafür, dass die CCNP-CRD aktiviert ist, und erstellen Sie dann Richtlinien, die Netzwerkzugriffsregeln für Ihren Cluster definieren.
Hinweise
Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:
- Aktivieren Sie die Google Kubernetes Engine API. Google Kubernetes Engine API aktivieren
- Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit
gcloud components update
ab.
Voraussetzungen
Clusterweite Cilium-Netzwerkrichtlinien haben folgende Anforderungen:
- Google Cloud CLI-Version 465.0.0 oder höher.
- Sie benötigen einen GKE-Cluster, auf dem eine der folgenden Versionen ausgeführt wird:
- 1.28.6-gke.1095000 oder höher
- 1.29.1-gke.1016000 oder höher
- Ihr Cluster muss GKE Dataplane V2 verwenden.
- Sie müssen die clusterweite Cilium-Netzwerkrichtlinie-CRD aktivieren.
Beschränkungen
Für clusterweite Cilium-Netzwerkrichtlinien gelten die folgenden Einschränkungen:
- Layer 7-Richtlinien werden nicht unterstützt.
- Knotenselektoren werden nicht unterstützt.
- Die maximale Anzahl von
CiliumClusterwideNetworkPolicy
pro Cluster beträgt 1.000.
Clusterweite Cilium-Netzwerkrichtlinie in einem neuen Cluster aktivieren
Sie können clusterweite Cilium-Netzwerkrichtlinien in einem neuen Cluster mithilfe der Google Cloud CLI oder der Google Kubernetes Engine API aktivieren.
gcloud
Erstellen Sie einen neuen Cluster mit dem Flag --enable-cilium-clusterwide-network-policy
, um die clusterweite Cilium-Netzwerkrichtlinie in einem neuen Cluster zu aktivieren.
Autopilot
gcloud container clusters create-auto CLUSTER_NAME \
--location COMPUTE_LOCATION \
--enable-cilium-clusterwide-network-policy
Ersetzen Sie Folgendes:
CLUSTER_NAME
durch den Namen Ihres Clusters.COMPUTE_LOCATION
durch den Standort Ihres Clusters.
Standard
gcloud container clusters create CLUSTER_NAME \
--location COMPUTE_LOCATION \
--enable-cilium-clusterwide-network-policy \
--enable-dataplane-v2
Ersetzen Sie Folgendes:
CLUSTER_NAME
durch den Namen Ihres Clusters.COMPUTE_LOCATION
durch den Standort Ihres Clusters.
API
Um die clusterweite Cilium-Netzwerkrichtlinie zu aktivieren, müssen Sie beim Erstellen eines neuen Clusters die folgenden Optionen angeben:
datapathProvider
Feld im networkConfig
-Objekt.
{
"cluster": {
...
"networkConfig": {
"datapathProvider": "ADVANCED_DATAPATH",
"enableCiliumClusterwideNetworkPolicy": true
}
}
}
Prüfen Sie, ob ciliumclusterwidenetworkpolicies.cilium.io
in der Ausgabe des folgenden Befehls vorhanden ist:
kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io
Die Ausgabe sollte in etwa so aussehen:
ciliumclusterwidenetworkpolicies.cilium.io 2023-09-19T16:54:48Z
Clusterweite Cilium-Netzwerkrichtlinie in einem vorhandenen Cluster aktivieren
Sie können clusterweite Cilium-Netzwerkrichtlinien in einem vorhandenen Cluster mithilfe der Google Cloud CLI oder der Google Kubernetes Engine API aktivieren.
gcloud
Prüfen Sie, ob im Cluster GKE Dataplane V2 aktiviert ist.
gcloud container clusters describe CLUSTER_NAME \ --location COMPUTE_LOCATION \ --format="value(networkConfig.datapathProvider)" \
Ersetzen Sie Folgendes:
CLUSTER_NAME
durch den Namen Ihres Clusters.COMPUTE_LOCATION
durch den Standort Ihres Clusters.
Aktualisieren Sie den Cluster mit dem Flag
--enable-cilium-clusterwide-network-policy
.gcloud container clusters update CLUSTER_NAME \ --location COMPUTE_LOCATION \ --enable-cilium-clusterwide-network-policy
Starten Sie das anetd-DaemonSet neu.
kubectl rollout restart ds -n kube-system anetd && \ kubectl rollout status ds -n kube-system anetd
API
Prüfen Sie, ob der Cluster für GKE Dataplane V2 aktiviert ist:
{
"update": {
"desiredEnableCiliumClusterwideNetworkPolicy": true
},
"name": "cluster"
}
To update an existing cluster, run the following update cluster command:
{
"update": {
"desiredEnableCiliumClusterwideNetworkPolicy": true
}
"name": "cluster"
}
Prüfen Sie, ob ciliumclusterwidenetworkpolicies.cilium.io
in der Ausgabe des folgenden Befehls vorhanden ist:
kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io
Die Ausgabe sollte in etwa so aussehen:
ciliumclusterwidenetworkpolicies.cilium.io 2023-09-19T16:54:48Z
Clusterweite Cilium-Netzwerkrichtlinie verwenden
In diesem Abschnitt werden Beispiele zum Konfigurieren der clusterweiten Cilium-Netzwerkrichtlinie aufgeführt.
Beispiel 1: Eingehenden Traffic zu einer Arbeitslast steuern
Im folgenden Beispiel können alle Endpunkte mit dem Label role=backend
eingehende Verbindungen an Port 80 von Endpunkten mit dem Label role=frontend
akzeptieren. Endpunkte mit dem Label role=backend
lehnen alle eingehenden Verbindungen ab, die von dieser Richtlinie nicht zugelassen werden.
Speichern Sie das folgende Manifest als
l4-rule-ingress.yaml
:apiVersion: "cilium.io/v2" kind: CiliumClusterwideNetworkPolicy metadata: name: "l4-rule-ingress" spec: endpointSelector: matchLabels: role: backend ingress: - fromEndpoints: - matchLabels: role: frontend toPorts: - ports: - port: "80" protocol: TCP
Wenden Sie das Manifest an:
kubectl apply -f l4-rule-ingress.yaml
Beispiel 2: Ausgehenden Traffic von einer Arbeitslast an einem bestimmten Port einschränken
Die folgende Regel begrenzt alle Endpunkte mit dem Label app=myService
so, dass sie Pakete nur über TCP an Port 80 an ein beliebiges Layer 3-Ziel ausgeben können:
Speichern Sie das folgende Manifest als
l4-rule-egress.yaml
:apiVersion: "cilium.io/v2" kind: CiliumClusterwideNetworkPolicy metadata: name: "l4-rule-egress" spec: endpointSelector: matchLabels: app: myService egress: - toPorts: - ports: - port: "80" protocol: TCP
Wenden Sie das Manifest an:
kubectl apply -f l4-rule-egress.yaml
Beispiel 3: Ausgehenden Traffic von einer Arbeitslast auf einen bestimmten Port und CIDR-Bereich einschränken
Im folgenden Beispiel werden alle Endpunkte mit dem Label role=crawler
so beschränkt, dass Pakete nur an Port 80, Protokolle TCP, an ein Ziel-CIDR 192.10.2.0/24
gesendet werden können.
Speichern Sie das folgende Manifest als
cidr-l4-rule.yaml
:apiVersion: "cilium.io/v2" kind: CiliumClusterwideNetworkPolicy metadata: name: "cidr-l4-rule" spec: endpointSelector: matchLabels: role: crawler egress: - toCIDR: - 192.0.2.0/24 toPorts: - ports: - port: "80" protocol: TCP
Wenden Sie das Manifest an:
kubectl apply -f cidr-l4-rule.yaml
Netzwerkverkehr überwachen und Fehler beheben
Sie können den von clusterweiten Cilium-Netzwerkrichtlinien betroffenen Netzwerktraffic durch Netzwerkrichtlinien-Logging und Beobachtbarkeit von GKE Dataplane V2 überwachen und eine Fehlerbehebung durchführen.
Versuchen, Layer-7-Richtlinien oder Knotenselektoren zu verwenden
Symptom
Wenn Sie GKE mit GKE Dataplane V2 verwenden und versuchen, CCNP-Richtlinien zu definieren, die Layer 7-Regeln (z. B. HTTP-Filterung) und Knotenselektoren enthalten, erhalten Sie möglicherweise eine Fehlermeldung ähnlich der Folgenden:
Fehler
Error from server (GKE Warden constraints violations): error when creating
"ccnp.yaml": admission webhook
"warden-validating.common-webhooks.networking.gke.io" denied the request: GKE
Warden rejected the request because it violates one or more constraints.
Violations details: {"[denied by gke-cilium-network-policy-limitation]":["L7
rules are not allowed in CiliumClusterwideNetworkPolicy"]} Requested by user:
'user@example.com', groups: 'system:authenticated'.
Mögliche Ursache
GKE hat bestimmte Einschränkungen für CCNPs. Layer 7-Richtlinien, die das Filtern basierend auf Daten auf Anwendungsebene (z. B. HTTP-Header) ermöglichen, und Knotenselektoren werden von der Cilium-Integration von GKE nicht unterstützt.
Lösung
Wenn Sie erweiterte Filterfunktionen für Layer 7 in Ihrem GKE-Cluster benötigen, können Sie Cloud Service Mesh verwenden. Dies ermöglicht eine detailliertere Trafficsteuerung auf Anwendungsebene.
Clusterweite Cilium-Netzwerkrichtlinie nicht aktiviert
Symptom
Wenn Sie versuchen, Cilium clusterweite Netzwerkrichtlinien (CCNP) in einem Cluster zu konfigurieren, in dem die Funktion nicht explizit aktiviert wurde, können Sie sie nicht konfigurieren und erhalten möglicherweise eine Fehlermeldung wie die folgende:
Fehler
error: resource mapping not found for name: "l4-rule" namespace: "" from
"ccnp.yaml": no matches for kind "CiliumClusterwideNetworkPolicy" in version
"cilium.io/v2" ensure CRDs are installed first
Mögliche Ursache
Clusterweite Cilium-Netzwerkrichtlinien basieren auf einer benutzerdefinierten Ressourcendefinition (CRD). Die Fehlermeldung gibt an, dass die CRD im Cluster fehlt.
Lösung
Aktivieren Sie die clusterweite Cilium-Netzwerkrichtlinien-CRD, bevor Sie CCNPs verwenden.