GKE NFO-Multi-Netzwerke bereitstellen und validieren Hochleistungsschnittstelle

1. Einführung

Die GCP unterstützt schon lange mehrere Schnittstellen auf VM-Instanzebene. Mit mehreren Schnittstellen kann eine VM bis zu 7 neue Schnittstellen (Standard + 7 Schnittstellen) mit verschiedenen VPCs verbinden. Im GKE-Netzwerk wird dieses Verhalten jetzt auf die Pods ausgeweitet, die auf den Knoten ausgeführt werden. Vor dieser Funktion konnten GKE-Cluster allen Knotenpools nur eine einzige Schnittstelle ermöglichen und daher einer einzelnen VPC zuordnen. Mit der Funktion für mehrere Netzwerke auf Pods können Nutzer jetzt mehr als eine Schnittstelle auf Knoten und für Pods in einem GKE-Cluster aktivieren.

Inhalt

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

  1. Erstellen Sie den Pod netdevice-l3-pod mit der Nutzung von „ownedbox“, um:
  2. Führe ein PING durch und wget -S zur Instanz "netdevice-apache" in "netdevice-vpc" über "eth2"
  3. Führe ein PING durch und wget -S zu l3-apache-Instanz im l3-vpc über eth1
  4. Erstellen Sie einen l3-Pod, der mit der Betätigung der Betätigungsbox einen PING durchführt und wget -S zu l3-apache-Instanz über eth1

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

Abbildung 1

9d93019ee608587f.png

Aufgaben in diesem Lab

  • L3-Subnetz erstellen
  • So erstellen Sie ein Subnetz vom Typ Netdevice
  • GKE-Knotenpool mit mehreren NICs einrichten
  • Pod mit netdevice- und l3-Funktionen erstellen
  • Pod mit L3-Funktionen erstellen
  • GKE-Objektnetzwerk erstellen und validieren
  • Konnektivität zu Apache Remote-Servern mithilfe von 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 mit einer Reihe von Standardeinstellungen und -ressourcen. Der GKE-Cluster wird in dieser VPC erstellt.

Subnetz: In Google Cloud ist ein Subnetz die Möglichkeit, ein Classless Inter-Domain Routing (CIDR) mit Netzmasken in einer VPC zu erstellen. Ein Subnetz hat einen einzigen 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 einem 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. In dieser Anleitung sind die Netzwerke „l3-network“ und „netdevice-network“, wobei das Gerät entweder „netdevice“ oder „dpdk“ sein kann. Das Standardnetzwerk ist obligatorisch und wird bei der Clustererstellung basierend auf dem Subnetz des Standardknotenpools erstellt.

Ebene-3-Netzwerke entsprechen einem sekundären Bereich in einem Subnetz, dargestellt als:

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

Das Gerätenetzwerk entspricht einem Subnetz in einer VPC, dargestellt als:

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 standardmäßige 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 zur Unterstützung des Codelab aktualisieren

In diesem Codelab wird $variables verwendet, um die Implementierung der gcloud-Konfiguration in Cloud Shell zu unterstützen.

Führen Sie in Cloud Shell die folgenden Schritte aus:

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

3. Einrichtung der primären VPC

Primäre VPC erstellen

Führen Sie in Cloud Shell die folgenden 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 die folgenden 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, indem Sie die primären VPC-Subnetze angeben, um den Standardknotenpool mit den erforderlichen Flags –enable-multi-networking und –enable-dataplane-v2 zur Unterstützung von Multi-NIC-Knotenpools zu erstellen.

Erstellen Sie in Cloud Shell den GKE-Cluster:

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 werden:

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. Einrichtung von netdevice-vpc

Netzwerk "netdevice-vpc" erstellen

Führen Sie in Cloud Shell die folgenden Schritte aus:

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

Subnetze "netdevice-vpc" erstellen

Erstellen Sie in Cloud Shell das Subnetz, das für das multinic-Netzwerk netdevice-network 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

In der Anleitung wird Cloud NAT 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 Instanz "netdevice-apache".

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-Einrichtung

l3-vpc-Netzwerk erstellen

Führen Sie in Cloud Shell die folgenden Schritte aus:

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

l3-vpc-Subnetze erstellen

Erstellen Sie in Cloud Shell ein Subnetz des primären und sekundären Bereichs. Der sekundäre Bereich(sec-range-l3-subnet) wird für das multinic-l3-Netzwerk 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

In der Anleitung wird Cloud NAT 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. Multinic-Knotenpool erstellen

Im folgenden Abschnitt erstellen Sie einen Multinic-Knotenpool, der aus den folgenden Flags besteht:

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

Beispiel:

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

–additional-node-network & –additional-pod-network ( Erforderlich für L3-Schnittstellen)

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 Maschinentypabhängigkeit. Beispiel: Ein Maschinentyp wie „e2-standard-4“ mit 4 vCPUs unterstützen insgesamt bis zu 4 VPCs. Beispiel: „netdevice-l3-pod“ hat insgesamt drei Schnittstellen (Standard, netdevice und l3). Der in dieser Anleitung verwendete Maschinentyp ist also „e2-standard-4“.

Erstellen Sie in Cloud Shell den Knotenpool mit einem Gerätetyp und L3:

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. multnic-node-pool validieren

Prüfen Sie in Cloud Shell, ob drei Knoten aus dem multinic-node-pool generiert werden:

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. netdevice-network erstellen

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

Objekt „netdevice-network“ erstellen

Erstellen Sie in Cloud Shell das Netzwerkobjekt-YAML netdevice-network.yaml mit dem VI-Editor oder Nano. Auf der Route nach ist das Subnetz 172.16.10.0/28 (netdevice-apache) im netdevice-vpc.

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 die Datei netdevice-network.yaml an:

kubectl apply -f netdevice-network.yaml 

Prüfen Sie in Cloud Shell, ob der Statustyp „netdevice-network“ auf „Bereit“ gesetzt 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 die Netzwerkobjekt-YAML-Datei netdevice-network-parm.yaml mit dem VI-Editor oder mit Nano. Die Spezifikation ist der Subnetzbereitstellung „netdevice-vpc“ zugeordnet.

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 Statusgrund für netdevice-network „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 CIDR-Block gkenetworkparamset 192.168.10.0/24, der in einem späteren Schritt für die Pod(s)-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 Verknüpfen von Pods verwendet wird.

L3-Netzwerkobjekt erstellen

Erstellen Sie in Cloud Shell die Netzwerkobjekt-YAML-Datei „l3-network.yaml“ mit dem VI-Editor oder mit Nano. Auf der Route nach ist das Subnetz 172.16.20.0/28 (l3-apache) im L3-vpc.

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 die Datei l3-network.yaml an:

kubectl apply -f l3-network.yaml 

Prüfen Sie in Cloud Shell, ob der Statustyp „l3-network“ „Bereit“ lautet.

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 die Netzwerkobjekt-YAML-Datei l3-network-parm.yaml mit dem VI-Editor oder mit Nano. Die Spezifikation ist der l3-vpc-Subnetzbereitstellung zugeordnet.

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 die Datei l3-network-parm.yaml an.

kubectl apply -f l3-network-parm.yaml 

Prüfen Sie in Cloud Shell, ob der Statusgrund des l3-Netzwerks „GNPParmsReady“ und „NetworkReady“ lautet:

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 CIDR 10.0.8.0/21 des gkenetworkparamset-l3-Netzwerks, der zum Erstellen der Pod-Schnittstelle verwendet wurde.

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 die netdevice-l3-pod Runningstavebox, die als "Schweizer Armeemesser" bezeichnet wird. die mehr als 300 häufige Befehle unterstützt. Der Pod ist so konfiguriert, dass er über eth1 mit dem l3-vpc und über eth2 mit netdevice-vpc kommuniziert.

Erstellen Sie in Cloud Shell den ausgelasteten Box-Container mit dem Namen netdevice-l3-pod.yaml mithilfe des VI-Editors 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 netdevice-l3-pod.yaml an.

kubectl apply -f netdevice-l3-pod.yaml

Erstellung des netdevice-l3-Pods validieren

Prüfen Sie in Cloud Shell, ob der 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 vorliegenden Beispiel enthält das Feld networking.gke.io/pod-ips die IP-Adressen, die den Pod-Schnittstellen aus „l3-network“ und „netdevice-network“ zugeordnet sind. Die Standard-Netzwerk-IP-Adresse 10.0.1.22 wird unter podIPs angegeben:

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

Validieren Sie in Cloud Shell die Routen zu netdevice-vpc und l3-vpc von netdevice-l3-pod:

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

Erstellen Sie die Instanz und validieren Sie die Pod-Schnittstellen:

ifconfig

Im Beispiel ist eth0 mit dem Standardnetzwerk verbunden, eth1 mit dem l3-network und eth2 mit dem netdevice-network.

/ # 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)

Validieren Sie im Pod "netdevice-l3-pod" die Routen zu "netdevice-vpc" (172.16.10.0/28) und "l3-vpc" (172.16.20.0/28).

Erstellen Sie die Instanz und validieren Sie die Pod-Routen:

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 

Beenden Sie den Pod aus der Instanz, um zu Cloud Shell zurückzukehren.

exit

12. l3-Pod erstellen

Im folgenden Abschnitt erstellen Sie das „L3-Pod-Laufgerät“ mit dem Namen „Schweizer Armeemesser“. die mehr als 300 häufige Befehle unterstützt. Der Pod ist so konfiguriert, dass er nur über eth1 mit dem l3-vpc kommuniziert.

Erstellen Sie in Cloud Shell den ausgelasteten Box-Container mit dem Namen l3-pod.yaml mithilfe des VI-Editors 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 l3-pod.yaml an.

kubectl apply -f l3-pod.yaml

Erstellung von l3-Pods validieren

Prüfen Sie in Cloud Shell, ob der 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 vorliegenden 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-Netzwerk-IP-Adresse 10.0.2.12 wird unter podIPs angegeben:

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

Validieren Sie in Cloud Shell die Routen zum l3-vpc von netdevice-l3-pod:

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

Erstellen Sie die Instanz und validieren Sie die Pod-Schnittstellen:

ifconfig

Im Beispiel ist „eth0“ mit dem Standardnetzwerk und „eth1“ mit dem „l3-network“ 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)

Validieren Sie die Routen zum L3-Pod vom l3-Pod (172.16.20.0/28).

Erstellen Sie die Instanz und validieren Sie die Pod-Routen:

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)

Beenden Sie den Pod aus der Instanz, um zu Cloud Shell zurückzukehren.

exit

13. Firewall-Updates

Um Verbindungen vom GKE-Multicnic-Pool zu den Firewallregeln „netdevice-vpc“ und „l3-vpc“ für eingehenden Traffic zuzulassen, sind erforderlich. Sie erstellen Firewallregeln, die den Quellbereich als Pod-Netzwerksubnetz angeben, z.B. netdevice-subnet, sec-range-l3-subnet.

Beispiel: Der kürzlich erstellte Container „l3-pod“ und die eth2-Schnittstelle 10.0.8.22 (zugewiesen aus dem sec-range-l3-subnet) ist die Quell-IP-Adresse, wenn eine Verbindung zur l3-apache-Instanz im l3-vpc hergestellt wird.

netdevice-vpc: Von netdevice-subnet an netdevice-apache zulassen

Erstellen Sie in Cloud Shell die Firewallregel im netdevice-vpc, die dem netdevice-subnet-Zugriff 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: Zulassen von sec-range-l3-subnet zu l3-apache

Erstellen Sie in Cloud Shell die Firewallregel im l3-vpc, die dem sec-range-l3-subnet den Zugriff 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-Konnektivität validieren

