Как включить журналы диагностики на множестве виртуальных машин или балансировщике нагрузки, созданных ресурсом кластера AKS в terraform?

#azure #terraform #azure-aks #azure-monitoring

#azure #terraform #azure-aks #azure-мониторинг

Вопрос:

Следующий ресурс terraform создает кластер AKS с набором виртуальных машин в масштабе (VMSS) и ресурсом балансировщика нагрузки (LB). В настоящее время журналы диагностики включены на ресурсе кластера путем добавления oms_agent раздела в разделе addon_profile .

Однако в документации не упоминается, есть ли способ включить диагностику для виртуальных машин, созданных default_node_pool и созданных LB network_profile . Возможно ли это с помощью terraform?

В качестве альтернативы, существует ли фиксированная схема именования для виртуальных машин и LB, созданных кластером? Если существует фиксированная схема именования, одним из решений этой проблемы было бы просто искать ресурсы с этими предопределенными именами в правильной группе ресурсов для создания решения для анализа журналов.

Документация Terraform:
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/kubernetes_cluster
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/kubernetes_cluster#default_node_pool
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/kubernetes_cluster#load_balancer_profile

     resource "azurerm_kubernetes_cluster" "aks-cluster" {
      resource_group_name             = azurerm_resource_group.aks-rg.name
      location                        = azurerm_resource_group.aks-rg.location
      name                            = "my-cluster"
      dns_prefix                      = "my-cluster-aks"
      kubernetes_version              = "1.18.8"
      private_cluster_enabled         = false
      node_resource_group             = "MC_my-cluster-aks"
      api_server_authorized_ip_ranges = [var.authorized_ip]
      service_principal {
        client_id     = var.sp_client_id
        client_secret = var.client_secret
      }
      default_node_pool {
        name                = "default"
        type                = "VirtualMachineScaleSets"
        vm_size             = "Standard_D2_v2"
        node_count          = 4
        enable_auto_scaling = true
        min_count           = 4
        max_count           = 6
        vnet_subnet_id      = azurerm_subnet.aks-vnet-subnet.id
      }
      network_profile {
        network_plugin     = "azure"
        network_policy     = "azure"
        docker_bridge_cidr = var.aks_docker_bridge_cidr
        dns_service_ip     = var.aks_dns_service_ip
        load_balancer_sku  = "standard"
        service_cidr       = var.aks_service_cidr
      }
      addon_profile {
        oms_agent {
          enabled                    = true
          log_analytics_workspace_id = azurerm_log_analytics_workspace.aks_log_ws.id
        }
      }
    }
  

Комментарии:

1. Чего вы на самом деле ожидаете?

2. Способ включить журналы диагностики на ресурсах VMSS и LB, которые создаются при создании кластера AKS с помощью приведенного выше кода.

3. @kjd есть какие-либо успехи в этом? С той же задачей.

4. @hazzik Нет, в настоящее время нет способа сделать это через terraform, поскольку имя созданных виртуальных машин неизвестно. Лучшим способом сделать это было бы запустить скрипт после того, как terraform создал ресурс, чтобы найти имя виртуальных машин и включить для него диагностику. Однако балансировщик нагрузки всегда называется kubernetes. Эта информация, связанная с именованием, была подтверждена Azure.

Ответ №1:

Имена балансировщиков нагрузки фиксируются на kubernetes и kubernetes-internal . Они находятся в azurerm_kubernetes_cluster.aks-cluster.node_resource_group группе. Однако, поскольку балансировщики нагрузки являются динамическими и создаются только при наличии службы с типом LoadBalancer , я сомневаюсь, что вы сможете включить мониторинг через terraform.

Для виртуальных машин существует схема генерации имени: https://github.com/Azure/aks-engine/blob/29c25089d4fa635cb90a3a2cd21d14af47deb40a/pkg/api/types.go#L929-L947 однако это, вероятно, было бы невозможно реализовать в terraform. Поэтому я бы счел это невозможным.

Кроме того, в поставщике azurerm terraform возникла проблема с указанием имени виртуальных машин кластера. Однако он был закрыт, поскольку не исправляется.

Итак, решая ту же проблему, мне пришлось прибегнуть к azurerm_resources источнику данных

 data "azurerm_resources" "aks-cluster-vmss" {
  resource_group_name = "MC_${azurerm_resource_group.aks-rg.name}_my-cluster_${azurerm_resource_group.aks-rg.location}"
  type                = "Microsoft.Compute/virtualMachineScaleSets"
}

resource "azurerm_virtual_machine_scale_set_extension" "monitoring" {
  count = length(data.azurerm_resources.aks-cluster-vmss.resources)

  name                         = "MMAExtension"
  virtual_machine_scale_set_id = data.azurerm_resources.aks-cluster-vmss.resources[count.index].id
  publisher                    = "Microsoft.EnterpriseCloud.Monitoring"
  type                         = "OmsAgentForLinux"
  type_handler_version         = "1.13"
  auto_upgrade_minor_version   = true

  settings = <<SETTINGS
  {
     "workspaceId": "${azurerm_log_analytics_workspace.aks_log_ws.workspace_id}"
  }
SETTINGS

  protected_settings = <<SETTINGS
  {
      "workspaceKey": "${azurerm_log_analytics_workspace.aks_log_ws.primary_shared_key}"
  }
SETTINGS

  depends_on = [ azurerm_kubernetes_cluster.aks-cluster ]
}
  

Если вы не хотите вычислять resource_group имя для azurerm_resources , вы можете переместить этот код в модуль и передать azurerm_kubernetes_cluster.aks-cluster.node_resource_group как имя группы. Это связано с тем, что невозможно иметь динамическую переменную в count блоке. Кроме того, если вы знаете ожидаемое количество виртуальных машин, вы можете жестко запрограммировать это число.