For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/containers-orchestration/managed-kubernetes/vrack-custom-gateway.md.

Utiliser une passerelle personnalisée sur un cluster OVHcloud Managed Kubernetes

Voir en Markdown

Découvrez comment utiliser une passerelle personnalisée sur un OVHcloud Managed Kubernetes fonctionnant avec un réseau privé vRack.

Objectifs

Dans ce tutoriel, nous allons utiliser une passerelle personnalisée déployée dans le vRack avec un cluster Managed Kubernetes.

Pourquoi ?

Par défaut, dans un cluster Kubernetes, les pods que vous déployez utilisent l'IP de sortie du nœud. Nous avons donc autant d'IP de sortie que de nœuds. Cela peut poser problème lorsque vous devez gérer une liste blanche et que votre cluster utilise l'autoscaling (création et suppression de nœuds à la volée).

Une solution consiste à utiliser une passerelle personnalisée, qui vous permet de disposer d'une seule IP de sortie (votre passerelle).

Vous allez :

  • créer un réseau privé
  • créer des sous-réseaux
  • créer un routeur OpenStack (dans chaque région) et le relier au réseau du fournisseur externe ainsi qu'aux sous-réseaux
  • créer un cluster OVHcloud Managed Kubernetes avec la passerelle privée
  • tester l'IP de sortie du pod

À la fin de ce tutoriel, vous devriez obtenir le flux suivant :

Schéma passerelle vRack

Info

Dans ce tutoriel, nous vous guidons pour créer le réseau privé dans deux régions, mais vous pouvez n'en utiliser qu'une seule si vous le souhaitez, par exemple GRA9.

Prérequis


Accès à l'espace client OVHcloud

  • Lien direct :
  • Pour accéder à vos services : Public Cloud > Sélectionnez votre projet > Managed Kubernetes Service

Initialisation

Pour configurer un environnement fonctionnel, vous devez charger les identifiants OpenStack et de l'API OVHcloud. Pour vous aider, nous avons également créé plusieurs scripts et modèles utiles.

Tout d'abord, créez un dossier utils dans votre environnement/machine locale. Puis téléchargez-y le script ovhAPI.sh.

Puis ajoutez les droits d'exécution au script ovhAPI.sh :

chmod +x utils/ovhAPI.sh

Vous devez charger le contenu du fichier utils/openrc fourni, pour gérer OpenStack, ainsi que les variables contenues dans le fichier utils/ovhAPI.properties pour gérer l'API OVHcloud.

Créez le fichier utils/openrc, ou téléchargez-le depuis votre fournisseur OpenStack. Il doit ressembler à ceci :

export OS_AUTH_URL=https://auth.cloud.ovh.net/v3
export OS_IDENTITY_API_VERSION=3
export OS_USER_DOMAIN_NAME=${OS_USER_DOMAIN_NAME:-"Default"}
export OS_PROJECT_DOMAIN_NAME=${OS_PROJECT_DOMAIN_NAME:-"Default"}
export OS_TENANT_ID=xxxxxxxxxxxxxxxxxxxxx
export OS_TENANT_NAME="xxxxxxxxxxxxxxxxxx"
export OS_USERNAME="user-xxxxxxxxxxxxx"
export OS_PASSWORD="xxxxxxxxxxxxxxxxxx"
export OS_REGION_NAME="xxxx"
if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi

Créez le fichier utils/ovhAPI.properties avec vos clés et secret générés :

OVH_API_URL="https://api.ovh.com/1.0"
OVH_ENDPOINT="ovh-eu"
OVH_APPLICATION_KEY="xxxxxxxxxxxxxxxxx"
OVH_APPLICATION_SECRET="xxxxxxxxxxxxxxxxx"
OVH_CONSUMER_KEY="xxxxxxxxxxxxxxxxxxxxx"

Vous devriez avoir un dossier utils contenant trois fichiers :

.
└── utils
    ├── openrc
    ├── ovhAPI.properties
    └── ovhAPI.sh

Chargez les variables :

. utils/openrc
. utils/ovhAPI.properties

Récupérez l'ID de votre tenant OpenStack et stockez-le dans la variable serviceName.

Bash
API
export serviceName=$(utils/ovhAPI.sh GET /cloud/project/$OS_TENANT_ID | jq -r .description) && echo $serviceName

Vous devriez obtenir un résultat de ce type :

$ export serviceName=$(utils/ovhAPI.sh GET /cloud/project/$OS_TENANT_ID | jq -r .description) && echo $serviceName
EXAMPLE

Créer le réseau privé

