Creación de un cluster de Kubernetes

Utilice Terraform para configurar un cluster de Kubernetes en su cuenta de Oracle Cloud Infrastructure.

Las tareas clave incluyen cómo:

  • Copie los scripts existentes de los tutoriales de Terraform.
  • Editar los scripts existentes para volver a utilizarlos.
  • Escribir nuevos scripts para un cluster de Kubernetes.
Diagrama de los componentes necesarios para crear un cluster de Kubernetes con Terraform. Desde un entorno de Linux local, el usuario se conecta a una cuenta de Oracle Cloud Infrastructure y crea un cluster. La creación del cluster incluye la creación de recursos de red. Los recursos de red incluyen una subred regional privada para los nodos de trabajo. Estos nodos son nodos de recursos informáticos. También hay una subred regional pública creada para utilizarla en los equilibradores de carga. En este ejemplo, cada subred regional abarca tres dominios de disponibilidad: AD1, AD2 y AD3. La subred pública está conectada a Internet con una flecha de dos direcciones. La subred privada tiene dos flechas de salida unidireccionales, una a Internet y la otra a la red de servicios de Oracle.

Para obtener más información, consulte:

1. Recopilación de la información necesaria

Recopile la información para las instancias informáticas en el pool de nodos.

Obtención de la unidad Node
En este tutorial se utiliza VM.Standard2.1 para las instancias informáticas del pool de nodos.
Guarde <node-shape> VM.Standard2.1 en el bloc de notas.
Para obtener más información sobre la unidad, vaya a Unidades estándar.
Obtención del ID de imagen
  1. En la barra de navegación de la consola, busque su región.
  2. Vaya a Notas de la versión de imagen.
  3. Seleccione Oracle Linux 7.x.
  4. Seleccione el último Oracle Linux 7.x-<fecha>. No seleccione ninguna imagen con la etiqueta Gen2-GPU.
  5. Copie el OCID de imagen de su región.
  6. Guarde <image-ocid> en el bloc de notas.
    Nota

    Asegúrese de seleccionar un OCID comercial sin gov en su OCID.

2. Copia de los scripts existentes

Copie los scripts creados en Configuración de una infraestructura simple con OCI Terraform. A continuación, elimine los scripts y las salidas relacionadas con la instancia informática. En la siguiente sección, se declara un pool de nodos con instancias informáticas.

Copia de los scripts
  1. En el directorio $HOME, cree un directorio denominado tf-cluster y cambie a ese directorio.
    mkdir tf-cluster
    cd tf-cluster
  2. Copie todos los archivos que terminen en .tf del directorio tf-simple-infrastructure.
    cp ../tf-simple-infrastructure/*.tf .
  3. Confirme que tiene los siguientes archivos en el directorio.
    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

    No copie los archivos de estado (terraform.tfstate o terraform.tfstate.backup). Estos archivos contienen el estado de los recursos para su directorio actual. Después de ejecutar los scripts en este nuevo directorio, obtendrá un nuevo archivo de estado.
Eliminación de los scripts irrelevantes
  1. Elimine el archivo compute.tf del directorio tf-cluster.
    rm compute.tf
  2. En el archivo outputs.tf, elimine todas las salidas de la instancia informática.
    
    
    # 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. Creación de scripts

Cree scripts para un cluster, un pool de nodos y para imprimir salidas.

Declaración de un cluster
  1. Cree un archivo llamado cluster.tf.
  2. Agregue el siguiente código a cluster.tf.
    • Sustituya <your-cluster-name> por el nombre que desee. Ejemplo: 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. Guarde el archivo cluster.tf.
Explicación

En Referencia de argumento (oci_containerengine_cluster), busque todos los argumentos necesarios:

  • compartment_id
  • kubernetes_version
  • nombre
  • vcn_id
Para navegar a esta URL

Para navegar a Referencia de argumento (oci_containerengine_cluster):

  1. Vaya a Proveedor de Oracle Cloud Infrastructure.
  2. En el cuadro Filtro de la parte superior izquierda, introduzca container engine.

    Se devuelven resultados para los orígenes de datos y los recursos.

  3. En Container Engine, vaya a Recursos y seleccione oci_containerengine_cluster.
  4. Seleccione Referencia de argumento.

    Se abre Referencia de argumento.

Cree un bloque de recursos:

  • Declare un bloque de recursos con la palabra clave: resource
  • Agregue una etiqueta para el recurso type: "oci_containerengine_cluster"
  • Agregue una etiqueta para un nombre local (su elección):
    • La etiqueta puede contener letras, dígitos, caracteres de subrayado (_) y guiones (-). El primer carácter no debe ser un dígito.
    • Ejemplo: "oke-cluster"
  • Dentro del bloque de código, proporcione un valor para los argumentos necesarios:
    • compartment_id: apunta al compartimento declarado en compartment.tf: oci_identity_compartment.tf-compartment.id
    • kubernetes_version: en este tutorial se utiliza la versión v1.21.5. Puede activar la opción Creación rápida en la consola para la última versión.
    • name: asigne un nombre de su elección.
    • vcn_id: apunte al compartimento declarado en vcn-module.tf: module.vcn.vcn_id

    Un argumento necesario no tiene un valor por defecto.

  • Proporcione valores para los siguientes argumentos opcionales para sustituir sus valores por defecto.
    • add_ons: asigne true o false para los siguientes argumentos:
      • is_kubernetes_dashboard_enabled
      • is_tiller_enabled
    • kubernetes_network_config: asigne un bloque CIDR como una cadena para los siguientes argumentos:
      • pods_cidr
      • services_cidr
      Nota

      El bloque CIDR para los pods no se debe superponer con el nodo de trabajo y los bloques CIDR de la subred del equilibrador de carga.

      El bloque CIDR para el servicio de Kubernetes no se debe solapar con el bloque CIDR de la VCN.

      El código de ejemplo de este tutorial utiliza los mismos bloques de CIDR que la opción Creación rápida en la consola.

      Para obtener más información, consulte Bloques de CIDR y Kubernetes Engine (OKE).

    • service_lb_subnet_ids: asigne la subred pública declarada en public-subnet.tf
      Nota

      El argumento service_lb_subnet_ids acepta una lista de ID de subred:
      • Incluso si tiene una subred, utilice corchetes para indicar una lista.
      • Ejemplo: [oci_core_subnet.vcn-public-subnet.id]
Declaración de un pool de nodos
  1. Cree un archivo denominado node-pool.tf.
  2. Agregue el siguiente código a node-pool.tf.
    • Sustituya los siguientes campos por la información recopilada en la sección uno:
      • <node-shape> con VM.Standard2.1
      • <image-ocid>
    • Sustituya el siguiente campo por el nombre que haya elegido al declarar 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. Guarde el archivo node-pool.tf.
Explicación

En Referencia de alarma (oci_containerengine_node_pool), busque todos los argumentos necesarios:

  • cluster_id
  • compartment_id
  • kubernetes_version
  • nombre
  • node_config_details
    • placement_configs
      • availability_domain
      • subnet_id
  • node_shape
  • node_source_details
    • image_id
    • source_type
Para navegar a esta URL

Para navegar a Referencia de alarma (oci_containerengine_node_pool):

  1. Vaya a Proveedor de Oracle Cloud Infrastructure.
  2. En el cuadro Filtro de la parte superior izquierda, introduzca container engine.

    Se devuelven resultados para los orígenes de datos y los recursos.

  3. En Container Engine, vaya a Recursos y seleccione oci_containerengine_node_pool.
  4. Seleccione Referencia de argumento.

    Se abre Referencia de argumento.

Cree un bloque de recursos:

  • Declare un bloque de recursos con la palabra clave: resource
  • Agregue una etiqueta para el valor type del recurso:
    "oci_containerengine_node_pool"
  • Agregue una etiqueta para un nombre local (su elección):
    • La etiqueta puede contener letras, dígitos, caracteres de subrayado (_) y guiones (-). El primer carácter no debe ser un dígito.
    • Ejemplo:"oke-node-pool"
  • Dentro del bloque de código, proporcione un valor para los argumentos necesarios:
    • cluster_id: apunte al cluster declarado en cluster.tf:
      oci_containerengine_cluster.oke-cluster.id
    • compartment_id apunte al compartimento declarado en compartment.tf:
      oci_identity_compartment.tf-compartment.id
    • kubernetes_version: en este tutorial se utiliza la misma versión que en el asistente de Crear cluster de la consola.
    • name: asigne un nombre de su elección. El asistente de Crear cluster de la consola utiliza el nombre pool1.
    • node_shape: introduzca la información recopilada en la sección uno.
    • node_source_details:
      • image_id: introduzca la información recopilada en la sección uno.
      • source_type: defina en "image".
  • Proporcione valores para los siguientes argumentos opcionales para sustituir sus valores por defecto.
    • initial_node_labels: asigne pares clave/valor para los nodos.
      • key: asigne una clave de su elección. Con la opción Creación rápida de la consola se crea la clave "name".
      • value: asigne un valor para la clave. Con la opción Creación rápida de la consola se asigna "<your-cluster-name>" a la clave "name".
Adición de salidas

En esta sección, declarará las salidas para el cluster y el pool de nodos.

  1. Agregue el siguiente código 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. Guarde el archivo outputs.tf.
Explicación
Salidas de los elementos de lista
  • Normalmente, los atributos list están en plural (acaban en s).
  • Ejemplo de atributo list para el pool de nodos:
    • node_config_details
  • Para generar la salida de todos los atributos de una lista, utilice el atributo list solo, sin corchetes.
  • Por ejemplo:
    output "node-configuration-details"{
      value = oci_containerengine_node_pool.oke-node-pool.node_config_details
    }

    Salida de ejemplo:

    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
      },
    ]
  • Para generar o llamar a un elemento de una lista:
    • Utilice el siguiente formato:

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

    • Sustituya [index] por:
      • [0] para el primer elemento.
      • [1] para el segundo elemento.
      • ...
      • [n] para el elemento (n+1)th .
  • Por ejemplo:

    Valor para el atributo size:

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

4. Ejecución de scripts

Ejecute los scripts de Terraform para crear un compartimento, una red virtual en la nube, un cluster de Kubernetes y un pool de nodos.

Inicialización
  1. Inicialice un directorio de trabajo en el directorio tf-cluster.
    terraform init

    Salida de ejemplo:

    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. Compruebe el contenido del directorio tf-cluster.
    ls -a
    Nota

    Solución de problemas:
    • Después de ejecutar terraform init
    • mensaje de error: Fallo al consultar los paquetes de proveedores disponibles:
      • Si está en una VPN, compruebe la configuración del proxy.
Ahora tiene una carpeta denominada .terraform que incluye los plugins para el proveedor oci.
Planificación
  1. Cree un plan de ejecución:
    terraform plan
  2. Revise los cambios que Terraform tiene previsto realizar en su cuenta.

    Salida de ejemplo:

    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.
Aplicar

Ejecute los scripts de Terraform:

terraform apply

Cuando se le solicite confirmación, introduzca yes para crear los recursos.

El cluster puede tardar 15 minutos o más en crearse. Después de que Terraform cree los recursos, revise la salida en el terminal.

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
...
Solución de Problemas
  • Errores 401 - (Error de servicio: No autenticado):
    • Tiene un valor incorrecto para uno de los siguientes:
      • OCID de arrendamiento
      • OCID de usuario
      • huella
      • Clave privada de RSA (la ruta o la clave)
  • no existe dicho host:
    • Tiene un valor incorrecto para lo siguiente:
      • identificador de región

Referencias: