Nota

Utilizza Terraform per distribuire più cluster Kubernetes in diverse aree OCI utilizzando OKE e crea una rete mesh completa utilizzando RPC

Introduzione

In questa esercitazione verrà spiegato come creare più cluster Kubernetes utilizzando Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) e questi cluster verranno distribuiti in tre paesi diversi (regioni). Per accelerare la distribuzione e distribuire i cluster Kubernetes in modo coerente con la minor quantità di errori di configurazione, utilizzeremo Terraform e alcuni script bash personalizzati.

immagine

Abbiamo anche distribuito manualmente singoli cluster utilizzando il metodo di creazione rapida e il metodo di creazione personalizzata.

Questa esercitazione è un aggiornamento basato sulla presente documentazione: Distribuzione di più cluster Kubernetes su Oracle Cloud.

Obiettivi

Task 1: Determinare la topologia (Star vs Mesh)

Stiamo creando questi cluster Kubernetes per distribuire un'applicazione basata su container distribuita in tutte le aree. Per consentire la comunicazione tra questi cluster Kubernetes, dobbiamo avere una qualche forma di comunicazione di rete. Per ora, questo è fuori dalla portata di questo tutorial, ma dobbiamo prendere alcune decisioni architettoniche in anticipo. Una di queste decisioni è quella di determinare se vogliamo consentire la comunicazione diretta tra tutte le regioni o se vogliamo utilizzare una regione come hub per tutte le comunicazioni e le altre come un discorso.

Topologia a stella: la topologia a stella consente la comunicazione tra le aree utilizzando un'unica area hub. Quindi, se i cluster Kubernetes a San Jose vogliono comunicare con i cluster Kubernetes a Dubai, utilizzeranno Amsterdam come hub di transito.

immagine

Topologia mesh: la topologia mesh consente la comunicazione diretta da e verso tutte le aree (cluster Kubernetes). Quindi, se i cluster Kubernetes a San Jose vogliono comunicare con i cluster Kubernetes a Dubai, possono comunicare direttamente.

immagine

In questa esercitazione verrà creata una topologia mesh e la connettività verrà eseguita utilizzando DRG e RPC.

Task 2: preparare l'ambiente per l'autenticazione ed eseguire gli script Terraform

Prima di utilizzare Terraform, dobbiamo preparare il nostro ambiente. Per utilizzare Terraform, aprire un terminale. In questo tutorial, stiamo utilizzando l'applicazione terminale OS X.

immagine

  1. Eseguire il comando riportato di seguito per verificare che Terraform sia installato, aggiunto al percorso e la versione.

    Last login: Thu Apr  4 08:50:38 on ttys000
    iwhooge@iwhooge-mac ~ % terraform -v
    zsh: command not found: terraform
    iwhooge@iwhooge-mac ~ %
    
  2. Si può vedere che il comando non è stato trovato, questo significa che Terraform non è installato o che non è stato aggiunto alla variabile di percorso.

immagine

Come puoi vedere Terraform non è installato, quindi dobbiamo installarlo. Noterai che non solo sta installando Terraform, ma sono necessari più passi per distribuire l'applicazione Terraform e preparare l'ambiente per la nostra soluzione di scripting end-to-end completa per distribuire tre cluster Kubernetes in tre aree diverse.

L'immagine seguente fornisce indicazioni sulle attività necessarie da eseguire.

immagine

Task 2.1: Installa Homebrew

Terraform può essere installato con metodi diversi. In questa esercitazione verrà installato Terraform utilizzando Homebrew.

Homebrew è un gestore di pacchetti per MacOS (e Linux) che può essere utilizzato per installare le applicazioni e le loro dipendenze richieste sono come apt o yum.

Task 2.2: Usa Homebrew per installare Terraform

In questo task, verrà utilizzato Homebrew per installare il pacchetto Terraform.

Task 2.3: Creare chiavi RSA locali per l'autenticazione OCI

