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

1. Introduction

GCP est compatible depuis longtemps avec 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 autorisaient tous les NodePools à n'avoir qu'une seule interface et donc à être mappés sur 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 les pods d'un cluster GKE.

Objectifs de l'atelier

Dans ce tutoriel, vous allez créer un environnement multinic GKE complet qui illustre les cas d'utilisation présentés dans la figure 1.

  1. Créez netdevice-l3-pod en utilisant busybox pour :
  2. Effectuer un PING et un wget -S sur l'instance netdevice-apache dans le réseau netdevice-vpc sur eth2
  3. Effectuez un PING et un wget -S vers l'instance l3-apache dans le l3-vpc sur eth1.
  4. Créez un pod L3 utilisant busybox pour effectuer un PING et wget -S vers l'instance l3-apache sur 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 à plusieurs cartes d'interface réseau
  • Créer un pod avec des fonctionnalités netdevice et L3
  • Créer un pod avec des fonctionnalités de couche 3
  • Créer et valider le réseau d'objets GKE
  • Valider la connectivité aux serveurs Apache distants à l'aide de PING, wget et des 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 paramètres et de ressources 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 bloc 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 attribuée aux nœuds. Il peut disposer de plusieurs plages secondaires pouvant appartenir à des pods et à des services.

Réseau de nœuds : le réseau de nœuds fait référence à une combinaison dédiée d'une paire VPC/sous-réseau. Dans ce réseau de nœuds, les nœuds appartenant au pool de nœuds se voient attribuer des adresses IP de la plage principale.

Plage secondaire : une plage secondaire Google Cloud est un bloc 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 comporter plusieurs plages secondaires, et un pod peut se connecter à plusieurs réseaux de pods.

Réseau (L3 ou appareil) : objet réseau qui sert de point de connexion pour les pods. Dans le tutoriel, les réseaux sont l3-network et netdevice-network, où l'appareil peut être netdevice ou dpdk. Le réseau par défaut est obligatoire et 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ée comme suit :

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

Le réseau de l'appareil correspond à un sous-réseau d'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 d'un 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 l'ensemble des nœuds et des pods d'un cluster par défaut.

Pods avec plusieurs interfaces : les pods avec plusieurs interfaces dans GKE 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 des $variables pour faciliter l'implémentation de la configuration gcloud dans Cloud Shell.

Dans Cloud Shell, procédez comme suit :

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

3. Configurer le VPC principal

Créer le VPC principal

Dans Cloud Shell, procédez comme suit :

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, procédez comme suit :

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 VPC principaux pour créer le pool de nœuds par défaut avec les indicateurs requis : "–enable-multi-networking" et "–enable-dataplane-v2" pour prendre en charge les pools de nœuds multi-NIC.

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 par défaut :

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, procédez comme suit :

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 de l'interface réseau multinic :

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 de Cloud Router et de 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 l3-vpc

Créer le réseau l3-vpc

Dans Cloud Shell, procédez comme suit :

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

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

Dans Cloud Shell, créez un sous-réseau avec une plage principale et une plage secondaire. La plage secondaire(sec-range-l3-subnet) est utilisée pour le réseau L3 multinic :

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 de Cloud Router et de 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 multinic

Dans la section suivante, vous allez créer un pool de nœuds multinic composé des indicateurs suivants :

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

Exemple :

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

–additional-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 "e2-standard-4" avec quatre processeurs virtuels peut accepter jusqu'à quatre VPC au total. Par exemple, netdevice-l3-pod aura un total de trois interfaces (par défaut, netdevice et l3). Le type de machine utilisé dans le tutoriel est donc e2-standard-4.

Dans Cloud Shell, créez le pool de nœuds composé d'un périphérique de type et d'un 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. Valider le pool de nœuds multnic

