Déployer et valider le multiréseau GKE NFO Interface hautes performances

1. Introduction

GCP accepte depuis longtemps plusieurs interfaces au niveau d'une instance de VM. Avec plusieurs interfaces, une VM peut connecter jusqu'à sept nouvelles interfaces (par défaut + sept interfaces) à différents VPC. La mise en réseau GKE étend désormais ce comportement aux pods qui s'exécutent sur les nœuds. Avant cette fonctionnalité, les clusters GKE permettaient à tous les pools de nœuds de ne comporter qu'une seule interface et donc d'être mappés à un seul VPC. Grâce à la fonctionnalité multiréseau sur les pods, un utilisateur peut désormais activer plusieurs interfaces sur les nœuds et pour les pods d'un cluster GKE.

Objectifs de l'atelier

Dans ce tutoriel, vous allez créer un environnement multicloud complet GKE qui illustre le ou les cas d'utilisation illustrés dans la figure 1.

  1. Créez netdevice-l3-pod à l'aide d'une boîte à bulles en service pour:
  2. Réaliser un PING et wget -S vers l'instance netdevice-apache dans le VPC netdevice-vpc via eth2
  3. Réaliser un PING et wget -S vers l'instance l3-apache dans le VPC l3-vpc sur eth1
  4. Créez un l3-pod à l'aide d'une boîte à bulles en train d'exécuter une commande PING. wget -S vers une instance l3-apache via eth1

Dans les deux cas d'utilisation, l'interface eth0 du pod est connectée au réseau par défaut.

Figure 1

9d93019ee608587f.png

Points abordés

  • Créer un sous-réseau de type l3
  • Créer un sous-réseau de type netdevice
  • Établir un pool de nœuds GKE avec plusieurs cartes d'interface réseau
  • Créer un pod avec des fonctionnalités netdevice et l3
  • Créer un pod avec des capacités l3
  • Créer et valider un réseau d'objets GKE
  • Comment valider la connectivité à des serveurs Apache distants à l'aide de PING, wget et de journaux de pare-feu

Prérequis

  • Projet Google Cloud

2. Terminologie et concepts

VPC principal: le VPC principal est un VPC préconfiguré fourni avec un ensemble de ressources et de paramètres par défaut. Le cluster GKE est créé dans ce VPC.

Sous-réseau: dans Google Cloud, un sous-réseau permet de créer un routage CIDR (Classless Inter-Domain Routing) avec des masques de réseau dans un VPC. Un sous-réseau possède une seule plage d'adresses IP principale qui est attribuée aux nœuds et peut avoir plusieurs plages secondaires pouvant appartenir à des pods et à des services.

Node-network (réseau de nœuds) : le réseau de nœuds fait référence à la combinaison dédiée d'un VPC et d'une paire de sous-réseaux. Au sein de ce réseau de nœuds, les nœuds appartenant au pool de nœuds reçoivent des adresses IP à partir de la plage d'adresses IP principale.

Plage secondaire: une plage secondaire Google Cloud est un CIDR et un masque de réseau appartenant à une région dans un VPC. GKE l'utilise comme réseau de pods de couche 3. Un VPC peut avoir plusieurs plages secondaires, et un pod peut se connecter à plusieurs réseaux de pods.

Réseau (L3 ou appareil): objet réseau servant de point de connexion aux pods. Dans ce tutoriel, les réseaux sont l3-network et netdevice-network, où l'appareil peut être soit netdevice, soit dpdk. Le réseau par défaut est obligatoire. Il est créé lors de la création du cluster en fonction du sous-réseau du pool de nœuds par défaut.

Les réseaux de couche 3 correspondent à une plage secondaire d'un sous-réseau, représenté comme suit:

VPC -> Nom du sous-réseau -> Nom de la plage secondaire

Le réseau de l'appareil correspond à un sous-réseau sur un VPC, représenté comme suit:

VPC -> Nom du sous-réseau

Réseau de pods par défaut: Google Cloud crée un réseau de pods par défaut lors de la création du cluster. Le réseau de pods par défaut utilise le VPC principal comme réseau de nœuds. Le réseau de pods par défaut est disponible sur tous les nœuds et pods du cluster, par défaut.

Pods avec plusieurs interfaces: dans GKE, les pods dotés de plusieurs interfaces ne peuvent pas se connecter au même réseau de pods, car chaque interface du pod doit être connectée à un réseau unique.

