如何在 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
}
}
}
负载均衡器的名称固定为 kubernetes
和 kubernetes-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 的预期数量,您可以对该数字进行硬编码。
以下 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
}
}
}
负载均衡器的名称固定为 kubernetes
和 kubernetes-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 的预期数量,您可以对该数字进行硬编码。