GKE NFO-Multi-Netzwerke bereitstellen und validieren Hochleistungsschnittstelle

1. Einführung

GCP unterstützt seit Langem mehrere Schnittstellen auf VM-Instanzebene. Mit mehreren Schnittstellen kann eine VM bis zu sieben neue Schnittstellen (Standard + 7 Schnittstellen) mit verschiedenen VPCs verbinden. GKE-Netzwerke erweitern dieses Verhalten jetzt auf die Pods, die auf den Knoten ausgeführt werden. Vor der Einführung dieses Features durften alle NodePools in GKE-Clustern nur eine Schnittstelle haben und konnten daher nur einer einzelnen VPC zugeordnet werden. Mit dem Feature „Multi-Netzwerke auf Pods“ können Nutzer jetzt mehr als eine Schnittstelle für Knoten und Pods in einem GKE-Cluster aktivieren.

Umfang

In dieser Anleitung erstellen Sie eine umfassende GKE-Umgebung mit mehreren NICs, die die in Abbildung 1 dargestellten Anwendungsfälle veranschaulicht.

  1. Erstellen Sie „netdevice-l3-pod“ mit Busybox, um Folgendes zu tun:
  2. PING- und wget -S-Befehle für die Instanz „netdevice-apache“ im Netzwerk „netdevice-vpc“ über „eth2“ ausführen
  3. PING- und wget -S-Befehle für die l3-apache-Instanz in der l3-VPC über eth1 ausführen
  4. Erstellen Sie einen L3-Pod, der Busybox verwendet, um einen PING- und wget -S-Befehl an die L3-Apache-Instanz über eth1 zu senden.

In beiden Anwendungsfällen ist die eth0-Schnittstelle des Pods mit dem Standardnetzwerk verbunden.

Abbildung 1

9d93019ee608587f.png

Lerninhalte

  • Subnetz vom Typ L3 erstellen
  • Subnetz vom Typ „netdevice“ erstellen
  • GKE-Knotenpool mit mehreren NICs einrichten
  • Pod mit Netdevice- und L3-Funktionen erstellen
  • Pod mit L3-Funktionen erstellen
  • GKE-Objektnetzwerk erstellen und validieren
  • Verbindung zu Remote-Apache-Servern mit PING, wget und Firewall-Logs validieren

Voraussetzungen

  • Google Cloud-Projekt

2. Terminologie und Konzepte

Primäre VPC: Die primäre VPC ist eine vorkonfigurierte VPC, die mit einer Reihe von Standardeinstellungen und -ressourcen ausgestattet ist. Der GKE-Cluster wird in dieser VPC erstellt.

Subnetz: In Google Cloud ist ein Subnetz die Möglichkeit, ein CIDR-Routing (Classless Inter-Domain Routing) mit Netzmasken in einer VPC zu erstellen. Ein Subnetz hat einen einzelnen primären IP-Adressbereich, der den Knoten zugewiesen ist und mehrere sekundäre Bereiche haben kann, die zu Pods und Diensten gehören können.

Knotennetzwerk: Das Knotennetzwerk bezieht sich auf eine dedizierte Kombination aus VPC- und Subnetzpaar. Innerhalb dieses Knotennetzwerks werden den Knoten, die zum Knotenpool gehören, IP-Adressen aus dem primären IP-Adressbereich zugewiesen.

Sekundärer Bereich: Ein sekundärer Google Cloud-Bereich ist ein CIDR und eine Netzmaske, die zu einer Region in einer VPC gehören. GKE verwendet dies als Layer 3-Pod-Netzwerk. Eine VPC kann mehrere sekundäre Bereiche haben und ein Pod kann eine Verbindung zu mehreren Pod-Netzwerken herstellen.

Netzwerk (L3 oder Gerät): Ein Netzwerkobjekt, das als Verbindungspunkt für Pods dient. Im Tutorial sind die Netzwerke „l3-network“ und „netdevice-network“. Das Gerät kann entweder „netdevice“ oder „dpdk“ sein. Das Standardnetzwerk ist obligatorisch und wird bei der Clustererstellung auf Grundlage des Subnetzes des Standardknotenpools erstellt.

Layer 3-Netzwerke entsprechen einem sekundären Bereich in einem Subnetz und werden so dargestellt:

VPC -> Subnetzname -> Name des sekundären Bereichs

Ein Gerätenetzwerk entspricht einem Subnetz in einer VPC und wird so dargestellt:

VPC -> Subnetzname

Standard-Pod-Netzwerk: Google Cloud erstellt während der Clustererstellung ein Standard-Pod-Netzwerk. Das Standard-Pod-Netzwerk verwendet die primäre VPC als Knotennetzwerk. Das Standard-Pod-Netzwerk ist standardmäßig auf allen Clusterknoten und Pods verfügbar.

Pods mit mehreren Schnittstellen: Pods mit mehreren Schnittstellen in GKE können keine Verbindung zum selben Pod-Netzwerk herstellen, da jede Schnittstelle des Pods mit einem eindeutigen Netzwerk verbunden sein muss.

Projekt für das Codelab aktualisieren

In diesem Codelab werden $variables verwendet, um die Implementierung der gcloud-Konfiguration in Cloud Shell zu erleichtern.

Führen Sie in Cloud Shell folgende Schritte aus:

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

3. Primäre VPC einrichten

Primäre VPC erstellen

Führen Sie in Cloud Shell folgende Schritte aus:

gcloud compute networks create primary-vpc --project=$projectid --subnet-mode=custom

Knoten und sekundäre Subnetze erstellen

Führen Sie in Cloud Shell folgende Schritte aus:

gcloud compute networks subnets create primary-node-subnet --project=$projectid --range=192.168.0.0/24 --network=primary-vpc --region=us-central1 --enable-private-ip-google-access --secondary-range=sec-range-primay-vpc=10.0.0.0/21

4. GKE-Cluster erstellen

Erstellen Sie den privaten GKE-Cluster und geben Sie die primären VPC-Subnetze an, um den Standardknotenpool mit den erforderlichen Flags „–enable-multi-networking“ und „–enable-dataplane-v2“ zu erstellen, um Knotenpools mit mehreren NICs zu unterstützen.

Erstellen Sie den GKE-Cluster in Cloud Shell:

gcloud container clusters create multinic-gke \
    --zone "us-central1-a" \
    --enable-dataplane-v2 \
    --enable-ip-alias \
    --enable-multi-networking \
    --network "primary-vpc" --subnetwork "primary-node-subnet" \
    --num-nodes=2 \
    --max-pods-per-node=32 \
    --cluster-secondary-range-name=sec-range-primay-vpc \
    --no-enable-master-authorized-networks \
    --release-channel "regular" \
    --enable-private-nodes --master-ipv4-cidr "100.100.10.0/28" \
    --enable-ip-alias

MultiNIC-GKE-Cluster validieren

Authentifizieren Sie sich in Cloud Shell beim Cluster:

gcloud container clusters get-credentials multinic-gke --zone us-central1-a --project $projectid

Prüfen Sie in Cloud Shell, ob zwei Knoten aus dem Standardpool generiert wurden:

kubectl get nodes

Beispiel:

user@$ kubectl get nodes
NAME                                          STATUS   ROLES    AGE    VERSION
gke-multinic-gke-default-pool-3d419e48-1k2p   Ready    <none>   2m4s   v1.27.3-gke.100
gke-multinic-gke-default-pool-3d419e48-xckb   Ready    <none>   2m4s   v1.27.3-gke.100

5. netdevice-vpc einrichten

netdevice-vpc-Netzwerk erstellen

Führen Sie in Cloud Shell folgende Schritte aus:

gcloud compute networks create netdevice-vpc --project=$projectid --subnet-mode=custom

netdevice-vpc-Subnetze erstellen

Erstellen Sie in Cloud Shell das Subnetz, das für das Netzwerk mit mehreren NICs verwendet wird:

gcloud compute networks subnets create netdevice-subnet --project=$projectid --range=192.168.10.0/24 --network=netdevice-vpc --region=us-central1 --enable-private-ip-google-access

Erstellen Sie in Cloud Shell ein Subnetz für die Instanz „netdevice-apache“:

gcloud compute networks subnets create netdevice-apache --project=$projectid --range=172.16.10.0/28 --network=netdevice-vpc --region=us-central1 --enable-private-ip-google-access

Cloud Router- und NAT-Konfiguration

Cloud NAT wird im Tutorial für die Installation von Softwarepaketen verwendet, da die VM-Instanz keine externe IP-Adresse hat.

Erstellen Sie den Cloud Router in Cloud Shell.

gcloud compute routers create netdevice-cr --network netdevice-vpc --region us-central1

Erstellen Sie das NAT-Gateway in Cloud Shell.

gcloud compute routers nats create cloud-nat-netdevice --router=netdevice-cr --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1

Instanz „netdevice-apache“ erstellen

Im folgenden Abschnitt erstellen Sie die netdevice-apache-Instanz.

Erstellen Sie die Instanz in Cloud Shell:

gcloud compute instances create netdevice-apache \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=netdevice-apache \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the netdevice-apache instance !!' | tee /var/www/html/index.html
      EOF"

6. l3-vpc einrichten

l3-vpc-Netzwerk erstellen

Führen Sie in Cloud Shell folgende Schritte aus:

gcloud compute networks create l3-vpc --project=$projectid --subnet-mode=custom

L3-VPC-Subnetze erstellen

Erstellen Sie in Cloud Shell ein Subnetz mit primärem und sekundärem Bereich. Der sekundäre Bereich(sec-range-l3-subnet) wird für das L3-Netzwerk mit mehreren NICs verwendet:

gcloud compute networks subnets create l3-subnet --project=$projectid --range=192.168.20.0/24 --network=l3-vpc --region=us-central1 --enable-private-ip-google-access --secondary-range=sec-range-l3-subnet=10.0.8.0/21

Erstellen Sie in Cloud Shell ein Subnetz für die l3-apache-Instanz:

gcloud compute networks subnets create l3-apache --project=$projectid --range=172.16.20.0/28 --network=l3-vpc --region=us-central1 --enable-private-ip-google-access

Cloud Router- und NAT-Konfiguration

Cloud NAT wird im Tutorial für die Installation von Softwarepaketen verwendet, da die VM-Instanz keine externe IP-Adresse hat.

Erstellen Sie den Cloud Router in Cloud Shell.

gcloud compute routers create l3-cr --network l3-vpc --region us-central1

Erstellen Sie das NAT-Gateway in Cloud Shell.

gcloud compute routers nats create cloud-nat-l3 --router=l3-cr --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1

l3-apache-Instanz erstellen

Im folgenden Abschnitt erstellen Sie die l3-apache-Instanz.

Erstellen Sie die Instanz in Cloud Shell:

gcloud compute instances create l3-apache \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=l3-apache \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the l3-apache instance !!' | tee /var/www/html/index.html
      EOF"

7. Knotenpool mit mehreren NICs erstellen

Im folgenden Abschnitt erstellen Sie einen Knotenpool mit mehreren NICs, der aus den folgenden Flags besteht:

–additional-node-network (erforderlich für Schnittstellen vom Gerätetyp)

Beispiel:

--additional-node-network network=netdevice-vpc,subnetwork=netdevice-subnet

–additional-node-network und –additional-pod-network ( erforderlich für Schnittstellen vom Typ L3)

Beispiel:

--additional-node-network network=l3-vpc,subnetwork=l3-subnet --additional-pod-network subnetwork=l3-subnet,pod-ipv4-range=sec-range-l3-subnet,max-pods-per-node=8

Maschinentyp: Berücksichtigen Sie beim Bereitstellen des Knotenpools die Abhängigkeit des Maschinentyps. Ein Maschinentyp wie „e2-standard-4“ mit 4 vCPUs kann beispielsweise insgesamt bis zu 4 VPCs unterstützen. Das Gerät „netdevice-l3-pod“ hat insgesamt drei Schnittstellen (default, netdevice und l3). Daher wird in der Anleitung der Maschinentyp „e2-standard-4“ verwendet.

Erstellen Sie in Cloud Shell den Knotenpool, der aus einem Typgerät und L3 besteht:

