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. Para más información sobre el uso de Terraform en Azure, consulte el centro para desarrolladores de Terraform para Azure.
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
1. Configurar su entorno
- Suscripción de Azure: Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Configuración de Terraform: si aún no lo ha hecho, configure Terraform con una de las siguientes opciones:
Entidad de servicio de Azure: Si no tiene una entidad de servicio, cree una entidad de servicio. Tome nota de
appId,display_name,passwordytenant.Identificador de objeto de entidad de servicio: ejecute el siguiente comando para obtener el identificador de objeto de la entidad de servicio:
az ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":objectId}" --output tablePar de claves SSH: use uno de los siguientes artículos:
2. Configuración de una cuenta de almacenamiento de Azure para almacenar el estado de Terraform
Terraform realiza un seguimiento del estado de manera local a través del archivo terraform.tfstate. Este patrón funciona bien en un entorno de persona único. Sin embargo, en un entorno más práctico de varias personas, debe realizar el seguimiento del estado en el servidor mediante Azure Storage. En esta sección aprenderá a recuperar la información de la cuenta de almacenamiento necesaria y a crear un contenedor de almacenamiento. La información de estado Terraform se almacena en ese contenedor.
Use una de las siguientes opciones para crear una cuenta de Almacenamiento de Azure:
Vaya a Azure Portal.
En Servicios de Azure, seleccione Cuentas de almacenamiento. (Si la opción Cuentas de almacenamiento no está visible en la página principal, seleccione Más servicios).
En la página Storage cuentas, en la página Storage cuentas, seleccione la cuenta de almacenamiento donde Terraform almacenará la información de estado.
En la página Storage cuenta, en el menú izquierdo, en la sección Seguridad y redes, seleccione Claves de acceso.

En la página Claves de acceso , seleccione Mostrar claves para mostrar los valores de clave.

Busque la clavekey1 en la página y seleccione el icono situado a la derecha para copiar el valor de clave en el Portapapeles.

Desde un símbolo de la línea de comandos, ejecute az storage container create. Este comando crea un contenedor en la cuenta de Almacenamiento de Azure. Reemplace los marcadores de posición por los valores adecuados para su cuenta de Azure Storage.
az storage container create -n tfstate \ --account-name <storage_account_name> \ --account-key <storage_account_key>Cuando el comando se completa correctamente, muestra un bloque JSON con una clave "creada" y un valor true. También puede ejecutar az storage container list para comprobar que el contenedor se creó correctamente.
az storage container list \ --account-name <storage_account_name> \ --account-key <storage_account_key>
3. Implementación del código de Terraform
Cree un directorio en el que probar el código de ejemplo de Terraform y conviértalo en el directorio actual.
Cree un archivo llamado
providers.tfe inserte el siguiente código.terraform { required_version = ">=0.12" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>2.0" } } backend "azurerm" { resource_group_name = "<storage_account_resource_group>" storage_account_name = "<storage_account_name>" container_name = "tfstate" key = "codelab.microsoft.tfstate" } } provider "azurerm" { features {} }Cree un archivo denominado
main.tfe 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" { name = random_pet.rg-name.id location = var.resource_group_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) } } default_node_pool { name = "agentpool" node_count = var.agent_count vm_size = "Standard_D2_v2" } service_principal { client_id = var.aks_service_principal_app_id client_secret = var.aks_service_principal_client_secret } addon_profile { oms_agent { enabled = true log_analytics_workspace_id = azurerm_log_analytics_workspace.test.id } } network_profile { load_balancer_sku = "Standard" network_plugin = "kubenet" } tags = { Environment = "Development" } }Cree un archivo denominado
variables.tfe inserte el siguiente código: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 "resource_group_location" { default = "eastus" description = "Location of the resource group." } 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" }Cree un archivo llamado
output.tfe inserte el siguiente código.output "resource_group_name" { value = azurerm_resource_group.rg.name } 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 sensitive = true } output "host" { value = azurerm_kubernetes_cluster.k8s.kube_config.0.host }Cree un archivo llamado
terraform.tfvarse inserte el siguiente código.aks_service_principal_app_id = "<service_principal_app_id>" aks_service_principal_client_secret = "<service_principal_password>" aks_service_principal_object_id = "<service_principal_object_id>"Puntos clave:
- Establezca
aks_service_principal_app_iden el valor de la entidadappIdde servicio. - Establezca
aks_service_principal_client_secreten el valor de la entidadpasswordde servicio. - Establezca
aks_service_principal_object_iden el identificador de objeto de la entidad de servicio. (El comando de la CLI de Azure para obtener este valor se encuentra en la sección Configuración del entorno ).
- Establezca
4. 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
5. 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 plancrea 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
-outopcional permite especificar un archivo de salida para el plan. El uso del parámetro-outgarantiza 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.
6. 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 applyanterior da por hecho que ejecutó anteriormenteterraform 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 aterraform apply. - Si no ha utilizado el parámetro
-out, simplemente llame aterraform applysin ningún parámetro.
7. Verificación de los resultados
Obtenga el nombre del grupo de recursos.
echo "$(terraform output resource_group_name)"Vaya a Azure Portal.
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 Log Analytics: De forma predeterminada, la demostración denomina esta solución ContainerInsights. El portal mostrará el área de trabajo de soluciones entre paréntesis.
- Á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.
- 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).
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)" > ./azurek8sCompruebe que el comando anterior no ha agregado un carácter EOT ASCII.
cat ./azurek8s*Puntos clave:
- Si ve
<< EOTal principio yEOTal final, edite el contenido del archivo para quitar estos caracteres. 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
- Si ve
Establezca una variable de entorno para que kubectl seleccione la configuración correcta.
export KUBECONFIG=./azurek8sCompruebe el mantenimiento del clúster.
kubectl get nodes
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>)".
8. 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:
Ejecute el comando terraform plan y especifique la marca
destroy.terraform plan -destroy -out main.destroy.tfplanPuntos clave:
- El comando
terraform plancrea 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
-outopcional permite especificar un archivo de salida para el plan. El uso del parámetro-outgarantiza 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.
- El comando
Ejecute terraform apply para aplicar el plan de ejecución.
terraform apply main.destroy.tfplan
Eliminar cuenta de almacenamiento
Precaución
Elimine solo el grupo de recursos que contiene la cuenta de almacenamiento que usó en esta demostración si no usa ninguna otra cosa.
Ejecute az group delete para eliminar el grupo de recursos (y su cuenta de almacenamiento que usó en esta demostración).
az group delete --name <storage_resource_group_name> --yes
Puntos clave:
- Reemplace el
storage_resource_group_namemarcador de posición por elresource_group_namevalor delproviders.tfarchivo.
Eliminación de la entidad de servicio
Precaución
Elimine solo la entidad de servicio que usó en esta demostración si no la usa para nada más.
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