Per consentire l'autenticazione con OCI utilizzando una chiave API, è necessario generare una nuova chiave privata e pubblica solo a questo scopo.

  1. Eseguire il comando seguente per modificare la directory nella directory home.

    iwhooge@iwhooge-mac ~ % cd ~/
    
  2. Eseguire il comando seguente per verificare di trovarsi nella directory home.

    iwhooge@iwhooge-mac ~ % pwd
    
  3. Verificare che la directory home sia corretta.

    /Users/iwhooge
    
  4. Eseguire il comando seguente per creare una nuova directory che conterrà le informazioni da autenticare con OCI.

    iwhooge@iwhooge-mac ~ % mkdir .oci
    
  5. Eseguire il comando riportato di seguito per generare una chiave RSA privata.

    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. Eseguire il comando seguente per rendere leggibile il file delle chiavi private.

    iwhooge@iwhooge-mac ~ % chmod 600 ~/.oci/4-4-2023-rsa-key.pem
    
  7. Eseguire il comando riportato di seguito per generare una chiave RSA pubblica dalla chiave privata.

    iwhooge@iwhooge-mac ~ % openssl rsa -pubout -in ~/.oci/4-4-2023-rsa-key.pem -out ~/.oci/4-4-2023-rsa-key-public.pem
    
  8. Verificare che la scrittura della chiave sia stata completata.

    writing RSA key
    
  9. Eseguire il comando riportato di seguito per esaminare il contenuto della chiave RSA privata.

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key.pem
    
  10. Verificare il contenuto della chiave RSA privata.

    -----BEGIN RSA PRIVATE KEY-----
    MIIEpQIBAAKCAQEA52+LJ+gp3MAJGtXTeQ/dmqq6Xh1zufK0yurLt/0w/DuxqEsL
    RT7x+Znz6EOVLx34Ul27QnHk7bhXaDCuwInnaOTOiS97AnLuFM08tvFksglnJssA
    JsszfTzUMNf0w4wtuLsJ5oRaPbVUa01TIm6HdwKAloIKYSn6z8gcvfLLItkyvPRo
    XXX
    w3yip+Yxr1YN3LjpDbZk4WTagKWoVQzp5nrfZlyU7ToZcMpUn/fIUsI=
    -----END RSA PRIVATE KEY-----
    
  11. Eseguire il comando riportato di seguito per esaminare il contenuto della chiave RSA pubblica.

    iwhooge@iwhooge-mac ~ % cat ~/.oci/4-4-2023-rsa-key-public.pem
    
  12. Verificare il contenuto della chiave RSA pubblica.

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

immagine

Task 2.4: generazione di chiavi SSH locali per l'autenticazione host bastion

È inoltre necessario creare chiavi SSH locali per eseguire l'autenticazione con l'host Bastion. Questa è un'altra chiave che stiamo utilizzando per l'autenticazione con OCI Console (API).

  1. Eseguire il comando seguente per modificare la directory nella directory SSH.

    iwhooge@iwhooge-mac ~ % cd ~/.ssh/
    
  2. Eseguire il comando riportato di seguito per verificare di disporre di una chiave SSH pubblica e privata utilizzabile.

    iwhooge@iwhooge-mac .ssh % ls -l -a
    
  3. Non è disponibile alcuna coppia di chiavi SSH. In questa esercitazione verrà generata una nuova coppia di chiavi 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. Eseguire il comando seguente per generare una nuova coppia di chiavi 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. Lasciare vuota la passphrase e fare clic su ENTER.

    Enter passphrase (empty for no passphrase):
    
  6. Lasciare vuota la passphrase e fare clic su ENTER.

    Enter same passphrase again:
    
  7. Tenere presente che la nuova coppia di chiavi SSH viene salvata nelle posizioni fornite.

    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 %
    

immagine

Task 2.5: creare una chiave API nella console OCI e aggiungere la chiave pubblica all'account OCI

Task 2.6: raccogliere le informazioni necessarie per l'ambiente OCI

Dobbiamo raccogliere alcune informazioni per i nostri file Terraform per l'autenticazione OCI utilizzando l'API. La maggior parte delle informazioni è già fornita nel file di configurazione dell'autenticazione API creato nel task 2.5.

Questo è il compartimento in cui distribuire i cluster Kubernetes.

Task 3: Creare script e file Terraform

Abbiamo completato la preparazione sul nostro computer locale, tra cui l'impostazione di chiavi Terraform, RSA e SSH, la configurazione dell'ambiente OCI (API) e la raccolta di tutte le informazioni essenziali necessarie per autenticare Terraform con OCI. Creare ora lo script Terraform.