gcloud container --project "$projectid" node-pools create "multinic-node-pool" --cluster "multinic-gke" --zone "us-central1-a" --additional-node-network network=netdevice-vpc,subnetwork=netdevice-subnet --additional-node-network network=l3-vpc,subnetwork=l3-subnet --additional-pod-network subnetwork=l3-subnet,pod-ipv4-range=sec-range-l3-subnet,max-pods-per-node=8 --machine-type "e2-standard-4"

8. Multi-NIC-Knotenpool validieren

Prüfen Sie in Cloud Shell, ob drei Knoten aus dem Knotenpool „multinic-node-pool“ generiert wurden:

kubectl get nodes

Beispiel:

user@$ kubectl get nodes
NAME                                                STATUS   ROLES    AGE     VERSION
gke-multinic-gke-default-pool-3d419e48-1k2p         Ready    <none>   15m     v1.27.3-gke.100
gke-multinic-gke-default-pool-3d419e48-xckb         Ready    <none>   15m     v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-0tfx   Ready    <none>   3m51s   v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-86gz   Ready    <none>   3m51s   v1.27.3-gke.100
gke-multinic-gke-multinic-node-pool-135699a1-t66p   Ready    <none>   3m51s   v1.27.3-gke.100

9. Netzwerk des Netzwerkgeräts erstellen

In den folgenden Schritten generieren Sie ein Kubernetes-Objekt vom Typ „Network“ und „GKENetworkParamSet“, um das „netdevice“-Netzwerk zu erstellen, das in späteren Schritten zum Zuordnen von Pods verwendet wird.

netdevice-network-Objekt erstellen

Erstellen Sie in Cloud Shell das Netzwerkobjekt YAML netdevice-network.yaml mit dem VI-Editor oder Nano. Beachten Sie, dass „Routen zu“ das Subnetz 172.16.10.0/28 (netdevice-apache) in der netdevice-VPC ist.

apiVersion: networking.gke.io/v1
kind: Network
metadata:
    name: netdevice-network
spec:
    type: "Device"
    parametersRef:
      group: networking.gke.io
      kind: GKENetworkParamSet
      name: "netdevice"
    routes:
    - to: "172.16.10.0/28"

Wenden Sie in Cloud Shell „netdevice-network.yaml“ an:

kubectl apply -f netdevice-network.yaml 

Prüfen Sie in Cloud Shell, ob der Status des Netdevice-Netzwerks „Bereit“ ist.

kubectl describe networks netdevice-network

Beispiel:

user@$ kubectl describe networks netdevice-network
Name:         netdevice-network
Namespace:    
Labels:       <none>
Annotations:  networking.gke.io/in-use: false
API Version:  networking.gke.io/v1
Kind:         Network
Metadata:
  Creation Timestamp:  2023-07-30T22:37:38Z
  Generation:          1
  Resource Version:    1578594
  UID:                 46d75374-9fcc-42be-baeb-48e074747052
Spec:
  Parameters Ref:
    Group:  networking.gke.io
    Kind:   GKENetworkParamSet
    Name:   netdevice
  Routes:
    To:  172.16.10.0/28
  Type:  Device
Status:
  Conditions:
    Last Transition Time:  2023-07-30T22:37:38Z
    Message:               GKENetworkParamSet resource was deleted: netdevice
    Reason:                GNPDeleted
    Status:                False
    Type:                  ParamsReady
    Last Transition Time:  2023-07-30T22:37:38Z
    Message:               Resource referenced by params is not ready
    Reason:                ParamsNotReady
    Status:                False
    Type:                  Ready
Events:                    <none>

GKENetworkParamSet erstellen

Erstellen Sie in Cloud Shell das Netzwerkobjekt YAML netdevice-network-parm.yaml mit dem VI-Editor oder Nano. Die Spezifikation entspricht dem Deployment des Subnetzes „netdevice-vpc“.

apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
    name: "netdevice"
spec:
    vpc: "netdevice-vpc"
    vpcSubnet: "netdevice-subnet"
    deviceMode: "NetDevice"

Wenden Sie in Cloud Shell „netdevice-network-parm.yaml“ an.

kubectl apply -f netdevice-network-parm.yaml 

Prüfen Sie in Cloud Shell den Status von „netdevice-network“: „Status Reason GNPParmsReady“ und „NetworkReady“:

kubectl describe networks netdevice-network

Beispiel:

user@$ kubectl describe networks netdevice-network
Name:         netdevice-network
Namespace:    
Labels:       <none>
Annotations:  networking.gke.io/in-use: false
API Version:  networking.gke.io/v1
Kind:         Network
Metadata:
  Creation Timestamp:  2023-07-30T22:37:38Z
  Generation:          1
  Resource Version:    1579791
  UID:                 46d75374-9fcc-42be-baeb-48e074747052
Spec:
  Parameters Ref:
    Group:  networking.gke.io
    Kind:   GKENetworkParamSet
    Name:   netdevice
  Routes:
    To:  172.16.10.0/28
  Type:  Device
Status:
  Conditions:
    Last Transition Time:  2023-07-30T22:39:44Z
    Message:               
    Reason:                GNPParamsReady
    Status:                True
    Type:                  ParamsReady
    Last Transition Time:  2023-07-30T22:39:44Z
    Message:               
    Reason:                NetworkReady
    Status:                True
    Type:                  Ready
Events:                    <none>

Prüfen Sie in Cloud Shell den gkenetworkparamset-CIDR-Block 192.168.10.0/24, der in einem späteren Schritt für die Pod-Schnittstelle verwendet wird.

kubectl describe gkenetworkparamsets.networking.gke.io netdevice

Beispiel:

user@$ kubectl describe gkenetworkparamsets.networking.gke.io netdevice
Name:         netdevice
Namespace:    
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1
Kind:         GKENetworkParamSet
Metadata:
  Creation Timestamp:  2023-07-30T22:39:43Z
  Finalizers:
    networking.gke.io/gnp-controller
    networking.gke.io/high-perf-finalizer
  Generation:        1
  Resource Version:  1579919
  UID:               6fe36b0c-0091-4b6a-9d28-67596cbce845
Spec:
  Device Mode:  NetDevice
  Vpc:          netdevice-vpc
  Vpc Subnet:   netdevice-subnet
