Remarques :

Utilisation de Terraform pour déployer plusieurs clusters Kubernetes dans différentes régions OCI à l'aide d'OKE et créer un réseau maillé complet à l'aide de RPC

Introduction

Dans ce tutoriel, nous allons expliquer comment créer plusieurs clusters Kubernetes à l'aide d'Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) et déployer ces clusters dans trois pays différents (régions). Pour accélérer le déploiement et déployer les clusters Kubernetes de manière cohérente avec le moins d'erreurs de configuration possibles, nous allons utiliser Terraform et certains scripts bash personnalisés.

image

Nous avons également déployé manuellement des clusters uniques à l'aide de la méthode de création rapide et de la méthode de création personnalisée.

Ce tutoriel est une mise à jour basée sur la documentation suivante : Déploiement de plusieurs clusters Kubernetes sur Oracle Cloud.

Objectifs

Tâche 1 : Déterminer la topologie (étoile ou maillage)

Nous créons ces clusters Kubernetes pour déployer une application basée sur un conteneur déployée dans toutes les régions. Pour permettre la communication entre ces clusters Kubernetes, nous devons disposer d'une certaine forme de communication réseau. Pour l'instant, ce tutoriel est hors de portée, mais nous devons prendre certaines décisions architecturales à l'avance. L'une de ces décisions consiste à déterminer si nous voulons permettre une communication directe entre toutes les régions ou si nous voulons utiliser une région comme plaque tournante pour toutes les communications et les autres comme un satellite.

Topologie en étoile : la topologie en étoile permet la communication entre les régions à l'aide d'une seule région de hub. Ainsi, si les clusters Kubernetes de San Jose veulent communiquer avec les clusters Kubernetes de Dubaï, ils utiliseront Amsterdam comme centre de transit.

image

Topologie de maillage : la topologie de maillage permet une communication directe depuis et vers toutes les régions (clusters Kubernetes). Ainsi, si les clusters Kubernetes de San Jose veulent communiquer avec les clusters Kubernetes de Dubaï, ils peuvent communiquer directement.

image

Dans ce tutoriel, nous allons créer une topologie de maillage, et cette connectivité sera effectuée à l'aide de DRG et de RPC.

Tâche 2 : préparation de l'environnement pour l'authentification et exécution des scripts Terraform

Avant d'utiliser Terraform, nous devons préparer notre environnement. Pour utiliser Terraform, ouvrez un terminal. Dans ce tutoriel, nous utilisons l'application de terminal OS X.

image

  1. Exécutez la commande suivante pour vérifier que Terraform est installé, ajouté à votre chemin et quelle est la version.

    Last login: Thu Apr  4 08:50:38 on ttys000
    iwhooge@iwhooge-mac ~ % terraform -v
    zsh: command not found: terraform
    iwhooge@iwhooge-mac ~ %
    
  2. Vous pouvez constater que la commande est introuvable, ce qui signifie que Terraform n'est pas installé ou qu'il n'est pas ajouté à la variable de chemin.

image

Comme Terraform n'est pas installé, nous devons l'installer. Vous remarquerez qu'il ne s'agit pas seulement d'installer Terraform, mais qu'il faut effectuer plusieurs étapes pour déployer l'application Terraform et préparer l'environnement pour que notre solution complète de génération de script de bout en bout déploie trois clusters Kubernetes dans trois régions différentes.

L'image suivante fournit des conseils sur les tâches à suivre.

image

Tâche 2.1 : installer Homebrew

Terraform peut être installé à l'aide de différentes méthodes. Dans ce tutoriel, nous allons installer Terraform à l'aide de Homebrew.

Homebrew est un gestionnaire de packages pour MacOS (et Linux) qui peut être utilisé pour installer des applications et leurs dépendances requises sont comme apt ou yum.

Tâche 2.2 : utiliser Homebrew pour installer Terraform

Dans cette tâche, nous allons utiliser Homebrew pour installer le package Terraform.

Tâche 2.3 : création de clés RSA locales pour l'authentification OCI