Dans Cloud Shell, vérifiez que trois nœuds sont générés à partir du pool de nœuds multinic :

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

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

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 que "routes to" correspond au sous-réseau 172.16.10.0/28 (netdevice-apache) dans 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 "Ready" (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 l'éditeur VI ou 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 l'é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, validez le bloc CIDR gkenetworkparamset 192.168.10.0/24 utilisé pour l'interface du ou des pods lors d'une étape ultérieure.

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

Dans les étapes suivantes, vous allez générer un objet Kubernetes Network et GKENetworkParamSet pour créer le réseau de couche 3 qui sera utilisé pour associer des pods lors des étapes ultérieures.

Créer l'objet réseau de couche 3

Dans Cloud Shell, créez l'objet réseau YAML l3-network.yaml à l'aide de l'éditeur VI ou nano. Notez que "routes to" correspond au sous-réseau 172.16.20.0/28 (l3-apache) dans 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 du réseau de couche 3 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 l'éditeur VI ou nano. Notez que la 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 la raison de l'état du réseau de couche 3 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 paramètre gkenetworkparamset l3-network CIDR 10.0.8.0/21 utilisé pour créer l'interface de 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 pod netdevice-l3

Dans la section suivante, vous allez créer le pod netdevice-l3 exécutant busybox, également appelé "couteau suisse", qui prend en charge plus de 300 commandes courantes. Le pod est configuré pour communiquer avec l3-vpc à l'aide d'eth1 et avec netdevice-vpc à l'aide d'eth2.

Dans Cloud Shell, créez le conteneur busybox nommé netdevice-l3-pod.yaml à l'aide de l'éditeur VI 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 du pod netdevice-l3

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 de pod.

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 des réseaux l3-network et netdevice-network. L'adresse IP du 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

À partir de l'instance, validez les interfaces du pod :

ifconfig

Dans l'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)

À partir du pod netdevice-l3, validez les routes vers netdevice-vpc (172.16.10.0/28) et l3-vpc (172.16.20.0/28).

Formez l'instance et 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 depuis l'instance.

exit

12. Créer le pod de niveau 3

Dans la section suivante, vous allez créer le pod l3 exécutant busybox, également appelé "couteau suisse", qui prend en charge plus de 300 commandes courantes. Le pod est configuré pour communiquer avec le VPC de couche 3 en utilisant uniquement eth1.

Dans Cloud Shell, créez le conteneur busybox nommé l3-pod.yaml à l'aide de l'éditeur VI 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 du pod de niveau 3

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 de pod.

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 de couche 3. L'adresse IP du 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

À partir de l'instance, validez les interfaces du pod :

ifconfig

Dans l'exemple, eth0 est connecté au réseau par défaut et 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, validez les routes vers le VPC l3 (172.16.20.0/28).

Formez l'instance et 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 depuis l'instance.

exit

13. Mises à jour du pare-feu

Pour autoriser la connectivité du pool multicnic GKE au netdevice-vpc, des règles de pare-feu d'entrée sont requises pour netdevice-vpc et l3-vpc. Vous allez créer des règles de pare-feu spécifiant la plage source comme sous-réseau du réseau de pods, par exemple netdevice-subnet ou sec-range-l3-subnet.

Par exemple, le conteneur l3-pod récemment créé, l'interface eth2 10.0.8.22 (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: Allow from netdevice-subnet to netdevice-apache

Dans Cloud Shell, créez la règle de pare-feu dans le VPC netdevice-vpc pour autoriser l'accès du sous-réseau netdevice-subnet à 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 trafic de sec-range-l3-subnet vers l3-apache

Dans Cloud Shell, créez la règle de pare-feu dans le VPC l3-vpc, en autorisant l'accès de sec-range-l3-subnet à 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 des pods netdevice-l3-pod et l3-pod en vous connectant aux pods et en exécutant une commande wget -S qui valide le téléchargement de la page d'accueil des serveurs Apache. Étant donné que le pod netdevice-l3-pod est configuré avec des interfaces des réseaux 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 d'un wget -S à partir du pod l3, la connectivité au serveur Apache dans netdevice-vpc n'est pas possible, car le pod l3 n'est configuré qu'avec une interface du réseau l3.

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 à 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 une commande wget -S sur l'instance netdevice-apache en fonction de l'adresse IP obtenue à l'étape précédente. Si le téléchargement de la page Web a réussi, le code de réponse 200 OK s'affiche.

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é entre netdevice-l3-pod et l3-apache

Dans Cloud Shell, effectuez un ping sur 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 commande wget -S sur l'instance l3-apache en fonction de l'adresse IP obtenue à l'étape précédente. Si le code 200 OK s'affiche, cela signifie que la page Web a été téléchargée avec succès.

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 depuis l'instance.

exit

Test de connectivité l3-pod à netdevice-apache

Dans Cloud Shell, connectez-vous à l'instance 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 l'interface l3-pod n'est pas 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 une commande wget -S sur l'instance netdevice-apache en fonction de l'adresse IP obtenue à l'étape précédente, qui expirera.

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é entre l3-pod et l3-apache

Dans Cloud Shell, effectuez un ping sur 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 commande wget -S sur l'instance l3-apache en fonction de l'adresse IP obtenue à l'étape précédente. Un code 200 OK indique que la page Web a été téléchargée avec succès.

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 le tutoriel, vous avez activé la journalisation du pare-feu lorsque vous avez créé les règles de pare-feu d'entrée. Examinons les informations obtenues à partir des journaux.

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

Insérez la requête ci-dessous, comme indiqué sur la capture d'écran, puis 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

En examinant de plus près une capture, les administrateurs de sécurité peuvent obtenir des informations sur 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 configuré et validé la création d'un pool de nœuds multinic et de pods exécutant busybox pour valider la connectivité de type L3 et de périphérique aux 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 pense que les tutoriels sont géniaux !!

e6d3675ca7c6911f.jpeg

Lectures et vidéos complémentaires

Documents de référence