1 votos

Recuperar máquinas virtuales Azure Kubernetes usando Terraform

He creado un clúster Azure Kubernetes utilizando Terraform. Utilicé las recomendaciones de azurerm_kubernetes_cluster que crean los nodos bajo el capó. Como consecuencia, no tengo acceso a los nodos como objeto Kubernetes. Ahora quiero Terraformar las alertas relacionadas con estos nodos. Pero para hacerlo, necesito tener los nodos como un objeto Terraform (regla de alerta Terraform resource requiere el id del nodo: https://www.terraform.io/docs/providers/azurerm/r/monitor_metric_alertrule.html ).

Así que intenté acceder a los nodos como Terraform data : https://www.terraform.io/docs/providers/azurerm/d/virtual_machine.html .

Como se indica en el enlace anterior, necesitamos dos datos para ello: el resource_group y el name de la máquina virtual. La salida del azurerm_kubernetes_cluster recurso nos da la resource_group Así que esa parte está bien. Pero los nodos tienen un nombre generado aleatoriamente (para ser más precisos, una parte del nombre se genera aleatoriamente, la otra parte se puede adivinar a partir de los objetos Terraform que tenemos). Pero como muestra el enlace anterior, no hay posibilidad de usar un filter funcionalidad (como en https://www.terraform.io/docs/providers/aws/d/ami.html ) o utilizar una regex para hacer coincidir los nombres de los nodos. Así que lo siguiente no es posible (con el * en lugar de la parte generada aleatoriamente y donde part1 y part2 son conocidos):

data "azurerm_virtual_machine" "nodes" {
  name                = "part1-*-part2"  
  resource_group_name = "${azurerm_kubernetes_cluster.this.node_resource_group}"
}

¿Alguien tiene una identificación de cómo desbloquear uno de los siguientes?

  • No encuentro ninguna explicación en la documentación de Azure AKS sobre cómo se genera la parte aleatoria del nombre del nodo (¿es tan aleatoria o se puede predecir?) y no puedo encontrarla por medio de experimentos o conjeturas. ¿Alguien lo sabe?
  • Podemos obtener la lista de máquinas virtuales de un resource_group ¿usar los datos de una manera que aún no se me ha ocurrido?
  • No encuentro ninguna entrada en el blog o vídeos en los que se alerte sobre los nodos AKS utilizando Terraform, ni siquiera con trucos sucios. Puede alguien proporcionarme un enlace que me perdí para trabajar?

Versión del proveedor Terraform Azure: 1.23.0

Versión de Terraform: 0.10.x (requerida por el proveedor de Azure 1.23.0)

2voto

Mat Puntos 2512

Lo estás enfocando de manera equivocada. Cuando creas un clúster AKS, estás creando algunas VMs como nodos trabajadores, sin embargo, estas no son VMs simples, no puedes gestionarlas como VMs independientes, el clúster AKS está llevando a cabo la mayor parte del trabajo de gestión.

Si desea supervisar las máquinas virtuales, debe hacerlo a través del clúster AKS, utilizando las métricas AKS, que incluyen las métricas de los nodos, y no como VMS independiente. Puedes ver más detalles de las métricas AKS aquí - https://docs.microsoft.com/en-us/azure/azure-monitor/insights/container-insights-overview

El enfoque alternativo recomendado por MS es tener cualquier herramienta de monitorización o similar que desee ejecutar, ejecutándose en un contenedor propio. A continuación, puede hacer que se ejecute como un Daemonset en AKS para que se ejecute en cada nodo. Así es como funciona el colector Azure Monitor.

0voto

Finzsoft Puntos 16

Es posible obtener todos los nombres de los nodos utilizados por un cluster aks investigando la subred adjunta:

data "azurerm_subnet" "aks" {
    name = azurerm_subnet.subnet.name                             # "aks-subnet-dev"
    virtual_network_name = azurerm_virtual_network.network.name   # "aks-vnet-dev"
    # aks-cluster-dev
    resource_group_name  = azurerm_kubernetes_cluster.cluster.resource_group_name
}

El código siguiente utiliza el recurso de cluster en su lugar:

data "azurerm_subnet" "aks" {
    name = element(split("/", azurerm_kubernetes_cluster.cluster.agent_pool_profile[0].vnet_subnet_id), 10)
    virtual_network_name = element(split("/", azurerm_kubernetes_cluster.cluster.agent_pool_profile[0].vnet_subnet_id), 8)
    resource_group_name  = azurerm_kubernetes_cluster.cluster.resource_group_name                                           
}

Finalmente puedes obtener tus nodos de dicha salida:

output "aks_nodes" {
    value = distinct([for x in data.azurerm_subnet.aks.ip_configurations :   replace(element(split("/", x), 8), "/nic-/", "")])
}

Resultado:

terraform apply:
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

aks_nodes = [
  "aks-aks-35064144-0",
  "aks-aks-35064144-1",
  "aks-aks-35064144-2",
]

kubectl get node:
NAME                 STATUS   ROLES   AGE    VERSION
aks-aks-35064144-0   Ready    agent   4d2h   v1.15.4
aks-aks-35064144-1   Ready    agent   4d2h   v1.15.4
aks-aks-35064144-2   Ready    agent   4d2h   v1.15.4

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: