#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
блоке. Кроме того, если вы знаете ожидаемое количество виртуальных машин, вы можете жестко запрограммировать это число.