Pour autoriser l'authentification avec OCI à l'aide d'une clé d'API, nous devons générer une nouvelle clé privée et publique à cette fin uniquement.

  1. Exécutez la commande suivante pour remplacer le répertoire par votre répertoire de base.

    iwhooge@iwhooge-mac ~ % cd ~/
    
  2. Exécutez la commande suivante pour vérifier que vous êtes dans votre répertoire de base.

    iwhooge@iwhooge-mac ~ % pwd
    
  3. Vérifiez que votre répertoire personnel est correct.

    /Users/iwhooge
    
  4. Exécutez la commande suivante pour créer un répertoire contenant les informations à authentifier auprès d'OCI.

    iwhooge@iwhooge-mac ~ % mkdir .oci
    
  5. Exécutez la commande suivante pour générer une clé RSA privée.

    iwhooge@iwhooge-mac ~ % openssl genrsa -out ~/.oci/4-4-2023-rsa-key.pem 2048
    Generating RSA private key, 2048 bit long modulus
    .........................................................................................................................................+++++
    ......+++++
    e is 65537 (0x10001)
    
  6. Exécutez la commande suivante pour rendre le fichier de clés privées lisible.

    iwhooge@iwhooge-mac ~ % chmod 600 ~/.oci/4-4-2023-rsa-key.pem
    
  7. Exécutez la commande suivante pour générer une clé RSA publique à partir de la clé privée.

    iwhooge@iwhooge-mac ~ % openssl rsa -pubout -in ~/.oci/4-4-2023-rsa-key.pem -out ~/.oci/4-4-2023-rsa-key-public.pem
    
  8. Vérifiez que l'écriture de la clé est terminée.

    writing RSA key
    
  9. Exécutez la commande suivante pour examiner le contenu de la clé RSA privée.

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key.pem
    
  10. Vérifiez le contenu de la clé RSA privée.

    -----BEGIN RSA PRIVATE KEY-----
    MIIEpQIBAAKCAQEA52+LJ+gp3MAJGtXTeQ/dmqq6Xh1zufK0yurLt/0w/DuxqEsL
    RT7x+Znz6EOVLx34Ul27QnHk7bhXaDCuwInnaOTOiS97AnLuFM08tvFksglnJssA
    JsszfTzUMNf0w4wtuLsJ5oRaPbVUa01TIm6HdwKAloIKYSn6z8gcvfLLItkyvPRo
    XXX
    w3yip+Yxr1YN3LjpDbZk4WTagKWoVQzp5nrfZlyU7ToZcMpUn/fIUsI=
    -----END RSA PRIVATE KEY-----
    
  11. Exécutez la commande suivante pour examiner le contenu de la clé RSA publique.

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key-public.pem
    
  12. Vérifiez le contenu de la clé RSA publique.

    ----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA52+LJ+gp3MAJGtXTeQ/d
    XXX
    mtHVtjLM1ftjYlaRSG5Xl/xdKMC8LH0bxpy3XXzLmDrYCP3LrhrIG8Xmuzsji6Hw
    TQIDAQAB
    -----END PUBLIC KEY-----
    iwhooge@iwhooge-mac ~ %
    

image

Tâche 2.4 : génération de clés SSH locales pour l'authentification de l'hôte de bastion

Nous devons également créer des clés SSH locales pour nous authentifier auprès de l'hôte Bastion. Il s'agit d'une autre clé que nous utilisons pour l'authentification à l'aide de la console OCI (API).

  1. Exécutez la commande suivante pour remplacer le répertoire par votre répertoire SSH.

    iwhooge@iwhooge-mac ~ % cd ~/.ssh/
    
  2. Exécutez la commande suivante pour vérifier que vous disposez d'une clé SSH publique et privée utilisable.

    iwhooge@iwhooge-mac .ssh % ls -l -a
    
  3. Notez que nous ne disposons d'aucune paire de clés SSH. Dans ce tutoriel, nous allons générer une nouvelle paire de clés SSH.

    total 16
    drwx------   4 iwhooge  staff   128 Feb  8 12:48 .
    drwxr-x---+ 30 iwhooge  staff   960 Apr  4 11:03 ..
    -rw-------@  1 iwhooge  staff  2614 Feb 28 11:49 known_hosts
    -rw-------@  1 iwhooge  staff  1773 Feb  8 12:48 known_hosts.old
    
  4. Exécutez la commande suivante pour générer une nouvelle paire de clés SSH.

    iwhooge@iwhooge-mac .ssh % ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/Users/iwhooge/.ssh/id_rsa):
    
  5. Laissez la phrase de passe vide et cliquez sur ENTER.

    Enter passphrase (empty for no passphrase):
    
  6. Laissez la phrase de passe vide et cliquez sur ENTER.

    Enter same passphrase again:
    
  7. Notez que la nouvelle paire de clés SSH est enregistrée dans les emplacements fournis.

    Your identification has been saved in /Users/iwhooge/.ssh/id_rsa
    Your public key has been saved in /Users/iwhooge/.ssh/id_rsa.pub
    The key fingerprint is:
    SHA256:2E7jD5Cvt0C3pArp+u5Q3BWDBDwfbtxp5T6eez75DPc iwhooge@iwhooge-mac
    The key's randomart image is:
    +---[RSA 3072]----+
    | ..o..o          |
    |  o o  o.        |
    |   = o.+         |
    | . .=.++.        |
    |  o...=.S        |
    | . . . Xoo       |
    |. o   o.*o...    |
    | o . . o+o++ .   |
    |.== . ..o=ooo E  |
    +----[SHA256]-----+
    iwhooge@iwhooge-mac .ssh %
    

