Crea un cluster Kubernetes

Utilizza Terraform per impostare un cluster Kubernetes nel tuo account Oracle Cloud Infrastructure.

I task chiave includono come:

  • Copiare gli script esistenti dalle esercitazioni di Terraform.
  • Modificare gli script esistenti per riutilizzarli.
  • Scrivere nuovi script per un cluster Kubernetes.
Diagramma dei componenti necessari per creare un cluster Kubernetes con Terraform. Da un ambiente Linux locale, l'utente si connette a un account Oracle Cloud Infrastructure e crea un cluster. La creazione del cluster include la creazione di risorse di rete. Le risorse di rete includono una subnet regionale privata per i nodi di lavoro. Questi nodi sono nodi di calcolo. Inoltre, è stata creata una subnet regionale pubblica da utilizzare per i load balancer. In questo esempio, ogni subnet regionale si estende su tre domini di disponibilità: AD1, AD2 e AD3. La subnet pubblica è connessa a Internet con una freccia a due vie. La subnet privata dispone di due frecce unidirezionali in uscita, una su Internet e l'altra sulla rete dei servizi Oracle.

Per ulteriori informazioni, fare riferimento agli argomenti sotto riportati.

1. Raccogli informazioni necessarie

Raccogliere informazioni per le istanze di computazione nel pool di nodi.

Recupera forma nodo
Questa esercitazione utilizza VM.Standard2.1 per le istanze di computazione nel pool di nodi.
Salvare il file <node-shape> VM.Standard2.1 nel blocco note.
Per ulteriori informazioni sulla forma, andare a Forme standard.
Recupera ID immagine
  1. Nella barra di navigazione della console, individuare l'area.
  2. Passare a Note di rilascio immagine.
  3. Seleziona Oracle Linux 7.x.
  4. Seleziona l'ultima versione di Oracle Linux 7.x-<date>. Non selezionare le immagini con etichetta Gen2-GPU.
  5. Copiare l'OCID immagine per la propria area.
  6. Salvare il file <image-ocid> nel blocco note.
    Nota

    Assicurarsi di selezionare un OCID commerciale senza gov nel relativo OCID.

2. Copia script esistenti

Copia gli script creati in Imposta un'infrastruttura semplice con OCI Terraform. Quindi, rimuovere gli script e gli output correlati all'istanza di computazione. Nella sezione successiva, si dichiara un pool di nodi con istanze di computazione.