In primo luogo, dobbiamo verificare di aver effettuato la sottoscrizione alle aree in cui stiamo distribuendo i nostri cluster Kubernetes. Se la distribuzione viene eseguita in un'area non sottoscritta, si verificherà un errore di autenticazione e la distribuzione non riuscirà.

Per questo tutorial, stiamo utilizzando le seguenti tre aree per la distribuzione: Amsterdam, San Jose e Dubai.

Task 4: eseguire i cluster Terraform e OKE insieme alle risorse necessarie (VCN, subnet, DRG, RPC e così via)

Gli script Terraform sono disponibili con il parametro corretto. Ora esegui gli script e crea il nostro ambiente costituito da tre cluster Kubernetes in tre aree diverse.

L'immagine seguente illustra da dove si sta impostando la connessione SSH all'host bastion e dall'host bastion all'host operatore.

immagine

Ora, abbiamo implementato tre cluster Kubernetes nelle diverse aree. Dai un'occhiata alle risorse distribuite da un livello elevato in OCI Console.

Task 5: Stabilire connessioni RPC

Stabilire le connessioni tra i vari allegati RPC. Esaminiamo innanzitutto questi aspetti nelle diverse regioni.

Raccoglie tutti gli OCID RPC

Ripetere il processo per tutte le connessioni peering remote in tutte le aree di tutti i DRG e salvarle.

Ora sono stati raccolti i seguenti OCID di connessione peering remoto:

Crea peer RPC

Configurare il peering su C1 in C2 e C3. Questa operazione configurerà automaticamente il peering per C1 sul lato C2 e C3 e la configurazione del peering su C2 in C3 configurerà automaticamente il peering per C2 sul lato C3.

Configura C1 Peerings (Amsterdam).

Configurare il peering C2 (San Jose).

Task 6: utilizzare Network Visualizer per verificare le connessioni RPC

Eseguire un controllo aggiuntivo per verificare che l'RPC sia stato configurato correttamente con Network Visualizer.

  1. Fare clic sul menu hamburger nell'angolo superiore sinistro.
  2. Fare clic su Networking.
  3. Fare clic su Network Visualizer.

immagine

  1. Assicurati di essere connesso all'area Amsterdam.
  2. Si noti che la regione di Amsterdam è c1.
  3. Prendi nota dei collegamenti da Amsterdam a San Jose e Dubai.

immagine

  1. Assicurarsi di essere connessi all'area San Jose.
  2. Si noti che la regione di San Jose è c2.
  3. Prendi nota dei collegamenti da San Jose a Amsterdam e Dubai.

immagine

  1. Assicurarsi di essere connessi all'area Dubai.
  2. Si noti che la regione di Dubai è c3.
  3. Prendi nota dei collegamenti da Dubai a Amsterdam e San Jose.

immagine

Task 7: Utilizzare il bastion e l'operatore per controllare il funzionamento della connettività

Abbiamo creato i cluster Kubernetes (in tutte e tre le region diverse) e connesso le region utilizzando RPC. Ora possiamo utilizzare l'host operatore per verificare che l'operatore sia in grado di gestire i cluster Kubernetes.

  1. Eseguire il comando seguente (che è stato fornito dopo il completamento del comando 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. Eseguire il comando seguente che itererà utilizzando un loop per in ogni cluster Kubernetes (c1, c2 e c3) e recuperare lo stato dei nodi di lavoro.

    [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 ~]$
    

    Eseguire il comando seguente nel terminale dopo la connessione all'host operatore.

    for c in c1 c2 c3; do
      kubectx $c
      kubectl get nodes
    done
    
  3. Prendere nota dell'output di tutti i nodi per tutti i cluster Kubernetes distribuiti utilizzando lo script Terraform.

immagine

Eseguire il comando kubectl get all -n kube-system con il loop 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 ~]$

Task 8: eliminare i cluster OKE utilizzando Terraform

Abbiamo utilizzato Terraform per la nostra distribuzione in modo da poter utilizzare anche Terraform per eliminare la distribuzione completa.

Conferme

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti gratuiti sulla formazione su Oracle Learning YouTube channel. Inoltre, visita education.oracle.com/learning-explorer per diventare un Oracle Learning Explorer.

Per la documentazione del prodotto, visita l'Oracle Help Center.