Note :

Utiliser Terraform pour déployer plusieurs grappes Kubernetes sur différentes régions OCI à l'aide d'OKE et créer un réseau maillé complet à l'aide d'une connexion d'appairage distant

Présentation

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

Image

Nous avons également déployé manuellement des grappes 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 cette documentation : Déploiement de plusieurs grappes Kubernetes sur Oracle Cloud.

Objectifs

Tâche 1 : Déterminer la topologie (Star vs Mesh)

Nous créons ces grappes Kubernetes pour déployer une application basée sur des conteneurs déployée dans toutes les régions. Pour permettre la communication entre ces grappes Kubernetes, nous devons avoir une forme de communication réseau. Pour l'instant, cela n'entre pas dans le cadre de ce tutoriel, mais nous devons prendre certaines décisions architecturales à l'avance. L'une de ces décisions consiste à déterminer si nous voulons permettre la communication directe entre toutes les régions ou si nous voulons utiliser une région comme centre de toutes les communications et les autres comme satellite.

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

Image

Topologie de mise en forme : La topologie de maillage permet une communication directe vers et depuis toutes les régions (grappes Kubernetes). Ainsi, si les clusters Kubernetes à San Jose veulent communiquer avec les clusters Kubernetes à 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éparer votre environnement pour l'authentification et exécuter 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 voir que la commande est introuvable, ce qui signifie que Terraform n'est pas installé ou qu'elle n'est pas ajoutée à la variable de chemin.

Image

Comme vous pouvez le constater, Terraform n'est pas installé, nous devons l'installer. Vous remarquerez qu'il ne s'agit pas seulement de l'installation de Terraform, mais qu'il y a plusieurs étapes requises pour déployer l'application Terraform et préparer l'environnement pour notre solution complète de script de bout en bout afin de déployer trois grappes 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 d'ensembles pour MacOS (et Linux) qui peut être utilisé pour installer des applications et leurs dépendances requises sont telles que apt ou yum.

Tâche 2.2 : Utiliser Homebrew pour installer Terraform

Dans cette tâche, nous allons utiliser Homebrew pour installer l'ensemble Terraform.

Tâche 2.3 : Créer des clés RSA locales pour l'authentification OCI

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

  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 de base est correct.

    /Users/iwhooge
    
  4. Exécutez la commande suivante pour créer un répertoire contenant les informations d'authentification 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é privée 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érer des clés SSH locales pour l'authentification d'hôte 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 pouvant être utilisée.

    iwhooge@iwhooge-mac .ssh % ls -l -a
    
  3. Notez que nous n'avons 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 secrète vide et cliquez sur ENTRER.

    Enter passphrase (empty for no passphrase):
    
  6. Laissez la phrase secrète vide et cliquez sur ENTRER.

    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 : Collecter les 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 de l'authentification d'API créé dans la tâche 2.5.

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

Tâche 3 : Créer des scripts et des fichiers Terraform

Nous avons terminé la préparation sur notre machine locale, notamment la configuration des 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. Créez maintenant le script Terraform.

Tout d'abord, nous devons vérifier que nous sommes abonnés aux régions sur lesquelles nous déployons nos grappes Kubernetes. Si nous procédons au déploiement vers une région non abonnée, une erreur d'authentification s'affiche et le déploiement échoue.

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

Tâche 4 : Exécuter des grappes Terraform et OKE avec les ressources nécessaires (VCN, sous-réseaux, passerelles DRG, connexions d'appairage distant, etc.)

Des scripts Terraform sont en place avec le bon paramètre. Maintenant, exécutez les scripts et créez notre environnement composé de trois grappes Kubernetes dans trois régions différentes.

L'image suivante illustre l'endroit où vous configurez la connexion SSH à l'hôte bastion et de l'hôte bastion à l'hôte de l'opérateur.

Image

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

Tâche 5 : Établir des connexions RPC

Établissez les connexions entre les divers attachements de connexion d'appairage distant. Examinons d'abord ces questions dans les différentes régions.

Collecter tous les OCID de connexion d'appairage distant

Répétez le processus pour toutes les connexions d'appairage distant 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 distant suivants :

Créer des pairs RPC

Configurez l'appairage sur C1 sur C2 et C3. Cela configure automatiquement l'appairage pour C1 du côté C2 et C3, et la configuration de l'appairage sur C2 sur C3 configure automatiquement l'appairage pour C2 du côté C3.

Configurez les pairs C1 (Amsterdam).

Configurez l'appairage C2 (San Jose).

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 la connexion d'appairage distant a été configurée correctement avec Network Visualizer.

  1. Cliquez sur le menu hamburger dans le coin supérieur gauche.
  2. Cliquez sur Réseau.
  3. Cliquez sur Visualiseur de réseau.

Image

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

Image

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

Image

  1. Assurez-vous d'être 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 l'hôte bastion et l'opérateur pour vérifier le fonctionnement de la connectivité

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

  1. Exécutez la commande suivante (qui a été fournie après l'exécution de la commande terraform plan).

    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 grappe Kubernetes (c1, c2 et c3) et extraire le statut des noeuds de travail.

    [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 toutes les grappes Kubernetes déployées à 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 grappes OKE à l'aide de Terraform

Nous avons utilisé Terraform pour notre déploiement afin de pouvoir également utiliser Terraform pour supprimer le déploiement complet.

Confirmation

Autres ressources d'apprentissage

Explorez d'autres laboratoires sur la page docs.oracle.com/learn ou accédez à plus de contenu d'apprentissage gratuit sur le canal YouTube d'Oracle Learning. De plus, visitez education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

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