Inicio rápido: Creación de un clúster de Kubernetes con Azure Kubernetes Service mediante Terraform

Artículo probado con las siguientes versiones del proveedor de AzureRM y Terraform:

Terraform habilita la definición, vista previa e implementación de la infraestructura en la nube. Con Terraform, se crean archivos de configuración mediante la sintaxis de HCL. La sintaxis de HCL permite especificar el proveedor de la nube, como Azure, y los elementos que componen la infraestructura de la nube. Después de crear los archivos de configuración, se crea un plan de ejecución que permite obtener una vista previa de los cambios de infraestructura antes de implementarlos. Una vez que compruebe los cambios, aplique el plan de ejecución para implementar la infraestructura.

Azure Kubernetes Service (AKS) administra el entorno hospedado de Kubernetes. Azure Kubernetes Service permite implementar y administrar aplicaciones en contenedores sin necesidad de tener conocimientos de orquestación de contenedores. También permite realizar muchas operaciones de mantenimiento comunes sin desconectar la aplicación. Entre estas operaciones se incluyen el aprovisionamiento, la actualización y el escalado de recursos a petición.

En este artículo aprenderá a:

  • Uso de HCL (HashiCorp Language) para definir un clúster de Kubernetes
  • Uso de Terraform y AKS para crear un clúster de Kubernetes
  • Utilice la herramienta kubectl para probar la disponibilidad de un clúster de Kubernetes

Nota:

El código de ejemplo de este artículo se encuentra en el repositorio de GitHub de Microsoft Terraform.

Prerrequisitos

  • Suscripción de Azure: Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Implementación del código de Terraform

  1. Cree un directorio en el que probar el código de ejemplo de Terraform y conviértalo en el directorio actual.

  2. Cree un archivo denominado providers.tf e inserte el siguiente código:

    terraform {
      required_version = ">=1.0"
    
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Cree un archivo denominado main.tf e inserte el siguiente código:

    # Generate random resource group name
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    resource "random_id" "log_analytics_workspace_name_suffix" {
      byte_length = 8
    }
    
    resource "azurerm_log_analytics_workspace" "test" {
      location            = var.log_analytics_workspace_location
      # The WorkSpace name has to be unique across the whole of azure;
      # not just the current subscription/tenant.
      name                = "${var.log_analytics_workspace_name}-${random_id.log_analytics_workspace_name_suffix.dec}"
      resource_group_name = azurerm_resource_group.rg.name
      sku                 = var.log_analytics_workspace_sku
    }
    
    resource "azurerm_log_analytics_solution" "test" {
      location              = azurerm_log_analytics_workspace.test.location
      resource_group_name   = azurerm_resource_group.rg.name
      solution_name         = "ContainerInsights"
      workspace_name        = azurerm_log_analytics_workspace.test.name
      workspace_resource_id = azurerm_log_analytics_workspace.test.id
    
      plan {
        product   = "OMSGallery/ContainerInsights"
        publisher = "Microsoft"
      }
    }
    
    resource "azurerm_kubernetes_cluster" "k8s" {
      location            = azurerm_resource_group.rg.location
      name                = var.cluster_name
      resource_group_name = azurerm_resource_group.rg.name
      dns_prefix          = var.dns_prefix
      tags                = {
        Environment = "Development"
      }
    
      default_node_pool {
        name       = "agentpool"
        vm_size    = "Standard_D2_v2"
        node_count = var.agent_count
      }
      linux_profile {
        admin_username = "ubuntu"
    
        ssh_key {
          key_data = file(var.ssh_public_key)
        }
      }
      network_profile {
        network_plugin    = "kubenet"
        load_balancer_sku = "standard"
      }
      service_principal {
        client_id     = var.aks_service_principal_app_id
        client_secret = var.aks_service_principal_client_secret
      }
    }
    
  4. Cree un archivo denominado variables.tf e inserte el siguiente código:

    variable "agent_count" {
      default = 3
    }
    
    # The following two variable declarations are placeholder references.
    # Set the values for these variable in terraform.tfvars
    variable "aks_service_principal_app_id" {
      default = ""
    }
    
    variable "aks_service_principal_client_secret" {
      default = ""
    }
    
    variable "cluster_name" {
      default = "k8stest"
    }
    
    variable "dns_prefix" {
      default = "k8stest"
    }
    
    # Refer to https://azure.microsoft.com/global-infrastructure/services/?products=monitor for available Log Analytics regions.
    variable "log_analytics_workspace_location" {
      default = "eastus"
    }
    
    variable "log_analytics_workspace_name" {
      default = "testLogAnalyticsWorkspaceName"
    }
    
    # Refer to https://azure.microsoft.com/pricing/details/monitor/ for Log Analytics pricing
    variable "log_analytics_workspace_sku" {
      default = "PerGB2018"
    }
    
    variable "resource_group_location" {
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    
    variable "ssh_public_key" {
      default = "~/.ssh/id_rsa.pub"
    }
    
  5. Cree un archivo denominado outputs.tf e inserte el siguiente código:

    output "client_certificate" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].client_certificate
      sensitive = true
    }
    
    output "client_key" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].client_key
      sensitive = true
    }
    
    output "cluster_ca_certificate" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].cluster_ca_certificate
      sensitive = true
    }
    
    output "cluster_password" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].password
      sensitive = true
    }
    
    output "cluster_username" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].username
      sensitive = true
    }
    
    output "host" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].host
      sensitive = true
    }
    
    output "kube_config" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config_raw
      sensitive = true
    }
    
    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
  6. Cree un archivo llamado terraform.tfvars e inserte el siguiente código.

    aks_service_principal_app_id = "<service_principal_app_id>"
    aks_service_principal_client_secret = "<service_principal_password>"
    

Inicialización de Terraform

Para inicializar la implementación de Terraform, ejecute terraform init. Este comando descarga los módulos de Azure necesarios para administrar los recursos de Azure.

terraform init

Creación de un plan de ejecución de Terraform

Ejecute terraform plan para crear un plan de ejecución.

terraform plan -out main.tfplan

Puntos clave:

  • El comando terraform plan crea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales.
  • El parámetro -out opcional permite especificar un archivo de salida para el plan. El uso del parámetro -out garantiza que el plan que ha revisado es exactamente lo que se aplica.
  • Para más información acerca de la seguridad y conservar los planes de ejecución, consulte la sección Advertencia de seguridad.

Aplicación de un plan de ejecución de Terraform

Ejecute terraform apply para aplicar el plan de ejecución a su infraestructura en la nube.

terraform apply main.tfplan

Puntos clave:

  • El comando terraform apply anterior da por hecho que ejecutó anteriormente terraform plan -out main.tfplan.
  • Si especificó un nombre de archivo diferente para el parámetro -out, use ese mismo nombre de archivo en la llamada a terraform apply.
  • Si no usó el -out parámetro , llame a terraform apply sin parámetros.

Verificación de los resultados

  1. Obtenga el nombre del grupo de recursos.

    echo "$(terraform output resource_group_name)"
    
  2. Vaya a Azure Portal.

  3. En Servicios de Azure, seleccione Grupos de recursos y busque el nuevo grupo de recursos para ver los siguientes recursos creados en esta demostración:

    • Solución: De forma predeterminada, la demostración denomina esta solución ContainerInsights. El portal mostrará el nombre del área de trabajo de la solución entre paréntesis.
    • Servicio Kubernetes: De forma predeterminada, la demostración denomina este servicio k8stest. (Un clúster de Kubernetes administrado también se conoce como AKS/Azure Kubernetes Service).
    • Área de trabajo de Log Analytics: De forma predeterminada, la demostración asigna a este área de trabajo un prefijo testLogAnalyticsWorkspaceName, seguido de un número aleatorio.
  4. Obtenga la configuración de Kubernetes desde el estado de Terraform y almacénela en un archivo que kubectl puede leer.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  5. Compruebe que el comando anterior no ha agregado un carácter EOT ASCII.

    cat ./azurek8s
    

    Puntos clave:

    • Si ve << EOT al principio y EOT al final, quite estos caracteres del archivo. De lo contrario, podría recibir el siguiente mensaje de error: error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
  6. Establezca una variable de entorno para que kubectl seleccione la configuración correcta.

    export KUBECONFIG=./azurek8s
    
  7. Compruebe el mantenimiento del clúster.

    kubectl get nodes
    

    La herramienta kubectl le permite comprobar el mantenimiento de su clúster de Kubernetes

Puntos clave:

  • Cuando se creó el clúster de AKS, se habilitó la supervisión para capturar métricas de mantenimiento para los nodos de clúster y los pods. Estas métricas de mantenimiento están disponibles en Azure Portal. Para obtener más información sobre la supervisión del estado de los contenedores, consulte Monitor Azure Kubernetes Service health (Supervisión del estado de Azure Kubernetes Service).
  • Se generaron varios valores de clave al aplicar el plan de ejecución de Terraform. Por ejemplo, se genera la dirección de host, el nombre de usuario del clúster de AKS y la contraseña del clúster de AKS.
  • Para ver todos los valores de salida, ejecute terraform output.
  • Para ver un valor de salida específico, ejecute echo "$(terraform output <output_value_name>)".

Limpieza de recursos

Eliminación de recursos de AKS

Cuando ya no necesite los recursos creados a través de Terraform, realice los pasos siguientes:

  1. Ejecute el comando terraform plan y especifique la marca destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Puntos clave:

    • El comando terraform plan crea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales.
    • El parámetro -out opcional permite especificar un archivo de salida para el plan. El uso del parámetro -out garantiza que el plan que ha revisado es exactamente lo que se aplica.
    • Para más información acerca de la seguridad y conservar los planes de ejecución, consulte la sección Advertencia de seguridad.
  2. Ejecute terraform apply para aplicar el plan de ejecución.

    terraform apply main.destroy.tfplan
    

Eliminación de la entidad de servicio

Precaución

Elimine la entidad de servicio que usó en esta demostración solo si no la usa para nada más.

  1. Ejecute az ad sp list para obtener el identificador de objeto de la entidad de servicio.

    az ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":id}" --output table
    
    
  2. Ejecute az ad sp delete para eliminar la entidad de servicio.

    az ad sp delete --id <service_principal_object_id>
    

Solución de problemas de Terraform en Azure

Solución de problemas comunes al usar Terraform en Azure

Pasos siguientes