如何在 terraform 中的 AKS 群集资源创建的虚拟机规模集或负载均衡器上启用诊断日志?

How to enable diagnostic logs on Virtual Machine Scale Set or Load Balancer created by AKS cluster resource in terraform?

以下 terraform 资源使用虚拟机规模集 (VMSS) 和负载均衡器 (LB) 资源创建 AKS 群集。目前,通过在 addon_profile.

下添加 oms_agent 部分,在集群资源上启用诊断日志

但是,文档没有提到是否有办法在 default_node_pool 创建的 VMSS 和 network_profile 创建的 LB 上启用诊断。这可以通过 terraform 实现吗?

或者,集群创建的VMSS和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
        }
      }
    }

负载均衡器的名称固定为 kuberneteskubernetes-internal。他们坐在 azurerm_kubernetes_cluster.aks-cluster.node_resource_group 组中。但是,由于负载均衡器是动态的并且仅在您拥有 LoadBalancer 类型的服务时创建,我怀疑您是否能够通过 terraform 启用监控。

对于 VMSS,有一个生成名称的方案:https://github.com/Azure/aks-engine/blob/29c25089d4fa635cb90a3a2cd21d14af47deb40a/pkg/api/types.go#L929-L947 但是它可能无法在 terraform 中实现。所以我认为这是不行的。

另外,在 azurerm terraform provider 中创建了一个 issue 来提供集群的 VMSS 名称。但是,它已关闭,因为无法修复。

所以,解决同样的问题我不得不求助于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 ]
}

如果您不想为 azurerm_resources 计算 resource_group 名称,那么您可以将此代码移至模块并将 azurerm_kubernetes_cluster.aks-cluster.node_resource_group 作为组名传递。这是因为在 count 块中不可能有动态变量。或者,如果您知道 VMSS 的预期数量,您可以对该数字进行硬编码。