Status:
  Conditions:
    Last Transition Time:  2023-07-30T22:39:43Z
    Message:               
    Reason:                GNPReady
    Status:                True
    Type:                  Ready
  Network Name:            netdevice-network
  Pod CID Rs:
    Cidr Blocks:
      192.168.10.0/24
Events:  <none>

10. L3-Netzwerke erstellen

In den folgenden Schritten generieren Sie ein Kubernetes-Objekt vom Typ „Network“ und „GKENetworkParamSet“, um das L3-Netzwerk zu erstellen, das in späteren Schritten zum Zuordnen von Pods verwendet wird.

L3-Netzwerkobjekt erstellen

Erstellen Sie in Cloud Shell das Netzwerkobjekt YAML l3-network.yaml mit dem VI-Editor oder Nano. Beachten Sie, dass „Routen zu“ das Subnetz 172.16.20.0/28 (l3-apache) in der l3-VPC ist.

apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: l3-network
spec:
  type: "L3"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: "l3-network"
  routes:
  - to: "172.16.20.0/28"

Wenden Sie in Cloud Shell „l3-network.yaml“ an:

kubectl apply -f l3-network.yaml 

Prüfen Sie in Cloud Shell, ob der Status des L3-Netzwerks „Ready“ (Bereit) ist.

kubectl describe networks l3-network

Beispiel:

user@$ kubectl describe networks l3-network
Name:         l3-network
Namespace:    
Labels:       <none>
Annotations:  networking.gke.io/in-use: false
API Version:  networking.gke.io/v1
Kind:         Network
Metadata:
  Creation Timestamp:  2023-07-30T22:43:54Z
  Generation:          1
  Resource Version:    1582307
  UID:                 426804be-35c9-4cc5-bd26-00b94be2ef9a
Spec:
  Parameters Ref:
    Group:  networking.gke.io
    Kind:   GKENetworkParamSet
    Name:   l3-network
  Routes:
  to:  172.16.20.0/28
  Type:  L3
Status:
  Conditions:
    Last Transition Time:  2023-07-30T22:43:54Z
    Message:               GKENetworkParamSet resource was deleted: l3-network
    Reason:                GNPDeleted
    Status:                False
    Type:                  ParamsReady
    Last Transition Time:  2023-07-30T22:43:54Z
    Message:               Resource referenced by params is not ready
    Reason:                ParamsNotReady
    Status:                False
    Type:                  Ready
Events:                    <none>

GKENetworkParamSet erstellen

Erstellen Sie in Cloud Shell das Netzwerkobjekt YAML l3-network-parm.yaml mit dem VI-Editor oder Nano. Die Spezifikation entspricht der Bereitstellung des L3-VPC-Subnetzes.

apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: "l3-network"
spec:
  vpc: "l3-vpc"
  vpcSubnet: "l3-subnet"
  podIPv4Ranges:
    rangeNames:
    - "sec-range-l3-subnet"

Wenden Sie in Cloud Shell „l3-network-parm.yaml“ an.

kubectl apply -f l3-network-parm.yaml 

Prüfen Sie in Cloud Shell, ob der Grund für den Status des L3-Netzwerks „GNPParmsReady“ und „NetworkReady“ ist:

kubectl describe networks l3-network

Beispiel:

user@$ kubectl describe networks l3-network
Name:         l3-network
Namespace:    
Labels:       <none>
Annotations:  networking.gke.io/in-use: false
API Version:  networking.gke.io/v1
Kind:         Network
Metadata:
  Creation Timestamp:  2023-07-30T22:43:54Z
  Generation:          1
  Resource Version:    1583647
  UID:                 426804be-35c9-4cc5-bd26-00b94be2ef9a
Spec:
  Parameters Ref:
    Group:  networking.gke.io
    Kind:   GKENetworkParamSet
    Name:   l3-network
  Routes:
    To:  172.16.20.0/28
  Type:  L3
Status:
  Conditions:
    Last Transition Time:  2023-07-30T22:46:14Z
    Message:               
    Reason:                GNPParamsReady
    Status:                True
    Type:                  ParamsReady
    Last Transition Time:  2023-07-30T22:46:14Z
    Message:               
    Reason:                NetworkReady
    Status:                True
    Type:                  Ready
Events:                    <none>

Prüfen Sie in Cloud Shell den für die Erstellung der Pod-Schnittstelle verwendeten gkenetworkparamset-L3-Netzwerk-CIDR 10.0.8.0/21.

kubectl describe gkenetworkparamsets.networking.gke.io l3-network

Beispiel:

user@$ kubectl describe gkenetworkparamsets.networking.gke.io l3-network
Name:         l3-network
Namespace:    
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1
Kind:         GKENetworkParamSet
Metadata:
  Creation Timestamp:  2023-07-30T22:46:14Z
  Finalizers:
    networking.gke.io/gnp-controller
  Generation:        1
  Resource Version:  1583656
  UID:               4c1f521b-0088-4005-b000-626ca5205326
Spec:
  podIPv4Ranges:
    Range Names:
      sec-range-l3-subnet
  Vpc:         l3-vpc
  Vpc Subnet:  l3-subnet
Status:
  Conditions:
    Last Transition Time:  2023-07-30T22:46:14Z
    Message:               
    Reason:                GNPReady
    Status:                True
    Type:                  Ready
  Network Name:            l3-network
  Pod CID Rs:
    Cidr Blocks:
      10.0.8.0/21
Events:  <none>

11. netdevice-l3-pod erstellen

Im folgenden Abschnitt erstellen Sie den netdevice-l3-Pod, auf dem Busybox ausgeführt wird. Busybox ist ein „Schweizer Taschenmesser“, das mehr als 300 gängige Befehle unterstützt. Der Pod ist so konfiguriert, dass er über eth1 mit der L3-VPC und über eth2 mit dem VPC-Netzwerkgerät kommuniziert.

Erstellen Sie in Cloud Shell den Busybox-Container mit dem Namen „netdevice-l3-pod.yaml“ mit dem VI-Editor oder Nano.

apiVersion: v1
kind: Pod
metadata:
  name: netdevice-l3-pod
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
      {"interfaceName":"eth0","network":"default"},
      {"interfaceName":"eth1","network":"l3-network"},
      {"interfaceName":"eth2","network":"netdevice-network"}
      ]
spec:
  containers:
  - name: netdevice-l3-pod
    image: busybox
    command: ["sleep", "10m"]
    ports:
    - containerPort: 80
  restartPolicy: Always

Wenden Sie in Cloud Shell die Datei „netdevice-l3-pod.yaml“ an.

kubectl apply -f netdevice-l3-pod.yaml

Erstellung von „netdevice-l3-pod“ validieren

Prüfen Sie in Cloud Shell, ob „netdevice-l3-pod“ ausgeführt wird:

kubectl get pods netdevice-l3-pod

Beispiel:

user@$ kubectl get pods netdevice-l3-pod 
NAME               READY   STATUS    RESTARTS   AGE
netdevice-l3-pod   1/1     Running   0          74s

Prüfen Sie in Cloud Shell die IP-Adressen, die den Pod-Schnittstellen zugewiesen sind.

kubectl get pods netdevice-l3-pod -o yaml

Im bereitgestellten Beispiel enthält das Feld networking.gke.io/pod-ips die IP-Adressen, die den Pod-Schnittstellen aus dem L3-Netzwerk und dem Netdevice-Netzwerk zugeordnet sind. Die Standard-IP-Adresse des Netzwerks 10.0.1.22 wird unter „podIPs“ aufgeführt:

user@$ kubectl get pods netdevice-l3-pod -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"networking.gke.io/default-interface":"eth0","networking.gke.io/interfaces":"[\n{\"interfaceName\":\"eth0\",\"network\":\"default\"},\n{\"interfaceName\":\"eth1\",\"network\":\"l3-network\"},\n{\"interfaceName\":\"eth2\",\"network\":\"netdevice-network\"}\n]\n"},"name":"netdevice-l3-pod","namespace":"default"},"spec":{"containers":[{"command":["sleep","10m"],"image":"busybox","name":"netdevice-l3-pod","ports":[{"containerPort":80}]}],"restartPolicy":"Always"}}
    networking.gke.io/default-interface: eth0
    networking.gke.io/interfaces: |
      [
      {"interfaceName":"eth0","network":"default"},
      {"interfaceName":"eth1","network":"l3-network"},
      {"interfaceName":"eth2","network":"netdevice-network"}
      ]
    networking.gke.io/pod-ips: '[{"networkName":"l3-network","ip":"10.0.8.4"},{"networkName":"netdevice-network","ip":"192.168.10.2"}]'
  creationTimestamp: "2023-07-30T22:49:27Z"
  name: netdevice-l3-pod
  namespace: default
  resourceVersion: "1585567"
  uid: d9e43c75-e0d1-4f31-91b0-129bc53bbf64
spec:
  containers:
  - command:
    - sleep
    - 10m
    image: busybox
    imagePullPolicy: Always
    name: netdevice-l3-pod
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      limits:
        networking.gke.io.networks/l3-network.IP: "1"
        networking.gke.io.networks/netdevice-network: "1"
        networking.gke.io.networks/netdevice-network.IP: "1"
      requests:
        networking.gke.io.networks/l3-network.IP: "1"
        networking.gke.io.networks/netdevice-network: "1"
        networking.gke.io.networks/netdevice-network.IP: "1"
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-f2wpb
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: gke-multinic-gke-multinic-node-pool-135699a1-86gz
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  - effect: NoSchedule
    key: networking.gke.io.networks/l3-network.IP
    operator: Exists
  - effect: NoSchedule
    key: networking.gke.io.networks/netdevice-network
    operator: Exists
  - effect: NoSchedule
    key: networking.gke.io.networks/netdevice-network.IP
    operator: Exists
  volumes:
  - name: kube-api-access-f2wpb
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2023-07-30T22:49:28Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2023-07-30T22:49:33Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2023-07-30T22:49:33Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2023-07-30T22:49:28Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: containerd://dcd9ead2f69824ccc37c109a47b1f3f5eb7b3e60ce3865e317dd729685b66a5c
    image: docker.io/library/busybox:latest
    imageID: docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79
    lastState: {}
    name: netdevice-l3-pod
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2023-07-30T22:49:32Z"
  hostIP: 192.168.0.4
  phase: Running
  podIP: 10.0.1.22
  podIPs:
  - ip: 10.0.1.22
  qosClass: BestEffort
  startTime: "2023-07-30T22:49:28Z"

Netdevice-L3-Pod-Routen validieren

Prüfen Sie in Cloud Shell die Routen zu netdevice-vpc und l3-vpc von netdevice-l3-pod aus:

kubectl exec --stdin --tty netdevice-l3-pod   -- /bin/sh

Instanz erstellen und Pod-Schnittstellen validieren:

ifconfig

In diesem Beispiel ist „eth0“ mit dem Standardnetzwerk, „eth1“ mit dem „l3-network“ und „eth2“ mit dem „netdevice-network“ verbunden.

/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 26:E3:1B:14:6E:0C  
          inet addr:10.0.1.22  Bcast:10.0.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:446 (446.0 B)  TX bytes:558 (558.0 B)

eth1      Link encap:Ethernet  HWaddr 92:78:4E:CB:F2:D4  
          inet addr:10.0.8.4  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:446 (446.0 B)  TX bytes:516 (516.0 B)

