使用 Terraform 检索 Azure Kubernetes 虚拟机

使用 Terraform 检索 Azure Kubernetes 虚拟机

我使用 Terraform 创建了一个 Azure Kubernetes 集群。我使用了推荐的azurerm_kubernetes_cluster资源,它在后台创建了节点。因此,我无法以 Kubernetes 对象的形式访问这些节点。我现在想对与这些节点相关的警报进行 Terraform。但为了做到这一点,我需要将节点作为 Terraform 对象(Terraform 警报规则resource需要节点的 ID:https://www.terraform.io/docs/providers/azurerm/r/monitor_metric_alertrule.html)。

因此我尝试以 Terraform 身份访问节点datahttps://www.terraform.io/docs/providers/azurerm/d/virtual_machine.html

如上一个链接所述,我们需要两个信息:虚拟机的resource_group和。资源的输出为我们提供了,因此该部分没问题。但节点的名称是随机生成的(更准确地说,名称的一部分是随机生成的,另一部分可以从我们拥有的 Terraform 对象中猜出)。但如上一个链接所示,无法使用功能(例如nameazurerm_kubernetes_clusterresource_groupfilterhttps://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}"
}

有谁知道如何解锁下列之一:

  • 我在 Azure AKS 文档中找不到关于如何生成节点名称的随机生成部分的任何解释(它是随机的吗?可以预测吗?)并且无法通过实验或猜测找到答案。有人知道吗?
  • resource_group我们能否以我尚未想到的方式使用数据获取虚拟机列表?
  • 我似乎找不到任何使用 Terraform 进行 AKS 节点警报的博客文章或视频,即使使用了卑鄙的技巧。有人可以提供我错过的链接吗?

Terraform Azure 提供程序版本:1.23.0

Terraform 版本:0.10.x(Azure 提供程序 1.23.0 所需)

答案1

您的想法是错误的。创建 AKS 群集时,您会创建一些 VM 作为工作节点,但这些 VM 并不是普通的 VM,您无法像管理独立 VM 那样管理它们,AKS 群集承担了大部分管理工作。

如果要监视虚拟机,则需要通过 AKS 群集进行监视,使用 AKS 指标(包括节点指标),而不是独立的 VMS。您可以在此处查看有关 AKS 指标的更多详细信息 -https://docs.microsoft.com/en-us/azure/azure-monitor/insights/container-insights-overview

MS 推荐的替代方法是让您想要运行的任何监控工具或类似工具在其自身容器中运行。然后,您可以将其作为 AKS 上的 Daemonset 运行,以便它在每个节点上运行。这就是 Azure Monitor 收集器的工作原理。

答案2

通过调查连接到 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

相关内容