Я создал кластер Azure Kubernetes с помощью Terraform. Я использовал рекомендованный azurerm_kubernetes_cluster
ресурс, которые создают узлы под капотом. Как следствие, у меня нет доступа к узлам как к объекту Kubernetes. Теперь я хочу терраформировать оповещения, связанные с узлами thoses. Но для этого мне нужно иметь узлы как объект Terraform (правило предупреждения Terraform resource
требуется идентификатор узла: https://www.terraform.io/docs/providers/azurerm/r/monitor_metric_alertrule.html).
Поэтому я попытался получить доступ к узлам как Terraform data
: https://www.terraform.io/docs/providers/azurerm/d/virtual_machine.html.
Как указано в предыдущей ссылке, для этого нам нужны две информации: resource_group
и name
виртуальной машины. Выход azurerm_kubernetes_cluster
ресурс дает нам resource_group
, так что эта часть в порядке. Но у узлов есть имя, сгенерированное случайным образом (чтобы быть более точным, одна часть имени генерируется случайным образом, другая часть может быть угадана из объектов Terraform, которые у нас есть). Но, как показывает предыдущая ссылка, нет возможности использовать filter
функциональность (например, в https://www.terraform.io/docs/providers/aws/d/ami.html) или использовать регулярное выражение для сопоставления имен узлов. Таким образом, следующее невозможно (с *
вместо случайно сгенерированной части и где part1
и part2
известны):
data "azurerm_virtual_machine" "nodes" {
name = "part1-*-part2"
resource_group_name = "${azurerm_kubernetes_cluster.this.node_resource_group}"
}
У кого-нибудь есть идентификатор, как разблокировать одно из следующего:
resource_group
используя данные способом, о котором я еще не думал?Версия провайдера Terraform Azure: 1.23.0
Версия Terraform: 0.10.x (требуется поставщиком Azure 1.23.0)
Вы ошибаетесь. Когда вы создаете кластер AKS, вы создаете несколько виртуальных машин в качестве рабочих узлов, однако это не обычные старые виртуальные машины, вы не можете управлять ими, как автономными виртуальными машинами, кластер AKS берет на себя большую часть работы по управлению.
Если вы хотите контролировать виртуальные машины, вам необходимо сделать это через кластер AKS, используя метрики AKS, которые включают метрики узлов, а не как автономную VMS. Вы можете увидеть более подробную информацию о показателях AKS здесь - https://docs.microsoft.com/en-us/azure/azure-monitor/insights/container-insights-overview
Альтернативный подход, рекомендованный MS, - иметь любой инструмент мониторинга или аналогичный инструмент, который вы хотите запустить, работающий в контейнере. Затем вы можете запустить этот набор демонов на AKS, чтобы он работал на каждом узле. Так работает сборщик Azure Monitor.
Можно получить все имена узлов, используемых кластером aks, исследуя присоединенную к нему подсеть:
data "azurerm_subnet" "aks" {
name = azurerm_subnet.subnet.name # "aks-subnet-dev"
virtual_network_name = azurerm_virtual_network.network.name # "aks-vnet-dev"
# aks-cluster-dev
resource_group_name = azurerm_kubernetes_cluster.cluster.resource_group_name
}
В приведенном ниже коде вместо этого используется кластерный ресурс:
data "azurerm_subnet" "aks" {
name = element(split("/", azurerm_kubernetes_cluster.cluster.agent_pool_profile[0].vnet_subnet_id), 10)
virtual_network_name = element(split("/", azurerm_kubernetes_cluster.cluster.agent_pool_profile[0].vnet_subnet_id), 8)
resource_group_name = azurerm_kubernetes_cluster.cluster.resource_group_name
}
Наконец, вы можете получить свои узлы из такого вывода:
output "aks_nodes" {
value = distinct([for x in data.azurerm_subnet.aks.ip_configurations : replace(element(split("/", x), 8), "/nic-/", "")])
}
Результат:
terraform apply:
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
aks_nodes = [
"aks-aks-35064144-0",
"aks-aks-35064144-1",
"aks-aks-35064144-2",
]
kubectl get node:
NAME STATUS ROLES AGE VERSION
aks-aks-35064144-0 Ready agent 4d2h v1.15.4
aks-aks-35064144-1 Ready agent 4d2h v1.15.4
aks-aks-35064144-2 Ready agent 4d2h v1.15.4