Назад | Перейти на главную страницу

Получение виртуальных машин Azure Kubernetes с помощью Terraform

Я создал кластер 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}"
}

У кого-нибудь есть идентификатор, как разблокировать одно из следующего:

Версия провайдера 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