eth2      Link encap:Ethernet  HWaddr 42:01:C0:A8:0A:02  
          inet addr:192.168.10.2  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:73 errors:0 dropped:0 overruns:0 frame:0
          TX packets:50581 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:26169 (25.5 KiB)  TX bytes:2148170 (2.0 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Prüfen Sie vom netdevice-l3-Pod aus die Routen zum netdevice-VPC (172.16.10.0/28) und zum l3-VPC (172.16.20.0/28).

Instanz erstellen und Pod-Routen validieren:

ip route

Beispiel:

/ # ip route
default via 10.0.1.1 dev eth0 #primary-vpc
10.0.1.0/24 via 10.0.1.1 dev eth0  src 10.0.1.22 
10.0.1.1 dev eth0 scope link  src 10.0.1.22 
10.0.8.0/21 via 10.0.8.1 dev eth1 #l3-vpc (sec-range-l3-subnet)
10.0.8.1 dev eth1 scope link 
172.16.10.0/28 via 192.168.10.1 dev eth2 #netdevice-vpc (netdevice-apache subnet)
172.16.20.0/28 via 10.0.8.1 dev eth1 #l3-vpc (l3-apache subnet)
192.168.10.0/24 via 192.168.10.1 dev eth2 #pod interface subnet
192.168.10.1 dev eth2 scope link 

Wenn Sie zur Cloud Shell zurückkehren möchten, beenden Sie den Pod über die Instanz.

exit

12. L3-Pod erstellen

Im folgenden Abschnitt erstellen Sie den L3-Pod, auf dem Busybox ausgeführt wird. Busybox ist ein „Schweizer Taschenmesser“, das mehr als 300 gängige Befehle unterstützt. Der Pod ist so konfiguriert, dass er nur über „eth1“ mit dem L3-VPC kommuniziert.

Erstellen Sie in Cloud Shell den Busybox-Container mit dem Namen „l3-pod.yaml“ mit dem VI-Editor oder Nano.

apiVersion: v1
kind: Pod
metadata:
  name: l3-pod
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
      {"interfaceName":"eth0","network":"default"},
      {"interfaceName":"eth1","network":"l3-network"}
      ]
spec:
  containers:
  - name: l3-pod
    image: busybox
    command: ["sleep", "10m"]
    ports:
    - containerPort: 80
  restartPolicy: Always

Wenden Sie in Cloud Shell die Datei „l3-pod.yaml“ an.

kubectl apply -f l3-pod.yaml

Erstellung des L3-Pods validieren

Prüfen Sie in Cloud Shell, ob „netdevice-l3-pod“ ausgeführt wird:

kubectl get pods l3-pod

Beispiel:

user@$ kubectl get pods l3-pod
NAME     READY   STATUS    RESTARTS   AGE
l3-pod   1/1     Running   0          52s

Prüfen Sie in Cloud Shell die IP-Adressen, die den Pod-Schnittstellen zugewiesen sind.

kubectl get pods l3-pod -o yaml

Im bereitgestellten Beispiel enthält das Feld networking.gke.io/pod-ips die IP-Adressen, die den Pod-Schnittstellen aus dem L3-Netzwerk zugeordnet sind. Die Standard-IP-Adresse des Netzwerks 10.0.2.12 wird unter „podIPs“ aufgeführt:

user@$ kubectl get pods l3-pod -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"networking.gke.io/default-interface":"eth0","networking.gke.io/interfaces":"[\n{\"interfaceName\":\"eth0\",\"network\":\"default\"},\n{\"interfaceName\":\"eth1\",\"network\":\"l3-network\"}\n]\n"},"name":"l3-pod","namespace":"default"},"spec":{"containers":[{"command":["sleep","10m"],"image":"busybox","name":"l3-pod","ports":[{"containerPort":80}]}],"restartPolicy":"Always"}}
    networking.gke.io/default-interface: eth0
    networking.gke.io/interfaces: |
      [
      {"interfaceName":"eth0","network":"default"},
      {"interfaceName":"eth1","network":"l3-network"}
      ]
    networking.gke.io/pod-ips: '[{"networkName":"l3-network","ip":"10.0.8.22"}]'
  creationTimestamp: "2023-07-30T23:22:29Z"
  name: l3-pod
  namespace: default
  resourceVersion: "1604447"
  uid: 79a86afd-2a50-433d-9d48-367acb82c1d0
spec:
  containers:
  - command:
    - sleep
    - 10m
    image: busybox
    imagePullPolicy: Always
    name: l3-pod
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      limits:
        networking.gke.io.networks/l3-network.IP: "1"
      requests:
        networking.gke.io.networks/l3-network.IP: "1"
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-w9d24
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: gke-multinic-gke-multinic-node-pool-135699a1-t66p
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  - effect: NoSchedule
    key: networking.gke.io.networks/l3-network.IP
    operator: Exists
  volumes:
  - name: kube-api-access-w9d24
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2023-07-30T23:22:29Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2023-07-30T23:22:35Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2023-07-30T23:22:35Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2023-07-30T23:22:29Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: containerd://1d5fe2854bba0a0d955c157a58bcfd4e34cecf8837edfd7df2760134f869e966
    image: docker.io/library/busybox:latest
    imageID: docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79
    lastState: {}
    name: l3-pod
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2023-07-30T23:22:35Z"
  hostIP: 192.168.0.5
  phase: Running
  podIP: 10.0.2.12
  podIPs:
  - ip: 10.0.2.12
  qosClass: BestEffort
  startTime: "2023-07-30T23:22:29Z"

L3-Pod-Routen validieren

Prüfen Sie in Cloud Shell die Routen zu l3-vpc von netdevice-l3-pod:

kubectl exec --stdin --tty l3-pod   -- /bin/sh

Instanz erstellen und Pod-Schnittstellen validieren:

ifconfig

Im Beispiel ist eth0 mit dem Standardnetzwerk und eth1 mit dem L3-Netzwerk verbunden.

/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 22:29:30:09:6B:58  
          inet addr:10.0.2.12  Bcast:10.0.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:446 (446.0 B)  TX bytes:558 (558.0 B)

eth1      Link encap:Ethernet  HWaddr 6E:6D:FC:C3:FF:AF  
          inet addr:10.0.8.22  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:446 (446.0 B)  TX bytes:516 (516.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Prüfen Sie vom l3-pod aus die Routen zur l3-vpc (172.16.20.0/28).

Instanz erstellen und Pod-Routen validieren:

ip route

Beispiel:

/ # ip route
default via 10.0.2.1 dev eth0 #primary-vpc
10.0.2.0/24 via 10.0.2.1 dev eth0  src 10.0.2.12 
10.0.2.1 dev eth0 scope link  src 10.0.2.12 
10.0.8.0/21 via 10.0.8.17 dev eth1 #l3-vpc (sec-range-l3-subnet)
10.0.8.17 dev eth1 scope link #pod interface subnet
172.16.20.0/28 via 10.0.8.17 dev eth1 #l3-vpc (l3-apache subnet)

Wenn Sie zur Cloud Shell zurückkehren möchten, beenden Sie den Pod über die Instanz.

exit

13. Firewall-Updates

Damit Verbindungen vom GKE-Multinic-Pool zum netdevice-vpc möglich sind, sind Ingress-Firewallregeln für die l3-vpc erforderlich. Sie erstellen Firewallregeln, in denen der Quellbereich als das Pod-Netzwerk-Subnetz angegeben wird, z.B. „netdevice-subnet“ oder „sec-range-l3-subnet“.

Beispiel: Der neu erstellte Container „l3-pod“, die eth2-Schnittstelle „10.0.8.22“ (aus dem sec-range-l3-Subnetz zugewiesen) ist die Quell-IP-Adresse, wenn eine Verbindung zur l3-apache-Instanz in der l3-VPC hergestellt wird.

netdevice-vpc: Allow from netdevice-subnet to netdevice-apache

Erstellen Sie in Cloud Shell die Firewallregel in der netdevice-vpc, die den Zugriff des netdevice-Subnetzes auf die netdevice-apache-Instanz ermöglicht.

gcloud compute --project=$projectid firewall-rules create allow-ingress-from-netdevice-network-to-all-vpc-instances --direction=INGRESS --priority=1000 --network=netdevice-vpc --action=ALLOW --rules=all --source-ranges=192.168.10.0/24 --enable-logging

l3-vpc: Allow from sec-range-l3-subnet to l3-apache

Erstellen Sie in Cloud Shell die Firewallregel in der L3-VPC, die den Zugriff von „sec-range-l3-subnet“ auf die L3-Apache-Instanz ermöglicht.

gcloud compute --project=$projectid firewall-rules create allow-ingress-from-l3-network-to-all-vpc-instances --direction=INGRESS --priority=1000 --network=l3-vpc --action=ALLOW --rules=all --source-ranges=10.0.8.0/21 --enable-logging

14. Pod-Verbindung validieren

Im folgenden Abschnitt prüfen Sie die Verbindung zu den Apache-Instanzen über den netdevice-l3-Pod und den l3-Pod. Dazu melden Sie sich in den Pods an und führen einen wget-Befehl mit der Option -S aus, um einen Download der Startseite der Apache-Server zu validieren. Da das Gerät „netdevice-l3-pod“ mit Schnittstellen aus den Netzwerken „netdevice-network“ und „l3-network“ konfiguriert ist, ist eine Verbindung zu den Apache-Servern in „netdevice-vpc“ und „l3-vpc“ möglich.

Wenn Sie dagegen „wget -S“ über den L3-Pod ausführen, ist keine Verbindung zum Apache-Server in „netdevice-vpc“ möglich, da der L3-Pod nur mit einer Schnittstelle aus dem L3-Netzwerk konfiguriert ist.

IP-Adresse des Apache-Servers abrufen

Rufen Sie in der Cloud Console die IP-Adresse der Apache-Server ab, indem Sie zu „Compute Engine“ → „VM-Instanzen“ navigieren.

fee492b4fd303859.png

netdevice-l3-pod to netdevice-apache connectivity test (Konnektivitätstest von netdevice-l3-pod zu netdevice-apache)

Melden Sie sich in Cloud Shell im Pod „netdevice-l3“ an:

kubectl exec --stdin --tty netdevice-l3-pod   -- /bin/sh

Pingen Sie vom Container aus die netdevice-apache-Instanz anhand der IP-Adresse, die Sie im vorherigen Schritt erhalten haben.

ping <insert-your-ip> -c 4

Beispiel:

/ #  ping 172.16.10.2 -c 4
PING 172.16.10.2 (172.16.10.2): 56 data bytes
64 bytes from 172.16.10.2: seq=0 ttl=64 time=1.952 ms
64 bytes from 172.16.10.2: seq=1 ttl=64 time=0.471 ms
64 bytes from 172.16.10.2: seq=2 ttl=64 time=0.446 ms
64 bytes from 172.16.10.2: seq=3 ttl=64 time=0.505 ms

--- 172.16.10.2 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.446/0.843/1.952 ms
/ # 

Führen Sie in Cloud Shell ein „wget -S“ für die netdevice-apache-Instanz basierend auf der IP-Adresse aus dem vorherigen Schritt aus. „200 OK“ gibt an, dass die Webseite erfolgreich heruntergeladen wurde.

wget -S <insert-your-ip>

Beispiel:

/ # wget -S 172.16.10.2
Connecting to 172.16.10.2 (172.16.10.2:80)
  HTTP/1.1 200 OK
  Date: Mon, 31 Jul 2023 03:12:58 GMT
  Server: Apache/2.4.56 (Debian)
  Last-Modified: Sat, 29 Jul 2023 00:32:44 GMT
  ETag: "2c-6019555f54266"
  Accept-Ranges: bytes
  Content-Length: 44
  Connection: close
  Content-Type: text/html
  
saving to 'index.html'
index.html           100% |********************************|    44  0:00:00 ETA
'index.html' saved
/ # 

netdevice-l3-pod to l3-apache connectivity test

Führen Sie in Cloud Shell einen Ping an die l3-apache-Instanz basierend auf der IP-Adresse aus dem vorherigen Schritt aus.

ping <insert-your-ip> -c 4

Beispiel:

/ # ping 172.16.20.3 -c 4
PING 172.16.20.3 (172.16.20.3): 56 data bytes
64 bytes from 172.16.20.3: seq=0 ttl=63 time=2.059 ms
64 bytes from 172.16.20.3: seq=1 ttl=63 time=0.533 ms
64 bytes from 172.16.20.3: seq=2 ttl=63 time=0.485 ms
64 bytes from 172.16.20.3: seq=3 ttl=63 time=0.462 ms

--- 172.16.20.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.462/0.884/2.059 ms
/ # 

Löschen Sie in Cloud Shell die vorherige Datei „index.html“ und führen Sie „wget -S“ für die l3-apache-Instanz basierend auf der IP-Adresse aus dem vorherigen Schritt aus. „200 OK“ weist auf einen erfolgreichen Download der Webseite hin.

rm index.html 
wget -S <insert-your-ip>

Beispiel:

/ # rm index.html 
/ # wget -S 172.16.20.3
Connecting to 172.16.20.3 (172.16.20.3:80)
  HTTP/1.1 200 OK
  Date: Mon, 31 Jul 2023 03:41:32 GMT
  Server: Apache/2.4.56 (Debian)
  Last-Modified: Mon, 31 Jul 2023 03:24:21 GMT
  ETag: "25-601bff76f04b7"
  Accept-Ranges: bytes
  Content-Length: 37
  Connection: close
  Content-Type: text/html
  
saving to 'index.html'
index.html           100% |*******************************************************************************************************|    37  0:00:00 ETA
'index.html' saved

Wenn Sie zur Cloud Shell zurückkehren möchten, beenden Sie den Pod über die Instanz.

exit

Konnektivitätstest zwischen L3-Pod und Netdevice-Apache

Melden Sie sich in Cloud Shell bei l3-pod an:

kubectl exec --stdin --tty l3-pod   -- /bin/sh

Pingen Sie vom Container aus die netdevice-apache-Instanz anhand der IP-Adresse, die Sie im vorherigen Schritt erhalten haben. Da l3-pod keine Schnittstelle hat, die mit netdevice-network verknüpft ist, schlägt der Ping fehl.

ping <insert-your-ip> -c 4

Beispiel:

/ # ping 172.16.10.2 -c 4
PING 172.16.10.2 (172.16.10.2): 56 data bytes


--- 172.16.10.2 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss

Optional:Führen Sie in Cloud Shell einen „wget -S“ für die netdevice-apache-Instanz basierend auf der IP-Adresse aus dem vorherigen Schritt aus, die ein Zeitlimit überschreitet.

wget -S <insert-your-ip>

Beispiel:

/ # wget -S 172.16.10.2
Connecting to 172.16.10.2 (172.16.10.2:80)
wget: can't connect to remote host (172.16.10.2): Connection timed out

Konnektivitätstest von l3-pod zu l3-apache

Führen Sie in Cloud Shell einen Ping an die l3-apache-Instanz basierend auf der IP-Adresse aus dem vorherigen Schritt aus.

ping <insert-your-ip> -c 4

Beispiel:

/ # ping 172.16.20.3 -c 4
PING 172.16.20.3 (172.16.20.3): 56 data bytes
64 bytes from 172.16.20.3: seq=0 ttl=63 time=1.824 ms
64 bytes from 172.16.20.3: seq=1 ttl=63 time=0.513 ms
64 bytes from 172.16.20.3: seq=2 ttl=63 time=0.482 ms
64 bytes from 172.16.20.3: seq=3 ttl=63 time=0.532 ms

--- 172.16.20.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.482/0.837/1.824 ms
/ # 

Führen Sie in Cloud Shell ein „wget -S“ für die l3-apache-Instanz basierend auf der IP-Adresse aus dem vorherigen Schritt aus. „200 OK“ gibt an, dass die Webseite erfolgreich heruntergeladen wurde.

wget -S <insert-your-ip>

Beispiel:

/ # wget -S 172.16.20.3
Connecting to 172.16.20.3 (172.16.20.3:80)
  HTTP/1.1 200 OK
  Date: Mon, 31 Jul 2023 03:52:08 GMT
  Server: Apache/2.4.56 (Debian)
  Last-Modified: Mon, 31 Jul 2023 03:24:21 GMT
  ETag: "25-601bff76f04b7"
  Accept-Ranges: bytes
  Content-Length: 37
  Connection: close
  Content-Type: text/html
  
saving to 'index.html'
index.html           100% |*******************************************************************************************************|    37  0:00:00 ETA
'index.html' saved
/ #

15. Firewalllogs

Mit Firewallregel-Logging können Sie die Auswirkungen Ihrer Firewallregeln überwachen, überprüfen und analysieren. Sie können beispielsweise feststellen, ob eine Firewallregel, die Traffic abweisen soll, wie vorgesehen funktioniert. Das Logging von Firewallregeln ist auch nützlich, wenn Sie ermitteln müssen, wie viele Verbindungen von einer bestimmten Firewallregel betroffen sind.

Im Tutorial haben Sie das Firewall-Logging beim Erstellen der Firewallregeln für eingehenden Traffic aktiviert. Sehen wir uns die Informationen an, die aus den Logs stammen.

Rufen Sie in der Cloud Console „Logging“ → „Log-Explorer“ auf.

Fügen Sie die Abfrage unten gemäß dem Screenshot ein und wählen Sie „Abfrage ausführen“ aus: jsonPayload.rule_details.reference:("network:l3-vpc/firewall:allow-ingress-from-l3-network-to-all-vpc-instances")

280d00f2c5ce6109.png

Eine genauere Betrachtung einer Erfassung liefert Sicherheitsexperten Informationen wie Quell- und Ziel-IP-Adresse, Port, Protokoll und Knotenpoolname.

ae4638ed9b718ac6.png

Wenn Sie weitere Firewalllogs aufrufen möchten, gehen Sie zu „VPC-Netzwerk“ → „Firewall“ → „allow-ingress-from-netdevice-network-to-all-vpc-instances“ und wählen Sie dann „In Logs Explorer ansehen“ aus.

16. Bereinigen

Löschen Sie die Komponenten der Anleitung in Cloud Shell.

gcloud compute instances delete l3-apache netdevice-apache --zone=us-central1-a --quiet

gcloud compute routers delete l3-cr netdevice-cr --region=us-central1 --quiet

gcloud container clusters delete multinic-gke --zone=us-central1-a --quiet

gcloud compute firewall-rules delete allow-ingress-from-l3-network-to-all-vpc-instances allow-ingress-from-netdevice-network-to-all-vpc-instances --quiet

gcloud compute networks subnets delete l3-apache l3-subnet netdevice-apache netdevice-subnet primary-node-subnet --region=us-central1 --quiet

gcloud compute networks delete l3-vpc netdevice-vpc primary-vpc --quiet

17. Glückwunsch

Sie haben erfolgreich einen Knotenpool mit mehreren NICs konfiguriert und erstellt sowie Pods mit Busybox erstellt, um die Konnektivität vom Typ L3 und Gerätetyp zu Apache-Servern mit PING und wget zu prüfen.

Außerdem haben Sie gelernt, wie Sie Firewall-Logs verwenden, um Quell- und Zielpakete zwischen den Pod-Containern und Apache-Servern zu prüfen.

Cosmopup findet Tutorials toll!!

e6d3675ca7c6911f.jpeg

Weitere Informationen und Videos

Referenzdokumente