Important : nous supposons que votre projet PCI est ajouté à votre vRack.

Nous utilisons l'API OVHcloud pour créer le réseau privé. Pour ce tutoriel, nous utilisons les deux régions GRA9 et GRA11.

Créez un dossier tpl à côté du dossier utils, puis créez à l'intérieur le fichier data-pvnw.json avec le contenu suivant :

{
"name": "demo-pvnw",
"vlanId": 20,
"regions": ["GRA9","GRA11"]
}

Créez le réseau privé nommé demo-pvnw dans les régions GRA9 et GRA11 et récupérez l'ID du VLAN.

Bash
API
export vlanId="$(utils/ovhAPI.sh POST /cloud/project/$OS_TENANT_ID/network/private "$(cat tpl/data-pvnw.json)" | jq -r .id)" && echo $vlanId

Vous devriez obtenir un résultat de ce type :

$ export vlanId="$(utils/ovhAPI.sh POST /cloud/project/$OS_TENANT_ID/network/private "$(cat tpl/data-pvnw.json)" | jq -r .id)" && echo $vlanId
pn-1083678_20

À ce stade, votre réseau privé est créé et son ID est pn-1083678_20.

Créer des sous-réseaux

Pour ce tutoriel, nous divisons un sous-réseau /24 pour obtenir deux sous-réseaux /25.

Réf. : https://www.davidc.net/sites/default/subnets/subnets.html

NomRégionAdresse CIDRPasserellePlage DHCPDiffusion
Sous-réseau 1GRA9192.168.0.0/25192.168.0.1192.168.0.2-192.168.0.126192.168.0.127
Sous-réseau 2GRA11192.168.0.128/25192.168.0.129192.168.0.130-192.168.0.254192.168.0.255

Créez ces deux fichiers de données dans le dossier tpl :

Fichier data-subnetGRA9.json :

{
"start": "192.168.0.2",
"end": "192.168.0.126",
"region": "GRA9",
"dhcp": false,
"network": "192.168.0.0/25",
"noGateway": false
}

Fichier data-subnetGRA11.json :

{
"start": "192.168.0.130",
"end": "192.168.0.254",
"region": "GRA11",
"dhcp": false,
"network": "192.168.0.128/25",
"noGateway": false
}

Remarque : pour être précis, le paramètre "noGateway": false signifie "Gateway": true. Nous voulons que le sous-réseau utilise explicitement la première adresse IP de la plage CIDR.

Puis créez les sous-réseaux avec les routes appropriées, et enfin récupérez les ID (subnGRA9 et subnGRA11) :

Bash
API
export subnGRA9="$(utils/ovhAPI.sh POST /cloud/project/$OS_TENANT_ID/network/private/$vlanId/subnet "$(cat tpl/data-subnetGRA9.json)" | jq -r .id)" && echo $subnGRA9

export subnGRA11="$(utils/ovhAPI.sh POST /cloud/project/$OS_TENANT_ID/network/private/$vlanId/subnet "$(cat tpl/data-subnetGRA11.json)" | jq -r .id)" && echo $subnGRA11

Vous devriez obtenir un résultat de ce type :

$ export subnGRA9="$(utils/ovhAPI.sh POST /cloud/project/$OS_TENANT_ID/network/private/$vlanId/subnet "$(cat tpl/data-subnetGRA9.json)" | jq -r .id)" && echo $subnGRA9
668fd889-5477-445b-b4e1-b30432e39045

$ export subnGRA11="$(utils/ovhAPI.sh POST /cloud/project/$OS_TENANT_ID/network/private/$vlanId/subnet "$(cat tpl/data-subnetGRA11.json)" | jq -r .id)" && echo $subnGRA11
e76f2b49-2b9f-4248-98ae-179d596d6e45

Pour le moment, il n'est pas possible d'ajouter des routes au sous-réseau via l'API, il faut donc utiliser la CLI OpenStack.

Bash
openstack --os-region-name=GRA9 subnet set ${subnGRA9} --host-route destination=192.168.0.0/25,gateway=192.168.0.1

openstack --os-region-name=GRA11 subnet set ${subnGRA11} --host-route destination=192.168.0.128/25,gateway=192.168.0.129

Routeur OpenStack

Créer les routeurs

Nous avons la possibilité de créer des routeurs virtuels OpenStack. Pour cela, nous devons utiliser la CLI OpenStack. Créez les routeurs et récupérez leurs ID (rtrGRA9Id et rtrGRA11Id) :