image

Tâche 2.5 : créer une clé d'API dans la console OCI et ajouter la clé publique à votre compte OCI

Tâche 2.6 : collecte des informations requises pour votre environnement OCI

Nous devons collecter des informations pour nos fichiers Terraform pour l'authentification OCI à l'aide de l'API. La plupart des informations sont déjà fournies dans le fichier de configuration d'authentification d'API créé dans la tâche 2.5.

Il s'agit du compartiment dans lequel vous allez déployer vos clusters Kubernetes.

Tâche 3 : création de scripts et de fichiers Terraform

Nous avons terminé la préparation sur notre machine locale, notamment la configuration de clés Terraform, RSA et SSH, la configuration de l'environnement OCI (API) et la collecte de toutes les informations essentielles nécessaires pour authentifier Terraform avec OCI. A présent, créez le script Terraform.

Nous devons d'abord vérifier que nous sommes abonnés aux régions sur lesquelles nous déployons nos clusters Kubernetes. Si nous effectuons le déploiement vers une région non abonnée, une erreur d'authentification est générée et le déploiement échoue.

Pour ce tutoriel, nous utilisons les trois régions suivantes pour le déploiement : Amsterdam, San Jose et Dubaï.

Tâche 4 : exécution des clusters Terraform et OKE avec les ressources nécessaires (VCN, sous-réseaux, passerelles de routage dynamique, connexions d'appairage à distance, etc.)

Les scripts Terraform sont en place avec le paramètre correct. Exécutez maintenant les scripts et créez notre environnement composé de trois clusters Kubernetes dans trois régions différentes.

L'image suivante illustre l'emplacement de configuration de la connexion SSH à l'hôte du bastion et de l'hôte du bastion à l'hôte de l'opérateur.

image

Nous avons maintenant déployé trois clusters Kubernetes dans les différentes régions. Examinez les ressources déployées d'un haut niveau dans la console OCI.

Tâche 5 : établissement des connexions RPC

Etablissez les connexions entre les différentes pièces jointes RPC. Examinons-les d'abord dans les différentes régions.

Collecter tous les OCID RPC

Répétez le processus pour toutes les connexions d'appairage à distance sur toutes les régions de toutes les passerelles de routage dynamique et enregistrez-les.

Maintenant, nous avons collecté les OCID de connexion d'appairage à distance suivants :

Création des homologues RPC

Configurez l'appairage sur C1 vers C2 et C3. Cette opération configure automatiquement l'appairage pour C1 côté C2 et C3, et la configuration de l'appairage sur C2 vers C3 configure automatiquement l'appairage pour C2 côté C3.

Configurez les homologues C1 (Amsterdam).

Configurez l'appairage C2 (San José).

Tâche 6 : utiliser le visualiseur de réseau pour vérifier les connexions RPC

Effectuez une vérification supplémentaire pour vous assurer que le RPC a été configuré correctement avec Network Visualizer.

  1. Cliquez sur le menu Hamburger dans l'angle supérieur gauche.
  2. Cliquez sur Fonctions de réseau.
  3. Cliquez sur Visualiseur de réseau.

image

  1. Assurez-vous que vous êtes connecté à la région Amsterdam.
  2. Notez que la région d'Amsterdam est c1.
  3. Notez les connexions d'Amsterdam à San Jose et Dubaï.

image

  1. Assurez-vous que vous êtes connecté à la région San José.
  2. La région de San Jose est c2.
  3. Notez les connexions de San Jose à Amsterdam et Dubaï.

image

  1. Assurez-vous que vous êtes connecté à la région Dubaï.
  2. Notez que la région de Dubaï est c3.
  3. Notez les connexions de Dubaï à Amsterdam et San Jose.

image

Tâche 7 : utiliser le bastion et l'opérateur pour vérifier le fonctionnement de la connectivité

Nous avons créé les clusters Kubernetes (sur les trois régions différentes) et connecté les régions à l'aide de la connexion d'appairage à distance. Nous pouvons désormais utiliser l'hôte de l'opérateur pour vérifier qu'il peut gérer les clusters Kubernetes.

  1. Exécutez la commande suivante (qui a été fournie une fois la commande terraform plan terminée).

    Last login: Fri Apr  5 09:10:01 on ttys000
    iwhooge@iwhooge-mac ~ % ssh -o ProxyCommand='ssh -W %h:%p -i ~/.ssh/id_rsa opc@143.47.183.243' -i ~/.ssh/id_rsa opc@10.1.0.12
    Activate the web console with: systemctl enable --now cockpit.socket
    Last login: Fri Apr  5 07:34:13 2024 from 10.1.0.2
    [opc@o-tmcntm ~]$
    
  2. Exécutez la commande suivante pour effectuer une itération à l'aide d'une boucle for dans chaque cluster Kubernetes (c1, c2 et c3) et extraire le statut des noeuds de processus actif.

    [opc@o-tmcntm ~]$ for c in c1 c2 c3; do
    >   kubectx $c
    >   kubectl get nodes
    > done
    Switched to context "c1".
    NAME           STATUS   ROLES   AGE   VERSION
    10.1.113.144   Ready    node    76m   v1.28.2
    10.1.125.54    Ready    node    76m   v1.28.2
    Switched to context "c2".
    NAME          STATUS   ROLES   AGE   VERSION
    10.2.65.174   Ready    node    78m   v1.28.2
    10.2.98.54    Ready    node    78m   v1.28.2
    Switched to context "c3".
    NAME           STATUS   ROLES   AGE   VERSION
    10.3.118.212   Ready    node    73m   v1.28.2
    10.3.127.119   Ready    node    73m   v1.28.2
    [opc@o-tmcntm ~]$
    

    Exécutez la commande suivante dans le terminal après vous être connecté à l'hôte de l'opérateur.

    for c in c1 c2 c3; do
      kubectx $c
      kubectl get nodes
    done
    
  3. Notez la sortie de tous les noeuds pour tous les clusters Kubernetes déployés à l'aide du script Terraform.

image

Exécutez la commande kubectl get all -n kube-system avec la boucle for.

[opc@o-tmcntm ~]$ for c in c1 c2 c3; do
>   kubectx $c
>   kubectl get all -n kube-system
> done
Switched to context "c1".
NAME                                       READY   STATUS    RESTARTS       AGE
pod/coredns-844b4886f-8b4k6                1/1     Running   0              118m
pod/coredns-844b4886f-g8gbm                1/1     Running   0              122m
pod/csi-oci-node-5xzdg                     1/1     Running   0              119m
pod/csi-oci-node-nsdg4                     1/1     Running   1 (118m ago)   119m
pod/kube-dns-autoscaler-74f78468bf-l9644   1/1     Running   0              122m
pod/kube-flannel-ds-5hsp7                  1/1     Running   0              119m
pod/kube-flannel-ds-wk7xl                  1/1     Running   0              119m
pod/kube-proxy-gpvv2                       1/1     Running   0              119m
pod/kube-proxy-vgtf7                       1/1     Running   0              119m
pod/proxymux-client-nt59j                  1/1     Running   0              119m
pod/proxymux-client-slk9j                  1/1     Running   0              119m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.101.5.5   <none>        53/UDP,53/TCP,9153/TCP   122m

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                 AGE
daemonset.apps/csi-oci-node               2         2         2       2            2           <none>                                        122m
daemonset.apps/kube-flannel-ds            2         2         2       2            2           <none>                                        122m
daemonset.apps/kube-proxy                 2         2         2       2            2           beta.kubernetes.io/os=linux                   122m
daemonset.apps/node-termination-handler   0         0         0       0            0           oci.oraclecloud.com/oke-is-preemptible=true   122m
daemonset.apps/nvidia-gpu-device-plugin   0         0         0       0            0           <none>                                        122m
daemonset.apps/proxymux-client            2         2         2       2            2           node.info.ds_proxymux_client=true             122m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns               2/2     2            2           122m
deployment.apps/kube-dns-autoscaler   1/1     1            1           122m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-844b4886f                2         2         2       122m
replicaset.apps/kube-dns-autoscaler-74f78468bf   1         1         1       122m
Switched to context "c2".
NAME                                       READY   STATUS    RESTARTS       AGE
pod/coredns-84bd9cd884-4fqvr               1/1     Running   0              120m
pod/coredns-84bd9cd884-lmgz2               1/1     Running   0              124m
pod/csi-oci-node-4zl9l                     1/1     Running   0              122m
pod/csi-oci-node-xjzfd                     1/1     Running   1 (120m ago)   122m
pod/kube-dns-autoscaler-59575f8674-m6j2z   1/1     Running   0              124m
pod/kube-flannel-ds-llhhq                  1/1     Running   0              122m
pod/kube-flannel-ds-sm6fg                  1/1     Running   0              122m
pod/kube-proxy-7ppw8                       1/1     Running   0              122m
pod/kube-proxy-vqfgb                       1/1     Running   0              122m
pod/proxymux-client-cnkph                  1/1     Running   0              122m
pod/proxymux-client-k5k6n                  1/1     Running   0              122m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.102.5.5   <none>        53/UDP,53/TCP,9153/TCP   124m

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                 AGE
daemonset.apps/csi-oci-node               2         2         2       2            2           <none>                                        124m
daemonset.apps/kube-flannel-ds            2         2         2       2            2           <none>                                        124m
daemonset.apps/kube-proxy                 2         2         2       2            2           beta.kubernetes.io/os=linux                   124m
daemonset.apps/node-termination-handler   0         0         0       0            0           oci.oraclecloud.com/oke-is-preemptible=true   124m
daemonset.apps/nvidia-gpu-device-plugin   0         0         0       0            0           <none>                                        124m
daemonset.apps/proxymux-client            2         2         2       2            2           node.info.ds_proxymux_client=true             124m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns               2/2     2            2           124m
deployment.apps/kube-dns-autoscaler   1/1     1            1           124m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-84bd9cd884               2         2         2       124m
replicaset.apps/kube-dns-autoscaler-59575f8674   1         1         1       124m
Switched to context "c3".
NAME                                       READY   STATUS    RESTARTS   AGE
pod/coredns-56c7ffc89c-jt85k               1/1     Running   0          115m
pod/coredns-56c7ffc89c-lsqcg               1/1     Running   0          121m
pod/csi-oci-node-gfswn                     1/1     Running   0          116m
pod/csi-oci-node-xpwbp                     1/1     Running   0          116m
pod/kube-dns-autoscaler-6b69bf765c-fxjvc   1/1     Running   0          121m
pod/kube-flannel-ds-2sqbk                  1/1     Running   0          116m
pod/kube-flannel-ds-l7sdz                  1/1     Running   0          116m
pod/kube-proxy-4qcmb                       1/1     Running   0          116m
pod/kube-proxy-zcrk4                       1/1     Running   0          116m
pod/proxymux-client-4lgg7                  1/1     Running   0          116m
pod/proxymux-client-zbcrg                  1/1     Running   0          116m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.103.5.5   <none>        53/UDP,53/TCP,9153/TCP   121m

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                 AGE
daemonset.apps/csi-oci-node               2         2         2       2            2           <none>                                        122m
daemonset.apps/kube-flannel-ds            2         2         2       2            2           <none>                                        121m
daemonset.apps/kube-proxy                 2         2         2       2            2           beta.kubernetes.io/os=linux                   121m
daemonset.apps/node-termination-handler   0         0         0       0            0           oci.oraclecloud.com/oke-is-preemptible=true   121m
daemonset.apps/nvidia-gpu-device-plugin   0         0         0       0            0           <none>                                        122m
daemonset.apps/proxymux-client            2         2         2       2            2           node.info.ds_proxymux_client=true             122m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns               2/2     2            2           121m
deployment.apps/kube-dns-autoscaler   1/1     1            1           121m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-56c7ffc89c               2         2         2       121m
replicaset.apps/kube-dns-autoscaler-6b69bf765c   1         1         1       121m
[opc@o-tmcntm ~]$

Tâche 8 : supprimer les clusters OKE à l'aide de Terraform

Nous avons utilisé Terraform pour notre déploiement. Nous pouvons donc également utiliser Terraform pour supprimer l'ensemble du déploiement.

Remerciements

Ressources de formation supplémentaires

Parcourez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, rendez-vous sur education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir de la documentation sur le produit, visitez Oracle Help Center.