Mettre à jour le projet pour qu'il soit compatible avec l'atelier de programmation

Cet atelier de programmation utilise $variables pour faciliter l'implémentation de la configuration gcloud dans Cloud Shell.

Dans Cloud Shell, effectuez les opérations suivantes:

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

3. Configuration du VPC principal

Créer le VPC principal

Dans Cloud Shell, effectuez les opérations suivantes:

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

Créer le nœud et les sous-réseaux secondaires

Dans Cloud Shell, effectuez les opérations suivantes:

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. Création d'un cluster GKE

Créez le cluster GKE privé en spécifiant les sous-réseaux "primary-vpc" afin de créer le pool de nœuds par défaut avec les options requises "-enable-multi-networking" et "-enable-dataplane-v2" pour la compatibilité avec les pools de nœuds avec plusieurs cartes d'interface réseau.

Dans Cloud Shell, créez le cluster GKE:

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

Valider le cluster multinic-gke

Dans Cloud Shell, authentifiez-vous auprès du cluster:

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

Dans Cloud Shell, vérifiez que deux nœuds sont générés à partir du pool default-pool:

kubectl get nodes

Exemple :

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. Configuration de netdevice-vpc

Créer le réseau netdevice-vpc

Dans Cloud Shell, effectuez les opérations suivantes:

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

Créer les sous-réseaux "netdevice-vpc"

Dans Cloud Shell, créez le sous-réseau utilisé pour le réseau multinic netdevice-network:

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

Dans Cloud Shell, créez un sous-réseau pour l'instance 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

Configuration Cloud Router et NAT

Cloud NAT est utilisé dans le tutoriel pour l'installation de packages logiciels, car l'instance de VM ne possède pas d'adresse IP externe.

Dans Cloud Shell, créez le routeur cloud.

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

Dans Cloud Shell, créez la passerelle NAT.

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

Créer l'instance netdevice-apache

Dans la section suivante, vous allez créer l'instance netdevice-apache.

Dans Cloud Shell, créez l'instance:

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. Configuration de l3-vpc

Créer le réseau l3-vpc

Dans Cloud Shell, effectuez les opérations suivantes:

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

Créer les sous-réseaux l3-vpc

Dans Cloud Shell, créez des sous-réseaux de plage principale et secondaire. La plage secondaire(sec-range-l3-subnet) est utilisée pour le réseau multinic l3-network:

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

Dans Cloud Shell, créez un sous-réseau pour l'instance l3-apache:

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

Configuration Cloud Router et NAT

Cloud NAT est utilisé dans le tutoriel pour l'installation de packages logiciels, car l'instance de VM ne possède pas d'adresse IP externe.

Dans Cloud Shell, créez le routeur cloud.

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

Dans Cloud Shell, créez la passerelle NAT.

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

Créer l'instance l3-apache

Dans la section suivante, vous allez créer l'instance l3-apache.

Dans Cloud Shell, créez l'instance:

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. Créer le pool de nœuds doté de plusieurs cartes d'interface réseau

Dans la section suivante, vous allez créer un pool de nœuds doté de plusieurs cartes d'interface réseau comprenant les options suivantes:

–additional-node-network (obligatoire pour les interfaces de type d'appareil)

Exemple :

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

– network-node-network & –additional-pod-network ( obligatoire pour les interfaces de type L3)

Exemple :

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

Type de machine: lors du déploiement du pool de nœuds, tenez compte de la dépendance du type de machine. Par exemple, un type de machine tel que "e2-standard-4" comportant quatre vCPU peuvent accepter jusqu'à quatre VPC au total. Par exemple, netdevice-l3-pod aura un total de trois interfaces (par défaut, netdevice et l3). Par conséquent, le type de machine utilisé dans le tutoriel est e2-standard-4.

Dans Cloud Shell, créez le pool de nœuds composé d'un appareil de type et d'un niveau 3:

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. Valider le pool de nœuds multiples

Dans Cloud Shell, validez que trois nœuds sont générés à partir du pool multinic-node-pool:

kubectl get nodes

Exemple :

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. Créer le réseau netdevice-network

Dans les étapes suivantes, vous allez générer un objet Kubernetes Network et GKENetworkParamSet pour créer le réseau netdevice-network qui sera utilisé pour associer les pods dans les étapes suivantes.

Créer l'objet netdevice-network

Dans Cloud Shell, créez l'objet réseau YAML netdevice-network.yaml à l'aide de l'éditeur VI ou de nano. Notez l'itinéraire vers correspond au sous-réseau 172.16.10.0/28 (netdevice-apache) dans le VPC 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"

Dans Cloud Shell, appliquez netdevice-network.yaml:

kubectl apply -f netdevice-network.yaml 

Dans Cloud Shell, vérifiez que le type d'état netdevice-network est prêt.

kubectl describe networks netdevice-network

Exemple :

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>

Créer le GKENetworkParamSet

Dans Cloud Shell, créez l'objet réseau YAML netdevice-network-parm.yaml à l'aide de VI Editor ou de nano. La spécification correspond au déploiement du sous-réseau "netdevice-vpc".

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

Dans Cloud Shell, appliquez netdevice-network-parm.yaml.

kubectl apply -f netdevice-network-parm.yaml 

Dans Cloud Shell, validez le motif d'état netdevice-network GNPParmsReady et NetworkReady:

kubectl describe networks netdevice-network

Exemple :

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>

Dans Cloud Shell, vous validerez le bloc CIDR 192.168.10.0/24 gkenetworkparamset 192.168.10.0/24 que vous utiliserez pour l'interface du ou des pods lors d'une prochaine étape.

kubectl describe gkenetworkparamsets.networking.gke.io netdevice

Exemple :

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. Créer les réseaux de niveau 3

Dans les étapes suivantes, vous allez générer un objet Kubernetes Network et GKENetworkParamSet pour créer le réseau l3 qui sera utilisé pour associer les pods dans les étapes suivantes.

Créer l'objet réseau l3

Dans Cloud Shell, créez l'objet réseau YAML l3-network.yaml à l'aide de VI Editor ou de nano. Notez l'itinéraire vers est le sous-réseau 172.16.20.0/28 (l3-apache) du réseau 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"

Dans Cloud Shell, appliquez l3-network.yaml:

kubectl apply -f l3-network.yaml 

Dans Cloud Shell, vérifiez que le type d'état l3-network est "Prêt".

kubectl describe networks l3-network

Exemple :

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>

Créer le GKENetworkParamSet

Dans Cloud Shell, créez l'objet réseau YAML l3-network-parm.yaml à l'aide de VI Editor ou de nano. Notez que cette spécification correspond au déploiement du sous-réseau l3-vpc.

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

Dans Cloud Shell, appliquez l3-network-parm.yaml

kubectl apply -f l3-network-parm.yaml 

Dans Cloud Shell, vérifiez que le motif d'état l3-network est GNPParmsReady et NetworkReady:

kubectl describe networks l3-network

Exemple :

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>

Dans Cloud Shell, validez le CIDR 10.0.8.0/21 gkenetworkparamset l3-network 10.0.8.0/21 utilisé pour créer l'interface du pod.

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

Exemple :

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. Créer le netdevice-l3-pod

Dans la section suivante, vous allez créer l'instance netdevice-l3-pod qui s'exécute sur la boîte, appelée "couteau suisse" qui prend en charge plus de 300 commandes courantes. Le pod est configuré pour communiquer avec l3-vpc via eth1 et netdevice-vpc via eth2.

Dans Cloud Shell, créez le conteneur de zone occupée nommé netdevice-l3-pod.yaml à l'aide de VI Editor ou de 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

Dans Cloud Shell, appliquez netdevice-l3-pod.yaml.

kubectl apply -f netdevice-l3-pod.yaml

Valider la création de netdevice-l3-pod

Dans Cloud Shell, vérifiez que netdevice-l3-pod est en cours d'exécution:

kubectl get pods netdevice-l3-pod

Exemple :

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

Dans Cloud Shell, validez les adresses IP attribuées aux interfaces des pods.

kubectl get pods netdevice-l3-pod -o yaml

Dans l'exemple fourni, le champ networking.gke.io/pod-ips contient les adresses IP associées aux interfaces de pod de l3-network et netdevice-network. L'adresse IP réseau par défaut 10.0.1.22 est détaillée sous podIPs:

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"

Valider les routes netdevice-l3-pod

Dans Cloud Shell, validez les routes vers netdevice-vpc et l3-vpc depuis netdevice-l3-pod:

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

Créez l'instance, validez les interfaces du pod:

ifconfig

Dans cet exemple, eth0 est connecté au réseau par défaut, eth1 est connecté au réseau l3-network et eth2 est connecté au réseau 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)

