Clusterweite Kommunikation mithilfe von Netzwerkrichtlinien steuern


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

  1. 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.
  2. 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
    
  3. 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.

  1. 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
    
  2. 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:

  1. 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
    
  2. 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.

  1. 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
    
  2. 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.

Nächste Schritte