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

Posted

技术标签:

【中文标题】如何在 terraform 中由 AKS 群集资源创建的虚拟机规模集或负载均衡器上启用诊断日志?【英文标题】:How to enable diagnostic logs on Virtual Machine Scale Set or Load Balancer created by AKS cluster resource in terraform? 【发布时间】:2021-02-15 08:22:07 【问题描述】:

以下 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
        
      
    

【问题讨论】:

您的实际期望是什么? 一种在通过上述代码创建 AKS 群集期间创建的 VMSS 和 LB 资源上启用诊断日志的方法。 @kjd 这有什么成功吗?有同样的任务。 @hazzik 不,目前无法通过 terraform 执行此操作,因为创建的 VMSS 的名称未知。执行此操作的最佳方法是在 terraform 创建资源后运行脚本以查找 VMSS 的名称并对其启用诊断。但是,负载均衡器始终命名为 kubernetes。此命名相关信息已由 Azure 确认。 【参考方案1】:

负载均衡器的名称固定为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 提供程序中创建了一个 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_resourcesresource_group 名称,那么您可以将此代码移动到模块并将 azurerm_kubernetes_cluster.aks-cluster.node_resource_group 作为组名称传递。这是因为在 count 块中不可能有动态变量。或者,如果您知道 VMSS 的预期数量,您可以硬编码这个数字。

【讨论】:

以上是关于如何在 terraform 中由 AKS 群集资源创建的虚拟机规模集或负载均衡器上启用诊断日志?的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure 上将卷添加到 Terraform AKS 群集时出现错误“没有这样的主机”

Terraform 在 AKS 节点资源组中创建入口应用程序网关

使用 Terraform 创建具有托管标识的 Azure AKS 会导致 AutoUpgradePreview 未启用错误

如何授予 AKS 通过 terraform 访问 ACR 的权限?

如何找到我的 AKS 群集的服务主体机密?

将网站或域与 AKS 群集链接