Bash
export rtrGRA9Id="$(openstack --os-region-name=GRA9 router create rtr-GRA9 -f json | jq -r .id)" && echo $rtrGRA9Id
export rtrGRA11Id="$(openstack --os-region-name=GRA11 router create rtr-GRA11 -f json | jq -r .id)" && echo $rtrGRA11Id

Vous devriez obtenir un résultat de ce type :

$ export rtrGRA9Id="$(openstack --os-region-name=GRA9 router create rtr-GRA9 -f json | jq -r .id)" && echo $rtrGRA9Id
26bf99c8-d6fa-4c5a-9d42-1358776ee0a2

$ export rtrGRA11Id="$(openstack --os-region-name=GRA11 router create rtr-GRA11 -f json | jq -r .id)" && echo $rtrGRA11Id
ResourceNotFound: 404: Client Error for url: https://network.compute.gra11.cloud.ovh.net/v2.0/routers, The resource could not be found.
Info

Pour le moment, vous ne pouvez créer un routeur virtuel que dans les régions GRA9 et GRA11, mais cette fonctionnalité sera déployée dans d'autres régions dans les semaines et mois à venir.

Vous pouvez maintenant afficher les informations de votre nouveau routeur virtuel sur GRA9 afin d'afficher son IP :

$ openstack --os-region-name=GRA9 router show $rtrGRA9Id -c id -c name -c status -c created_at -c external_gateway_info
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field                 | Value                                                                                                                                                                                                                                                                                     |
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| created_at            | 2022-07-25T07:32:06Z                                                                                                                                                                                                                                                                      |
| external_gateway_info | {"network_id": "b2c02fdc-ffdf-40f6-9722-533bd7058c06", "external_fixed_ips": [{"subnet_id": "0f11270c-1113-4d4f-98de-eba83445d962", "ip_address": "141.94.209.244"}, {"subnet_id": "4aa6cac1-d5cd-4e25-b14b-7573aeabcab1", "ip_address": "2001:41d0:304:400::917"}], "enable_snat": true} |
| id                    | 26bf99c8-d6fa-4c5a-9d42-1358776ee0a2                                                                                                                                                                                                                                                      |
| name                  | rtr-GRA9                                                                                                                                                                                                                                                                                  |
| status                | ACTIVE                                                                                                                                                                                                                                                                                    |
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Comme vous pouvez le voir, dans cet exemple, l'IP de la passerelle sera 141.94.209.244.

Relier le routeur au réseau du fournisseur externe

Tout d'abord, récupérez l'ID du réseau externe régional (extNwGRA9Id et extNwGRA11Id), puis reliez-le au routeur :

Bash
# GRA9
export extNwGRA9Id="$(openstack --os-region-name=GRA9 network list -f json | jq -r '.[] | select(.Name=="Ext-Net") | .ID')" && echo $extNwGRA9Id
openstack --os-region-name=GRA9 router set $rtrGRA9Id --external-gateway $extNwGRA9Id
# GRA11
export extNwGRA11Id="$(openstack --os-region-name=GRA11 network list -f json | jq -r '.[] | select(.Name=="Ext-Net") | .ID')" && echo $extNwGRA11Id
openstack --os-region-name=GRA11 router set $rtrGRA11Id --external-gateway $extNwGRA11Id

Vous devriez obtenir un résultat de ce type :

$ export extNwGRA9Id="$(openstack --os-region-name=GRA9 network list -f json | jq -r '.[] | select(.Name=="Ext-Net") | .ID')" && echo $extNwGRA9Id
b2c02fdc-ffdf-40f6-9722-533bd7058c06
$ openstack --os-region-name=GRA9 router set $rtrGRA9Id --external-gateway $extNwGRA9Id

$ export extNwGRA11Id="$(openstack --os-region-name=GRA11 network list -f json | jq -r '.[] | select(.Name=="Ext-Net") | .ID')" && echo $extNwGRA11Id
bcf59eb2-9d83-41cc-b4f5-0435ed594833
$ openstack --os-region-name=GRA11 router set $rtrGRA11Id --external-gateway $extNwGRA11Id

Relier le routeur au sous-réseau

Faites de même avec les sous-réseaux régionaux :

Bash
# GRA9
openstack --os-region-name=GRA9 router add subnet $rtrGRA9Id $subnGRA9
# GRA11
openstack --os-region-name=GRA11 router add subnet $rtrGRA11Id $subnGRA11

Créer un cluster Kubernetes avec passerelle privée

Le réseau est maintenant prêt. Créez un cluster OVHcloud Managed Kubernetes en spécifiant l'utilisation de la passerelle définie sur chaque sous-réseau.

Remarque : jusqu'à la fin de ce tutoriel, nous n'utilisons que la région GRA9, mais vous pouvez répéter exactement les mêmes étapes pour créer un cluster dans la région GRA11.

Info

Dans ce guide, nous avons défini la version 1.34 pour le cluster Kubernetes, mais vous pouvez utiliser une autre version prise en charge.

Tout d'abord, récupérez les ID des réseaux privés (pvnwGRA9Id et pvnwGRA11Id), puis créez le cluster OVHcloud Managed Kubernetes, et enfin récupérez l'ID du cluster (kubeId) :

Bash
API
Espace client OVHcloud
Terraform

Créez un fichier tpl/data-kube.json.tpl comme données et ajoutez les paramètres appropriés. Les fichiers devraient ressembler à ceci :

{
"region": "GRA9",
"name": "demo",
"version": "1.34",
"nodepool": {
  "flavorName": "b2-7",
  "antiAffinity": false,
  "monthlyBilled": false,
  "autoscale": false,
  "desiredNodes": 3
},
"privateNetworkId": "@privateNetworkId@",
"privateNetworkConfiguration" :{
      "privateNetworkRoutingAsDefault": true,
      "defaultVrackGateway": "192.168.0.1"
}
}
# Get the GRA9 private network Id
export pvnwGRA9Id="$(utils/ovhAPI.sh GET `/cloud/project`/$OS_TENANT_ID/network/private/${vlanId} | jq '.regions[] | select(.region=="GRA9")' | jq -r .openstackId)" && echo $pvnwGRA9Id
# Create the kube payload file
cat tpl/data-kube.json.tpl | sed -e "s|@privateNetworkId@|$pvnwGRA9Id|g" > tpl/data-kube.json
# Create the kube cluster
export kubeId="$(utils/ovhAPI.sh POST /cloud/project/$OS_TENANT_ID/kube "$(cat tpl/data-kube.json)" | jq -r .id)" && echo $kubeId

Vous devriez obtenir un résultat de ce type :

$ export pvnwGRA9Id="$(utils/ovhAPI.sh GET `/cloud/project`/$OS_TENANT_ID/network/private/${vlanId} | jq '.regions[] | select(.region=="GRA9")' | jq -r .openstackId)" && echo >> $pvnwGRA9Id
d9775b7c-c267-44b4-b758-6e827b0a69bb

$ cat tpl/data-kube.json.tpl | sed -e "s|@privateNetworkId@|$pvnwGRA9Id|g" > tpl/data-kube.json

$ cat tpl/data-kube.json
{
  "region": "GRA9",
  "name": "demo",
  "version": "1.34",
  "nodepool": {
    "flavorName": "b2-7",
    "antiAffinity": false,
    "monthlyBilled": false,
    "autoscale": false,
    "desiredNodes": 3
  },
  "privateNetworkId": "d9775b7c-c267-44b4-b758-6e827b0a69bb",
  "privateNetworkConfiguration" :{
        "privateNetworkRoutingAsDefault": true,
        "defaultVrackGateway": "192.168.0.1"
  }
}

$ export kubeId="$(utils/ovhAPI.sh POST /cloud/project/$OS_TENANT_ID/kube "$(cat tpl/data-kube.json)" | jq -r .id)" && echo $kubeId
6bc9c71a-e570-4ed6-848b-de212fbab7da

Attendez maintenant que votre cluster OVHcloud Managed Kubernetes soit à l'état READY.

Pour cela, vous pouvez vérifier son statut dans l'espace client OVHcloud :

Accédez à l'interface d'administration de vos clusters OVHcloud Managed Kubernetes en cliquant sur Managed Kubernetes Service dans le menu de gauche :

Créer un cluster

Comme vous pouvez le voir, votre nouveau cluster est attaché au réseau demo-pvnw.

Puis cliquez sur votre cluster Kubernetes demo nouvellement créé afin de voir son statut :

Créer un cluster

Lorsque le statut de votre cluster est OK, vous pouvez passer à la section suivante.

Récupérer le fichier Kubeconfig

Pour continuer avec le cluster Kubernetes nouvellement créé, vous devez récupérer le fichier Kubeconfig.

Bash
API
utils/ovhAPI.sh POST /cloud/project/$OS_TENANT_ID/kube/$kubeId/kubeconfig | jq -r .content > kubeconfig-demo

Pour utiliser ce fichier kubeconfig et accéder à votre cluster, vous pouvez suivre notre tutoriel configurer kubectl, ou simplement ajouter l'option --kubeconfig dans vos commandes kubectl.

Test

Listez les nœuds actifs de votre cluster :

kubectl --kubeconfig=kubeconfig-demo get no -o wide

Vous devriez obtenir un résultat de ce type :

$ kubectl --kubeconfig=kubeconfig-demo get no -o wide
NAME                                         STATUS   ROLES    AGE   VERSION   INTERNAL-IP    EXTERNAL-IP      OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
nodepool-8f0b4d98-874a-4cfd-b8-node-c74f26   Ready    <none>   56m   v1.34.0   192.168.0.71   141.94.215.23    Ubuntu 18.04.6 LTS   4.15.0-189-generic   containerd://1.4.6
nodepool-8f0b4d98-874a-4cfd-b8-node-c9bf60   Ready    <none>   57m   v1.34.0   192.168.0.96   141.94.208.78    Ubuntu 18.04.6 LTS   4.15.0-189-generic   containerd://1.4.6
nodepool-8f0b4d98-874a-4cfd-b8-node-e666f5   Ready    <none>   56m   v1.34.0   192.168.0.31   141.94.212.214   Ubuntu 18.04.6 LTS   4.15.0-189-generic   containerd://1.4.6

Testez maintenant le cluster en exécutant un conteneur simple qui demande son adresse IP publiée.

kubectl --kubeconfig=kubeconfig-demo run --image=debian debian -it -- bash
apt update
apt install -y curl
curl ifconfig.me

Vous devriez obtenir un résultat de ce type :

$ kubectl --kubeconfig=kubeconfig-demo run --image=debian debian  -it -- bash
If you don't see a command prompt, try pressing enter.
root@debian:/# apt update
Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:2 http://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
Get:3 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:4 http://deb.debian.org/debian bullseye/main amd64 Packages [8182 kB]
Get:5 http://deb.debian.org/debian-security bullseye-security/main amd64 Packages [167 kB]
Get:6 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [2592 B]
...

root@debian:/# apt install -y curl
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  ca-certificates libbrotli1 libcurl4 libldap-2.4-2 libldap-common libnghttp2-14 libpsl5 librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libssh2-1 openssl publicsuffix
Suggested packages:
...

root@debian:/# curl ifconfig.me
141.94.209.244

L'adresse IP de notre pod est bien celle de notre passerelle !

Suppression (nettoyage)

Pour supprimer les ressources créées, suivez les instructions ci-dessous :

Cluster Kubernetes

Bash
API
utils/ovhAPI.sh DELETE /cloud/project/$OS_TENANT_ID/kube/$kubeId

Routeurs

Pour supprimer un routeur OpenStack, vous devez d'abord retirer les ports qui lui sont liés.

Bash
# Get the routers subnets attached ports Ids
export portIdGRA9="$(openstack --os-region-name=GRA9 port list | grep -w "192.168.0.1" | awk '{print $2}')" && echo $portIdGRA9
export portIdGRA11="$(openstack --os-region-name=GRA11 port list | grep -w "192.168.0.129" | awk '{print $2}')" && echo $portIdGRA11
# Get the routers Ids
export rtrIdGRA9="$(openstack --os-region-name=GRA9 router list -f json | jq -r '.[] | select(.Name=="rtr-GRA9") | .ID')" && echo $rtrIdGRA9
export rtrIdGRA11="$(openstack --os-region-name=GRA11 router list -f json | jq -r '.[] | select(.Name=="rtr-GRA11") | .ID')" && echo $rtrIdGRA11
# Remove ports from routers
openstack --os-region-name=GRA9 router remove port $rtrIdGRA9 $portIdGRA9
openstack --os-region-name=GRA11 router remove port $rtrIdGRA11 $portIdGRA11
# Delete routers
openstack router delete rtr-GRA9
openstack router delete rtr-GRA11

Sous-réseaux

Bash
API
utils/ovhAPI.sh DELETE /cloud/project/$OS_TENANT_ID/network/private/$vlanId/subnet/$subnGRA9
utils/ovhAPI.sh DELETE /cloud/project/$OS_TENANT_ID/network/private/$vlanId/subnet/$subnGRA11

Réseau privé

Bash
API
utils/ovhAPI.sh DELETE /cloud/project/$OS_TENANT_ID/network/private/$vlanId

Aller plus loin

  • Pour une formation ou une assistance technique sur la mise en œuvre de nos solutions, contactez votre commercial ou consultez la page Professional Services pour obtenir un devis et faire analyser votre projet par nos experts.

Échangez avec notre communauté d'utilisateurs.

Cette page vous a-t-elle aidé ?