Validez les routes vers netdevice-vpc (172.16.10.0/28) et l3-vpc (172.16.20.0/28) depuis netdevice-l3-pod.

Depuis l'instance, validez les routes du pod:

ip route

Exemple :

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

Pour revenir à Cloud Shell, quittez le pod de l'instance.

exit

12. Créer le pod l3-pod

Dans la section suivante, vous allez créer l'instance l3-pod numérotés, appelée "couteau suisse" qui prend en charge plus de 300 commandes courantes. Le pod est configuré pour communiquer avec le VPC l3-vpc uniquement via eth1.

Dans Cloud Shell, créez le conteneur de zone occupée nommé l3-pod.yaml à l'aide de VI Editor ou de 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

Dans Cloud Shell, appliquez l3-pod.yaml.

kubectl apply -f l3-pod.yaml

Valider la création de l3-pod

Dans Cloud Shell, vérifiez que netdevice-l3-pod est en cours d'exécution:

kubectl get pods l3-pod

Exemple :

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

Dans Cloud Shell, validez les adresses IP attribuées aux interfaces des pods.

kubectl get pods l3-pod -o yaml

Dans l'exemple fourni, le champ networking.gke.io/pod-ips contient les adresses IP associées aux interfaces de pod du réseau l3-network. L'adresse IP réseau par défaut 10.0.2.12 est détaillée sous podIPs:

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"

Valider les routes l3-pod

Dans Cloud Shell, validez les routes vers l3-vpc depuis netdevice-l3-pod:

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

Créez l'instance, validez les interfaces du pod:

ifconfig

Dans cet exemple, eth0 est connecté au réseau par défaut, eth1 est connecté au réseau l3-network.

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

À partir du pod l3-pod, validez les routes vers le VPC l3-vpc (172.16.20.0/28).

Depuis l'instance, validez les routes du pod:

ip route

Exemple :

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

Pour revenir à Cloud Shell, quittez le pod de l'instance.

exit

13. Mises à jour du pare-feu

Pour autoriser la connectivité entre le pool multicnic-GKE et les règles de pare-feu d'entrée netdevice-vpc et l3-vpc, Vous allez créer des règles de pare-feu spécifiant la plage source en tant que sous-réseau du réseau de pods. Par exemple, netdevice-subnet et sec-range-l3-subnet.

Par exemple, le conteneur l3-pod, interface eth2 récemment créé (allouée à partir du sous-réseau sec-range-l3-subnet) est l'adresse IP source lors de la connexion à l'instance l3-apache dans le VPC l3-vpc.

netdevice-vpc: autoriser le sous-réseau netdevice-subnet vers netdevice-apache

Dans Cloud Shell, créez la règle de pare-feu dans le VPC "netdevice-vpc" qui autorise le sous-réseau netdevice-subnet à accéder à l'instance netdevice-apache.

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: autoriser le sous-réseau sec-range-l3-subnet vers l3-apache

Dans Cloud Shell, créez la règle de pare-feu dans le VPC l3-vpc, autorisant sec-range-l3-subnet à accéder à l'instance l3-apache.

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. Valider la connectivité des pods

Dans la section suivante, vous allez vérifier la connectivité aux instances Apache à partir de netdevice-l3-pod et l3-pod en vous connectant aux pods et en exécutant la commande wget -S qui valide le téléchargement de la page d'accueil des serveurs Apache. Comme le pod netdevice-l3-pod est configuré avec des interfaces provenant de netdevice-network et l3-network, la connectivité aux serveurs Apache dans netdevice-vpc et l3-vpc est possible.

En revanche, lors de l'exécution de la commande wget -S à partir du pod l3-pod, la connectivité au serveur Apache dans netdevice-vpc n'est pas possible, car le l3-pod n'est configuré qu'avec une interface de l3-network.

Obtenir l'adresse IP du serveur Apache

Dans la console Cloud, obtenez l'adresse IP des serveurs Apache en accédant à Compute Engine → Instances de VM.

fee492b4fd303859.png

Test de connectivité de netdevice-l3-pod vers netdevice-apache