Copia gli script
  1. Nella directory $HOME creare una directory denominata tf-cluster e passare a tale directory.
    mkdir tf-cluster
    cd tf-cluster
  2. Copiare tutti i file che terminano con .tf dalla directory tf-simple-infrastructure.
    cp ../tf-simple-infrastructure/*.tf .
  3. Verificare di avere i seguenti file nella directory.
    ls
    availability-domains.tf
    compartment.tf
    compute.tf
    outputs.tf
    private-security-list.tf
    private-subnet.tf
    provider.tf
    public-security-list.tf
    public-subnet.tf
    vcn-module.tf
    Nota

    Non copiare i file di stato (terraform.tfstate o terraform.tfstate.backup). Questi file contengono lo stato delle risorse per la directory corrente. Dopo aver eseguito gli script in questa nuova directory, si ottiene un nuovo file di stato.
Rimuovi script non pertinenti
  1. Rimuovere il file compute.tf dalla directory tf-cluster.
    rm compute.tf
  2. Nel file outputs.tf rimuovere tutti gli output per l'istanza di computazione.
    
    
    # Outputs for compute instance
    
    output "public-ip-for-compute-instance" {
      value = oci_core_instance.ubuntu_instance.public_ip
    }
    output "instance-name" {
      value = oci_core_instance.ubuntu_instance.display_name
    }
    
    output "instance-OCID" {
      value = oci_core_instance.ubuntu_instance.id
    }
    
    output "instance-region" {
      value = oci_core_instance.ubuntu_instance.region
    }
    
    output "instance-shape" {
      value = oci_core_instance.ubuntu_instance.shape
    }
    
    output "instance-state" {
      value = oci_core_instance.ubuntu_instance.state
    }
    
    output "instance-OCPUs" {
      value = oci_core_instance.ubuntu_instance.shape_config[0].ocpus
    }
    
    output "instance-memory-in-GBs" {
      value = oci_core_instance.ubuntu_instance.shape_config[0].memory_in_gbs
    }
    
    output "time-created" {
      value = oci_core_instance.ubuntu_instance.time_created
    }

3. Crea script

Creare script per un cluster, un pool di nodi e per stampare gli output.

Dichiara un cluster
  1. Creare un file denominato cluster.tf.
  2. Aggiungere il codice seguente a cluster.tf.
    • Sostituire <your-cluster-name> con un nome a scelta. Esempio: tf-cluster.
    # Source from https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/containerengine_cluster
    
    resource "oci_containerengine_cluster" "oke-cluster" {
        # Required
        compartment_id = oci_identity_compartment.tf-compartment.id
        kubernetes_version = "v1.21.5"
        name = "<your-cluster-name>"
        vcn_id = module.vcn.vcn_id
    
        # Optional
        options {
            add_ons{
                is_kubernetes_dashboard_enabled = false
                is_tiller_enabled = false
            }
            kubernetes_network_config {
                pods_cidr = "10.244.0.0/16"
                services_cidr = "10.96.0.0/16"
            }
            service_lb_subnet_ids = [oci_core_subnet.vcn-public-subnet.id]
        }  
    }
  3. Salvare il file cluster.tf.
Spiegazione

In Riferimento argomento (oci_containerengine_cluster), trovare tutti gli argomenti richiesti:

  • compartment_id
  • kubernetes_version
  • nome
  • vcn_id
Per passare a questo URL

Per passare a Riferimento argomento (oci_containerengine_cluster):

  1. Vai a Oracle Cloud Infrastructure Provider.
  2. Nella casella Filtro in alto a sinistra, immettere container engine.

    Vengono restituiti i risultati sia per le origini dati che per le risorse.

  3. In Container Engine, andare a Risorse e selezionare oci_containerengine_cluster.
  4. Selezionare Riferimento argomento.

    Viene visualizzato il riferimento argomento.

Costruisce un blocco di risorse:

  • Dichiarare un blocco di risorse con la parola chiave: resource
  • Aggiungere un'etichetta per il tipo di risorsa: "oci_containerengine_cluster"
  • Aggiungere un'etichetta per un nome locale (a scelta):
    • L'etichetta può contenere lettere, cifre, caratteri di sottolineatura (_) e trattini (-). Il primo carattere non deve essere una cifra.
    • Esempio: "oke-cluster"
  • All'interno del blocco di codice, fornire un valore per gli argomenti richiesti:
    • compartment_id: puntare al compartimento dichiarato in compartment.tf: oci_identity_compartment.tf-compartment.id
    • kubernetes_version: questa esercitazione utilizza la versione v1.21.5. È possibile selezionare l'opzione Creazione rapida nella console per la versione più recente.
    • nome: assegnare un nome a scelta.
    • vcn_id: puntare al compartimento dichiarato in vcn-module.tf: module.vcn.vcn_id

    Un argomento obbligatorio non ha un valore predefinito.

  • Fornire i valori per i seguenti argomenti facoltativi per sostituire i relativi valori predefiniti.
    • add_ons: assegnare true o false per i seguenti argomenti:
      • is_kubernetes_dashboard_enabled
      • is_tiller_enabled
    • kubernetes_network_config: assegnare un blocco CIDR come stringa per i seguenti argomenti:
      • pods_cidr
      • services_cidr
      Nota

      Il blocco CIDR per i pod non deve sovrapporsi ai blocchi CIDR del nodo di lavoro e della subnet del load balancer.

      Il blocco CIDR per il servizio Kubernetes non deve sovrapporsi al blocco CIDR della VCN.

      Il codice di esempio in questa esercitazione utilizza gli stessi blocchi CIDR dell'opzione Creazione rapida nella console.

      Per ulteriori informazioni, consulta Blocchi CIDR e motore Kubernetes (OKE).

    • service_lb_subnet_ids: assegnare la subnet pubblica dichiarata in public-subnet.tf
      Nota

      L'argomento service_lb_subnet_ids accetta una lista di ID di subnet:
      • Anche se si dispone di una sottorete, utilizzare le parentesi quadre per indicare un elenco.
      • Esempio: [oci_core_subnet.vcn-public-subnet.id]
Dichiarare un pool di nodi
  1. Creare un file denominato node-pool.tf.
  2. Aggiungere il codice seguente a node-pool.tf.
    • Sostituire i seguenti campi con le informazioni raccolte nella prima sezione:
      • <node-shape> con VM.Standard2.1
      • <image-ocid>
    • Sostituire il campo seguente con il nome scelto durante la dichiarazione di un cluster:
      • <your-cluster-name>
    # Source from https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/containerengine_node_pool
    
    resource "oci_containerengine_node_pool" "oke-node-pool" {
        # Required
        cluster_id = oci_containerengine_cluster.oke-cluster.id
        compartment_id = oci_identity_compartment.tf-compartment.id
        kubernetes_version = "v1.21.5"
        name = "pool1"
        node_config_details{
            placement_configs{
                availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name
                subnet_id = oci_core_subnet.vcn-private-subnet.id
            } 
            placement_configs{
                availability_domain = data.oci_identity_availability_domains.ads.availability_domains[1].name
                subnet_id = oci_core_subnet.vcn-private-subnet.id
            }
             placement_configs{
                availability_domain = data.oci_identity_availability_domains.ads.availability_domains[2].name
                subnet_id = oci_core_subnet.vcn-private-subnet.id
            }
            size = 3
        }
        node_shape = "<node-shape>"
    
        # Using image Oracle-Linux-7.x-<date>
        # Find image OCID for your region from https://docs.oracle.com/iaas/images/ 
        node_source_details {
             image_id = "<image-ocid>"
             source_type = "image"
        }
     
        # Optional
        initial_node_labels {
            key = "name"
            value = "<your-cluster-name>"
        }    
    }
  3. Salvare il file node-pool.tf.
Spiegazione

In Riferimento all'allarme (oci_containerengine_node_pool), trovare tutti gli argomenti richiesti:

  • cluster_id
  • compartment_id
  • kubernetes_version
  • nome
  • node_config_details
    • placement_configs
      • availability_domain
      • subnet_id
  • node_shape
  • node_source_details
    • image_id
    • source_type
Per passare a questo URL

Per passare a Riferimento allarme (oci_containerengine_node_pool):

  1. Vai a Oracle Cloud Infrastructure Provider.
  2. Nella casella Filtro in alto a sinistra, immettere container engine.

    Vengono restituiti i risultati sia per le origini dati che per le risorse.

  3. In Container Engine, andare a Risorse e selezionare oci_containerengine_node_pool.
  4. Selezionare Riferimento argomento.

    Viene visualizzato il riferimento argomento.

Costruisce un blocco di risorse:

  • Dichiarare un blocco di risorse con la parola chiave: resource
  • Aggiungere un'etichetta per il tipo di risorsa:
    "oci_containerengine_node_pool"
  • Aggiungere un'etichetta per un nome locale (a scelta):
    • L'etichetta può contenere lettere, cifre, caratteri di sottolineatura (_) e trattini (-). Il primo carattere non deve essere una cifra.
    • Esempio:"oke-node-pool"
  • All'interno del blocco di codice, fornire un valore per gli argomenti obbligatori:
    • cluster_id: puntare al cluster dichiarato in cluster.tf:
      oci_containerengine_cluster.oke-cluster.id
    • compartment_id Puntare al compartimento dichiarato in compartment.tf:
      oci_identity_compartment.tf-compartment.id
    • kubernetes_version: questa esercitazione utilizza la stessa versione della Creazione guidata cluster della console.
    • nome: assegnare un nome a scelta. La Creazione guidata cluster della console utilizza il nome pool1.
    • node_shape: immettere le informazioni raccolte nella prima sezione.
    • node_source_details:
      • image_id: immettere le informazioni raccolte nella prima sezione.
      • source_type: impostare su "image".
  • Fornire i valori per i seguenti argomenti facoltativi per eseguire l'override dei relativi valori predefiniti.
    • initial_node_labels: assegnare coppie chiave/valore per i nodi.
      • chiave: assegnare una chiave desiderata. L'opzione Creazione rapida della console crea la chiave "name".
      • valore: assegnare un valore per la chiave. L'opzione Creazione rapida della console assegna "<your-cluster-name>" alla chiave "name".
Aggiungere output

In questa sezione vengono dichiarati gli output per il cluster e il pool di nodi.

  1. Aggiungere il codice seguente a outputs.tf.
    # Outputs for k8s cluster
    
    output "cluster-name" {
      value = oci_containerengine_cluster.oke-cluster.name
    }
    output "cluster-OCID" {
      value = oci_containerengine_cluster.oke-cluster.id
    }
    output "cluster-kubernetes-version" {
      value = oci_containerengine_cluster.oke-cluster.kubernetes_version
    }
    output "cluster-state" {
      value = oci_containerengine_cluster.oke-cluster.state
    }
    
    # Outputs for k8s node pool
    
    output "node-pool-name" {
      value = oci_containerengine_node_pool.oke-node-pool.name
    }
    output "node-pool-OCID" {
      value = oci_containerengine_node_pool.oke-node-pool.id
    }
    output "node-pool-kubernetes-version" {
      value = oci_containerengine_node_pool.oke-node-pool.kubernetes_version
    }
    output "node-size" {
      value = oci_containerengine_node_pool.oke-node-pool.node_config_details[0].size
    }
    output "node-shape" {
      value = oci_containerengine_node_pool.oke-node-pool.node_shape
    }
  2. Salvare il file outputs.tf.
Spiegazione
Output per elementi elenco
  • Di solito gli attributi dell'elenco sono plurali (end in s).
  • Esempio di attributo elenco per il pool di nodi:
    • node_config_details
  • Per eseguire l'output di tutti gli attributi in un elenco, utilizzare l'attributo list da solo, senza parentesi.
  • Ad esempio:
    output "node-configuration-details"{
      value = oci_containerengine_node_pool.oke-node-pool.node_config_details
    }

    Output di esempio:

    node-configuration-details = [
      {
        "placement_configs" = [
          {
            "availability_domain" = "QnsC:US-ASHBURN-AD-1"
            "subnet_id" = "ocid1.subnet.xxx"
          },
          {
            "availability_domain" = "QnsC:US-ASHBURN-AD-2"
            "subnet_id" = "ocid1.subnet.xxx"
          },
          {
            "availability_domain" = "QnsC:US-ASHBURN-AD-3"
            "subnet_id" = "ocid1.subnet.xxx"
          },
        ]
        "size" = 3
      },
    ]
  • Per eseguire l'output o chiamare un elemento da un elenco:
    • Utilizzare il formato riportato di seguito:

      <list-attribute-name>[index].<attribute-from-list>

    • Sostituire [index] con:
      • [0] per il primo elemento.
      • [1] per il secondo elemento.
      • ...
      • [n] per la voce (n+1)th.
  • Ad esempio:

    Valore per l'attributo size:

    output "node-size" {
      value = oci_containerengine_node_pool.oke-node-pool.node_config_details[0].size
    }

4. Esegui script

Esegui i tuoi script Terraform per creare un compartimento, una rete cloud virtuale, un cluster Kubernetes e un pool di nodi.

Inizializza
  1. Inizializzare una directory di lavoro nella directory tf-cluster.
    terraform init

    Output di esempio:

    Initializing the backend...
    
    Initializing provider plugins...
    - Finding hashicorp/oci versions matching ">= 4.41.0"...
    - Installing hashicorp/oci v4.59.0...
    - Installed hashicorp/oci v4.59.0 (signed by HashiCorp)
    
    Terraform has been successfully initialized!
  2. Controllare il contenuto della directory tf-cluster.
    ls -a
    Nota

    Risoluzione dei problemi:
    • Dopo aver eseguito terraform init
    • messaggio di errore: impossibile eseguire una query sui package di provider disponibili:
      • Se si utilizza una VPN, controllare le impostazioni proxy.
Ora si dispone di una cartella denominata .terraform che include i plugin per il provider oci.
Piano
  1. Creare un piano di esecuzione:
    terraform plan
  2. Rivedere le modifiche che Terraform prevede di apportare all'account.

    Output di esempio:

    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      + create
    
    Terraform will perform the following actions:
    
    Plan: 14 to add, 0 to change, 0 to destroy.
Applicazione

Eseguire gli script Terraform:

terraform apply

Quando viene richiesta la conferma, immettere yes per creare le risorse.

La creazione del cluster potrebbe richiedere almeno 15 minuti. Dopo che Terraform ha creato le risorse, rivedere l'output nel terminale.

Apply complete! Resources: 14 added, 0 changed, 0 destroyed.

Outputs:
...
cluster-OCID = ocid1.cluster.xxx
cluster-kubernetes-version = "v1.21.5"
cluster-name = <your-cluster-name>
cluster-state = ACTIVE
...
node-pool-OCID = ocid1.nodepool.xxx
node-pool-kubernetes-version = "v1.21.5"
node-pool-name = "pool1"
node-shape = "VM.Standard2.1"
node-size = 3
...
Risoluzione dei problemi
  • 401 errori - (Errore del servizio:NotAuthenticated):
    • Valore non corretto per una delle seguenti opzioni:
      • OCID tenancy
      • OCID utente
      • impronta
      • Chiave privata RSA (il percorso o la chiave)
  • host non trovato:
    • Valore errato per i seguenti elementi:
      • identificativo area

Riferimenti: