Creación de un clúster de Kubernetes con Azure Kubernetes Service y TerraformCreate a Kubernetes cluster with Azure Kubernetes Service and Terraform

Azure Kubernetes Service (AKS) permite administrar el entorno hospedado de Kubernetes, lo que hace que sea fácil y rápido implementar y administrar aplicaciones en contenedores sin necesidad de tener conocimientos de orquestación de contenedores.Azure Kubernetes Service (AKS) manages your hosted Kubernetes environment, making it quick and easy to deploy and manage containerized applications without container orchestration expertise. También permite eliminar la carga de las operaciones en curso y las de mantenimiento mediante el aprovisionamiento, actualización y escalado de los recursos a petición, sin tener que desconectar las aplicaciones.It also eliminates the burden of ongoing operations and maintenance by provisioning, upgrading, and scaling resources on demand, without taking your applications offline.

En este tutorial, aprenderá a realizar las tareas siguientes para crear un clúster de Kubernetes mediante Terraform y AKS:In this tutorial, you learn how to perform the following tasks in creating a Kubernetes cluster using Terraform and AKS:

  • Uso de HCL (HashiCorp Language) para definir un clúster de KubernetesUse HCL (HashiCorp Language) to define a Kubernetes cluster
  • Uso de Terraform y AKS para crear un clúster de KubernetesUse Terraform and AKS to create a Kubernetes cluster
  • Utilice la herramienta kubectl para probar la disponibilidad de un clúster de KubernetesUse the kubectl tool to test the availability of a Kubernetes cluster

Requisitos previosPrerequisites

Creación de la estructura de directoriosCreate the directory structure

El primer paso es crear el directorio que contenga los archivos de configuración de Terraform para el ejercicio.The first step is to create the directory that holds your Terraform configuration files for the exercise.

  1. Vaya a Azure Portal.Browse to the Azure portal.

  2. Abra Azure Cloud Shell.Open Azure Cloud Shell. Si no seleccionó un entorno previamente, seleccione Bash como entorno.If you didn't select an environment previously, select Bash as your environment.

    Aviso de Cloud Shell

  3. Cambie al directorio clouddrive.Change directories to the clouddrive directory.

    cd clouddrive
    
  4. Cree un directorio llamado terraform-aks-k8s.Create a directory named terraform-aks-k8s.

    mkdir terraform-aks-k8s
    
  5. Cambie los directorios al nuevo directorio:Change directories to the new directory:

    cd terraform-aks-k8s
    

Declaración del proveedor de AzureDeclare the Azure provider

Cree el archivo de configuración de Terraform que declara el proveedor de Azure.Create the Terraform configuration file that declares the Azure provider.

  1. En Cloud Shell, cree un archivo denominado main.tf.In Cloud Shell, create a file named main.tf.

    vi main.tf
    
  2. Seleccione la tecla I para acceder al modo de inserción.Enter insert mode by selecting the I key.

  3. Pegue el siguiente código en el editor:Paste the following code into the editor:

    provider "azurerm" {
        version = "~>1.5"
    }
    
    terraform {
        backend "azurerm" {}
    }
    
  4. Seleccione la tecla Esc para acceder al modo de inserción.Exit insert mode by selecting the Esc key.

  5. Guarde el archivo y salga del editor vi, para lo que debe escribir el siguiente comando:Save the file and exit the vi editor by entering the following command:

    :wq
    

Definición de un clúster de KubernetesDefine a Kubernetes cluster

Cree el archivo de configuración de Terraform que declara los recursos para el clúster de Kubernetes.Create the Terraform configuration file that declares the resources for the Kubernetes cluster.

  1. En Cloud Shell, cree un archivo denominado k8s.tf.In Cloud Shell, create a file named k8s.tf.

    vi k8s.tf
    
  2. Seleccione la tecla I para acceder al modo de inserción.Enter insert mode by selecting the I key.

  3. Pegue el siguiente código en el editor:Paste the following code into the editor:

    resource "azurerm_resource_group" "k8s" {
        name     = "${var.resource_group_name}"
        location = "${var.location}"
    }
    
    resource "random_id" "log_analytics_workspace_name_suffix" {
        byte_length = 8
    }
    
    resource "azurerm_log_analytics_workspace" "test" {
        # 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}"
        location            = "${var.log_analytics_workspace_location}"
        resource_group_name = "${azurerm_resource_group.k8s.name}"
        sku                 = "${var.log_analytics_workspace_sku}"
    }
    
    resource "azurerm_log_analytics_solution" "test" {
        solution_name         = "ContainerInsights"
        location              = "${azurerm_log_analytics_workspace.test.location}"
        resource_group_name   = "${azurerm_resource_group.k8s.name}"
        workspace_resource_id = "${azurerm_log_analytics_workspace.test.id}"
        workspace_name        = "${azurerm_log_analytics_workspace.test.name}"
    
        plan {
            publisher = "Microsoft"
            product   = "OMSGallery/ContainerInsights"
        }
    }
    
    resource "azurerm_kubernetes_cluster" "k8s" {
        name                = "${var.cluster_name}"
        location            = "${azurerm_resource_group.k8s.location}"
        resource_group_name = "${azurerm_resource_group.k8s.name}"
        dns_prefix          = "${var.dns_prefix}"
    
        linux_profile {
            admin_username = "ubuntu"
    
            ssh_key {
                key_data = "${file("${var.ssh_public_key}")}"
            }
        }
    
        agent_pool_profile {
            name            = "agentpool"
            count           = "${var.agent_count}"
            vm_size         = "Standard_DS1_v2"
            os_type         = "Linux"
            os_disk_size_gb = 30
        }
    
        service_principal {
            client_id     = "${var.client_id}"
            client_secret = "${var.client_secret}"
        }
    
        addon_profile {
            oms_agent {
            enabled                    = true
            log_analytics_workspace_id = "${azurerm_log_analytics_workspace.test.id}"
            }
        }
    
        tags = {
            Environment = "Development"
        }
    }
    

    El código anterior establece el nombre del clúster, la ubicación y el resource_group_name.The preceding code sets the name of the cluster, location, and the resource_group_name. Además, se establece el valor de dns_prefix, que forma parte del nombre de dominio completo (FQDN) utilizado para acceder al clúster.In addition, the dns_prefix value - that forms part of the fully qualified domain name (FQDN) used to access the cluster - is set.

    El registro linux_profile le permite configurar las opciones que permiten iniciar sesión en los nodos de trabajo mediante SSH.The linux_profile record allows you to configure the settings that enable signing into the worker nodes using SSH.

    Con AKS, solo se paga por los nodos de trabajo.With AKS, you pay only for the worker nodes. El registro agent_pool_profile configura los detalles de estos nodos de trabajo.The agent_pool_profile record configures the details for these worker nodes. El registro agent_pool_profile incluye el número de nodos de trabajo que se van a crear y el tipo de nodos de trabajo.The agent_pool_profile record includes the number of worker nodes to create and the type of worker nodes. Si necesita escalar o reducir verticalmente el clúster en el futuro, modifique el valor de count en este registro.If you need to scale up or scale down the cluster in the future, you modify the count value in this record.

  4. Seleccione la tecla Esc para acceder al modo de inserción.Exit insert mode by selecting the Esc key.

  5. Guarde el archivo y salga del editor vi, para lo que debe escribir el siguiente comando:Save the file and exit the vi editor by entering the following command:

    :wq
    

Declaración de las variablesDeclare the variables

  1. En Cloud Shell, cree un archivo denominado variables.tf.In Cloud Shell, create a file named variables.tf.

    vi variables.tf
    
  2. Seleccione la tecla I para acceder al modo de inserción.Enter insert mode by selecting the I key.

  3. Pegue el siguiente código en el editor:Paste the following code into the editor:

    variable "client_id" {}
    variable "client_secret" {}
    
    variable "agent_count" {
        default = 3
    }
    
    variable "ssh_public_key" {
        default = "~/.ssh/id_rsa.pub"
    }
    
    variable "dns_prefix" {
        default = "k8stest"
    }
    
    variable cluster_name {
        default = "k8stest"
    }
    
    variable resource_group_name {
        default = "azure-k8stest"
    }
    
    variable location {
        default = "Central US"
    }
    
    variable log_analytics_workspace_name {
        default = "testLogAnalyticsWorkspaceName"
    }
    
    # refer https://azure.microsoft.com/global-infrastructure/services/?products=monitor for log analytics available regions
    variable log_analytics_workspace_location {
        default = "eastus"
    }
    
    # refer https://azure.microsoft.com/pricing/details/monitor/ for log analytics pricing 
    variable log_analytics_workspace_sku {
        default = "PerGB2018"
    }
    
  4. Seleccione la tecla Esc para acceder al modo de inserción.Exit insert mode by selecting the Esc key.

  5. Guarde el archivo y salga del editor vi, para lo que debe escribir el siguiente comando:Save the file and exit the vi editor by entering the following command:

    :wq
    

Creación de un archivo de salida de TerraformCreate a Terraform output file

Las salidas de Terraform permiten definir valores que se resaltarán al usuario cuando Terraform aplique un plan, y pueden consultarse con el comando terraform output.Terraform outputs allow you to define values that will be highlighted to the user when Terraform applies a plan, and can be queried using the terraform output command. En esta sección, va a crear un archivo de salida que permita el acceso al clúster con kubectl.In this section, you create an output file that allows access to the cluster with kubectl.

  1. En Cloud Shell, cree un archivo denominado output.tf.In Cloud Shell, create a file named output.tf.

    vi output.tf
    
  2. Seleccione la tecla I para acceder al modo de inserción.Enter insert mode by selecting the I key.

  3. Pegue el siguiente código en el editor:Paste the following code into the editor:

    output "client_key" {
        value = "${azurerm_kubernetes_cluster.k8s.kube_config.0.client_key}"
    }
    
    output "client_certificate" {
        value = "${azurerm_kubernetes_cluster.k8s.kube_config.0.client_certificate}"
    }
    
    output "cluster_ca_certificate" {
        value = "${azurerm_kubernetes_cluster.k8s.kube_config.0.cluster_ca_certificate}"
    }
    
    output "cluster_username" {
        value = "${azurerm_kubernetes_cluster.k8s.kube_config.0.username}"
    }
    
    output "cluster_password" {
        value = "${azurerm_kubernetes_cluster.k8s.kube_config.0.password}"
    }
    
    output "kube_config" {
        value = "${azurerm_kubernetes_cluster.k8s.kube_config_raw}"
    }
    
    output "host" {
        value = "${azurerm_kubernetes_cluster.k8s.kube_config.0.host}"
    }
    
  4. Seleccione la tecla Esc para acceder al modo de inserción.Exit insert mode by selecting the Esc key.

  5. Guarde el archivo y salga del editor vi, para lo que debe escribir el siguiente comando:Save the file and exit the vi editor by entering the following command:

    :wq
    

Configuración del almacenamiento de Azure para almacenar el estado de TerraformSet up Azure storage to store Terraform state

Terraform realiza un seguimiento del estado de manera local a través del archivo terraform.tfstate.Terraform tracks state locally via the terraform.tfstate file. Este patrón funciona bien en un entorno de persona único.This pattern works well in a single-person environment. Sin embargo, en un entorno más práctico de varias personas, debe realizar el seguimiento del estado en el servidor mediante Azure Storage.However, in a more practical multi-person environment, you need to track state on the server utilizing Azure storage. En esta sección se recupera la información necesaria de la cuenta de almacenamiento (nombre y clave de cuenta) y se crea un contenedor de almacenamiento en el que se almacenará la información de estado de Terraform.In this section, you retrieve the necessary storage account information (account name and account key), and create a storage container into which the Terraform state information will be stored.

  1. En Azure Portal, seleccione Todos los servicios en el menú de la izquierda.In the Azure portal, select All services in the left menu.

  2. Seleccione Cuentas de almacenamiento.Select Storage accounts.

  3. En la pestaña Cuentas de almacenamiento, seleccione el nombre de la cuenta de almacenamiento en la que Terraform va a almacenar el estado.On the Storage accounts tab, select the name of the storage account into which Terraform is to store state. Por ejemplo, puede utilizar la cuenta de almacenamiento creada cuando abrió Cloud Shell por primera vez.For example, you can use the storage account created when you opened Cloud Shell the first time. El nombre de cuenta de almacenamiento creada por Cloud Shell normalmente comienza por cs seguido de una cadena aleatoria de números y letras.The storage account name created by Cloud Shell typically starts with cs followed by a random string of numbers and letters. Recuerde el nombre de la cuenta de almacenamiento que seleccione, ya que se necesitará más adelante.Remember the name of the storage account you select, as it is needed later.

  4. En la pestaña Cuenta de almacenamiento, seleccione Claves de acceso.On the storage account tab, select Access keys.

    Menú de la cuenta de almacenamiento

  5. Anote el valor de la clave clave1.Make note of the key1 key value. (Al seleccionar el icono a la derecha de la clave, se copia el valor al portapapeles).(Selecting the icon to the right of the key copies the value to the clipboard.)

    Claves de acceso de cuenta de almacenamiento

  6. En Cloud Shell, cree un contenedor en su cuenta de almacenamiento de Azure (reemplace los marcadores de posición <YourAzureStorageAccountName> y <YourAzureStorageAccountAccessKey> por los valores apropiados para su cuenta de almacenamiento de Azure).In Cloud Shell, create a container in your Azure storage account (replace the <YourAzureStorageAccountName> and <YourAzureStorageAccountAccessKey> placeholders with the appropriate values for your Azure storage account).

    az storage container create -n tfstate --account-name <YourAzureStorageAccountName> --account-key <YourAzureStorageAccountKey>
    

Creación de un clúster de KubernetesCreate the Kubernetes cluster

En esta sección, puede ver cómo usar el comando terraform init para crear los recursos definidos en los archivos de configuración que se crearon en las secciones anteriores.In this section, you see how to use the terraform init command to create the resources defined the configuration files you created in the previous sections.

  1. En Cloud Shell, inicialice Terraform (reemplace los marcadores de posición <YourAzureStorageAccountName> y <YourAzureStorageAccountAccessKey> por los valores apropiados para su cuenta de almacenamiento de Azure).In Cloud Shell, initialize Terraform (replace the <YourAzureStorageAccountName> and <YourAzureStorageAccountAccessKey> placeholders with the appropriate values for your Azure storage account).

    terraform init -backend-config="storage_account_name=<YourAzureStorageAccountName>" -backend-config="container_name=tfstate" -backend-config="access_key=<YourStorageAccountAccessKey>" -backend-config="key=codelab.microsoft.tfstate" 
    

    El comando terraform init muestra el éxito de inicializar el back-end y el complemento del proveedor:The terraform init command displays the success of initializing the backend and provider plugin:

    Ejemplo de resultados de "terraform init"

  2. Exporte las credenciales de la entidad de servicio.Export your service principal credentials. Reemplace los marcadores <your-client-id> () y <your-client-secret> () por los valores de appId y password asociados a la entidad de servicio.Replace the <your-client-id> and <your-client-secret> placeholders with the appId and password values associated with your service principal, respectively.

    export TF_VAR_client_id=<your-client-id>
    export TF_VAR_client_secret=<your-client-secret>
    
  3. Ejecute el comando terraform plan para crear el plan de Terraform que define los elementos de infraestructura.Run the terraform plan command to create the Terraform plan that defines the infrastructure elements.

    terraform plan -out out.plan
    

    El comando terraform plan muestra los recursos que se crearán cuando ejecute el comando terraform apply:The terraform plan command displays the resources that will be created when you run the terraform apply command:

    Ejemplo de resultados de "terraform plan"

  4. Ejecute el comando terraform apply para aplicar el plan para crear el clúster de Kubernetes.Run the terraform apply command to apply the plan to create the Kubernetes cluster. El proceso para crear un clúster de Kubernetes puede tardar varios minutos, dado como resultado el agotamiento del tiempo de espera de la sesión de Cloud Shell. Si la sesión de Cloud Shell agota su tiempo de espera, puede seguir los pasos de la sección "Recuperación de un tiempo de espera de Cloud Shell" para poder completar el tutorial.The process to create a Kubernetes cluster can take several minutes, resulting in the Cloud Shell session timing out. If the Cloud Shell session times out, you can follow the steps in the section "Recover from a Cloud Shell timeout" to enable you to complete the tutorial.

    terraform apply out.plan
    

    El comando terraform apply muestra los resultados de la creación de los recursos definidos en sus archivos de configuración:The terraform apply command displays the results of creating the resources defined in your configuration files:

    Ejemplo de resultados de "terraform apply"

  5. En Azure Portal, seleccione Todos los servicios en el menú de la izquierda para ver los recursos creados para su nuevo clúster de Kubernetes.In the Azure portal, select All services in the left menu to see the resources created for your new Kubernetes cluster.

    Aviso de Cloud Shell

Recuperación de un tiempo de espera de Cloud ShellRecover from a Cloud Shell timeout

Si se agota el tiempo de espera de la sesión de Cloud Shell, puede realizar los siguientes pasos para recuperarlo:If the Cloud Shell session times out, you can perform the following steps to recover:

  1. Inicie una sesión de Cloud Shell.Start a Cloud Shell session.

  2. Cambie al directorio que contiene los archivos de configuración de Terraform.Change to the directory containing your Terraform configuration files.

    cd /clouddrive/terraform-aks-k8s
    
  3. Ejecute el siguiente comando:Run the following command:

    export KUBECONFIG=./azurek8s
    

Prueba del clúster de KubernetesTest the Kubernetes cluster

Las herramientas de Kubernetes se pueden usar para comprobar el clúster recién creado.The Kubernetes tools can be used to verify the newly created cluster.

  1. Obtenga la configuración de Kubernetes desde el estado de Terraform y almacénela en un archivo que kubectl puede leer.Get the Kubernetes configuration from the Terraform state and store it in a file that kubectl can read.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  2. Establezca una variable de entorno para que kubectl seleccione la configuración correcta.Set an environment variable so that kubectl picks up the correct config.

    export KUBECONFIG=./azurek8s
    
  3. Compruebe el mantenimiento del clúster.Verify the health of the cluster.

    kubectl get nodes
    

    Debería ver los detalles de sus nodos de trabajo, y todos deberían tener el estado Listo, como se muestra en la siguiente imagen:You should see the details of your worker nodes, and they should all have a status Ready, as shown in the following image:

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

Supervisión de estado y registrosMonitor health and logs

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.When the AKS cluster was created, monitoring was enabled to capture health metrics for both the cluster nodes and pods. Estas métricas de mantenimiento están disponibles en Azure Portal.These health metrics are available in the 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).For more information on container health monitoring, see Monitor Azure Kubernetes Service health.

Pasos siguientesNext steps

En este artículo, ha aprendido a utilizar Terraform y AKS para crear un clúster de Kubernetes.In this article, you learned how to use Terraform and AKS to create a Kubernetes cluster. Aquí tiene algunos recursos adicionales donde encontrará más información acerca de Terraform en Azure:Here are some additional resources to help you learn more about Terraform on Azure:

Centro de Terraform en Microsoft.comTerraform Hub in Microsoft.com
Documentación del proveedor de Azure para TerraformTerraform Azure provider documentation
Origen del proveedor de Azure para TerraformTerraform Azure provider source
Módulos de Azure para TerraformTerraform Azure modules