Im folgenden Abschnitt überprüfen Sie die Verbindung zu den Apache-Instanzen vom netdevice-l3-pod und l3-pod aus. Melden Sie sich dazu bei den Pods an und führen Sie wget -S aus, um einen Download der Apache-Server-Startseite zu validieren. Da der Pod "netdevice-l3-pod" mit Schnittstellen aus "netdevice-network" und "l3-network" konfiguriert ist, ist eine Verbindung zu den Apache-Servern in "netdevice-vpc" und "l3-vpc" möglich.

Beim Ausführen von „wget -S“ vom l3-Pod ist dagegen keine Verbindung zum Apache-Server in „netdevice-vpc“ möglich, da der l3-Pod nur mit einer Schnittstelle aus dem l3-Netzwerk konfiguriert ist.

Apache Server-IP-Adresse abrufen

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

fee492b4fd303859.png

Konnektivitätstest von netdevice-l3-pod zu netdevice-apache

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

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

Führen Sie vom Container aus einen Ping an die Instanz von netdevice-apache basierend auf der IP-Adresse aus, 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 den Befehl „wget -S“ für die netdevice-apache-Instanz aus, basierend auf der IP-Adresse, die Sie im vorherigen Schritt erhalten haben. „200 OK“ zeigt 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
/ # 

Konnektivitätstest von netdevice-l3-pod zu l3-apache

Führen Sie in Cloud Shell einen Ping an die l3-Apache-Instanz basierend auf der IP-Adresse aus, die Sie im vorherigen Schritt erhalten haben.

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 die Instanz „wget -S to l3-apache“ anhand der IP-Adresse aus, die Sie im vorherigen Schritt erhalten haben. „200 OK“ zeigt an, dass die Webseite erfolgreich heruntergeladen wurde.

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

Beenden Sie den Pod aus der Instanz, um zu Cloud Shell zurückzukehren.

exit

Konnektivitätstest von l3-pod zu netdevice-apache

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

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

Führen Sie vom Container aus einen Ping an die Instanz von netdevice-apache basierend auf der IP-Adresse aus, die Sie im vorherigen Schritt erhalten haben. Da der 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 den Befehl „wget -S“ für die Instanz „netdevice-apache“ aus, basierend auf der IP-Adresse, die Sie im vorherigen Schritt erhalten haben, wodurch das Zeitlimit überschritten wird.

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 vom l3-pod zu l3-apache

Führen Sie in Cloud Shell einen Ping an die l3-Apache-Instanz basierend auf der IP-Adresse aus, die Sie im vorherigen Schritt erhalten haben.

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 den Befehl „wget -S“ für die l3-Apache-Instanz anhand der IP-Adresse aus, die Sie im vorherigen Schritt erhalten haben. „200 OK“ zeigt 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

Durch das Logging der Firewallregeln können Sie die Auswirkungen Ihrer Firewallregeln überwachen, überprüfen und analysieren. Sie können beispielsweise feststellen, ob eine Firewallregel zum Ablehnen von Traffic 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.

In dieser Anleitung haben Sie das Firewall-Logging beim Erstellen der Firewallregeln für eingehenden Traffic aktiviert. Werfen wir einen Blick auf die Informationen aus den Logs.

Gehen Sie in der Cloud Console zu „Logging“ → „Log-Explorer“.

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

280d00f2c5ce6109.png

Bei genauerer Betrachtung einer Aufnahme erhalten Sicherheitsadministratoren Informationselemente. einschließlich Quell- und Ziel-IP-Adresse, Port, Protokoll und Knotenpoolname.

ae4638ed9b718ac6.png

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

16. Bereinigen

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

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

Herzlichen Glückwunsch! Sie haben das Erstellen eines Multinic-Knotenpools und das Erstellen von Pods, die mit dem Befehl "ownedbox" ausgeführt werden, erfolgreich konfiguriert und validiert, um die L3- und Gerätetypkonnektivität zu Apache-Servern mithilfe von PING und wget zu validieren.

Außerdem haben Sie gelernt, wie Sie mit Firewalllogs Quell- und Zielpakete zwischen den Pod-Containern und Apache-Servern prüfen.

Cosmopup findet die Anleitungen super!

e6d3675ca7c6911f.jpeg

Weitere Informationen und Videos

Referenzdokumente