Dans Cloud Shell, connectez-vous à netdevice-l3-pod:

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

À partir du conteneur, effectuez un ping vers l'instance netdevice-apache en fonction de l'adresse IP obtenue à l'étape précédente.

ping <insert-your-ip> -c 4

Exemple :

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

Dans Cloud Shell, exécutez la commande wget -S sur l'instance netdevice-apache en vous basant sur l'adresse IP obtenue à l'étape précédente. 200 OK indique que la page Web a bien été téléchargée.

wget -S <insert-your-ip>

Exemple :

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

Test de connectivité de netdevice-l3-pod vers l3-apache

Dans Cloud Shell, envoyez un ping à l'instance l3-apache en fonction de l'adresse IP obtenue à l'étape précédente.

ping <insert-your-ip> -c 4

Exemple :

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

Dans Cloud Shell, supprimez le fichier index.html précédent et exécutez une instance wget -S vers l3-apache en vous basant sur l'adresse IP obtenue à l'étape précédente. 200 OK indique un téléchargement réussi de la page Web.

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

Exemple :

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

Pour revenir à Cloud Shell, quittez le pod de l'instance.

exit

Test de connectivité de l3-pod vers netdevice-apache

Dans Cloud Shell, connectez-vous à l3-pod:

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

À partir du conteneur, effectuez un ping vers l'instance netdevice-apache en fonction de l'adresse IP obtenue à l'étape précédente. Comme l3-pod n'a pas d'interface associée à netdevice-network, le ping échouera.

ping <insert-your-ip> -c 4

Exemple :

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

Facultatif:Dans Cloud Shell, exécutez la commande wget -S sur une instance netdevice-apache en vous basant sur l'adresse IP obtenue à l'étape précédente, qui va expirer.

wget -S <insert-your-ip>

Exemple :

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

Test de connectivité l3-pod vers l3-apache

Dans Cloud Shell, envoyez un ping à l'instance l3-apache en fonction de l'adresse IP obtenue à l'étape précédente.

ping <insert-your-ip> -c 4

Exemple :

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

Dans Cloud Shell, exécutez une instance wget -S vers l3-apache en vous basant sur l'adresse IP obtenue à l'étape précédente. 200 OK indique que la page Web a bien été téléchargée.

wget -S <insert-your-ip>

Exemple :

/ # 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. Journaux de pare-feu

La journalisation des règles de pare-feu vous permet de réaliser des audits, des vérifications et des analyses sur les effets de ces règles. Par exemple, vous pouvez déterminer si une règle de pare-feu conçue pour refuser le trafic fonctionne comme prévu. La journalisation des règles de pare-feu est également utile si vous devez déterminer le nombre de connexions affectées par une règle de pare-feu donnée.

Dans ce tutoriel, vous avez activé la journalisation de pare-feu lors de la création des règles de pare-feu d'entrée. Examinons les informations obtenues dans les journaux.

Dans la console Cloud, accédez à Logging → Explorateur de journaux.

Insérez la requête ci-dessous conformément à la capture d'écran et sélectionnez Exécuter la requête jsonPayload.rule_details.reference:("network:l3-vpc/firewall:allow-ingress-from-l3-network-to-all-vpc-instances")

280d00f2c5ce6109.png

Examiner de plus près une capture fournit des éléments d'information aux administrateurs de la sécurité : comme l'adresse IP source et de destination, le port, le protocole et le nom du pool de nœuds.

ae4638ed9b718ac6.png

Pour explorer d'autres journaux de pare-feu, accédez à Réseau VPC → Pare-feu → allow-ingress-from-netdevice-network-to-all-vpc-instances, puis sélectionnez "Afficher" dans l'explorateur de journaux.

16. Effectuer un nettoyage

Dans Cloud Shell, supprimez les composants du tutoriel.

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. Félicitations

Félicitations ! Vous avez bien configuré et validé la création d'un pool de nœuds multinic et la création de pods exécutant la boîte de dialogue Istio pour valider la connectivité de type L3 et type d'appareil avec les serveurs Apache à l'aide de PING et wget.

Vous avez également appris à exploiter les journaux de pare-feu pour inspecter les paquets source et de destination entre les conteneurs de pods et les serveurs Apache.

Cosmopup trouve les tutoriels géniaux !

e6d3675ca7c6911f.jpeg

Complément d'informations et Vidéos

Documents de référence