Ошибка «нет такого хоста» при добавлении тома в кластер Terraform AKS в Azure

#azure #kubernetes #terraform #volume #azure-aks

#azure #kubernetes #terraform #объем #azure-aks

Вопрос:

Я использую приведенный ниже файл Terraform для создания кластера AKS:

 resource "random_pet" "prefix" {}

resource "kubernetes_persistent_volume" "example" {
  metadata {
    name = "example"
  }
  spec {
    capacity = {
      storage = "1Gi"
    }
    access_modes = ["ReadWriteOnce"]
    persistent_volume_source {
      azure_disk {
        caching_mode  = "None"
        data_disk_uri = azurerm_managed_disk.example.id
        disk_name     = "example"
        kind          = "Managed"
      }
    }
  }
}

resource "azurerm_kubernetes_cluster" "example" {
  name                = "${random_pet.prefix.id}-aks"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  dns_prefix          = "${random_pet.prefix.id}-k8s"

  default_node_pool {
    name            = "example"
    node_count      = 2
    vm_size         = "Standard_D2_v2"
    os_disk_size_gb = 30
  }

  identity {
    type = "SystemAssigned"
  }

  role_based_access_control {
    enabled = true
  }

  addon_profile {
    kube_dashboard {
      enabled = true
    }
  }

  tags = {
    environment = "Demo"
  }
}

provider "azurerm" {
  version = ">=2.20.0"
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "${random_pet.prefix.id}-rg"
  location = "westus2"
}


resource "azurerm_managed_disk" "example" {
  name                 = "example"
  location             = azurerm_resource_group.example.location
  resource_group_name  = azurerm_resource_group.example.name
  storage_account_type = "Standard_LRS"
  create_option        = "Empty"
  disk_size_gb         = "1"
  tags = {
    environment = azurerm_resource_group.example.name
  }
}
 

Я извлек приведенный выше файл из руководства Terraform по настройке кластера AKS: https://learn.hashicorp.com/tutorials/terraform/aks

И я использовал пример Terraform для настройки управляемого диска Azure и тома k8s здесь: https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/persistent_volume

Когда я пытаюсь запустить указанную выше конфигурацию с Terraform, я получаю следующую ошибку:

 Error: Post "https://pumped-llama-k8s-419df981.hcp.westus2.azmk8s.io:443/api/v1/persistentvolumes": dial tcp: lookup pumped-llama-k8s-419df981.hcp.westus2.azmk8s.io on 192.168.1.1:53: no such host

  on main.tf line 3, in resource "kubernetes_persistent_volume" "example":
   3: resource "kubernetes_persistent_volume" "example" {
 

Я получаю эту же ошибку всякий раз, когда пытаюсь использовать любой azurerm нетераформенный ресурс. Например. при попытке настроить роли и привязку ролей: resource "kubernetes_role"

Я предполагаю, что по URL-адресу сообщения об ошибке — попытка подключиться к облачной платформе HashiCorp, которая, как я полагаю, используется по умолчанию, — мне нужно явно сообщить этим azurerm нересурсам, что я подключаюсь к размещенному в Azure Kubernetes; однако я не могу понять, как это сделать.

Комментарии:

1. Кажется, он не может подключиться к AKS с вашего локального компьютера, как насчет вывода команды kubectl config view или kubectl get nodes ?

2. Больше похоже на проблему с разрешением DNS-имен .. nslookup работает?

3. Я не думаю, что это проблема с подключением к AKS, поскольку остальные ресурсы Terraform созданы; Я могу перейти к кластеру AKS в Azure, и все это там и работает. Похоже, что сбой происходит из-за любых ресурсов Terraform, специфичных для kubernetes, таких как «kubernetes_persistent_volume» или «kubernetes_role». Но похоже, что это сбой, потому что Terraform пытается подключиться к несуществующему облачному серверу HashiCorp, а не к моему экземпляру AKS.

Ответ №1:

Оказывается, мне нужно было определить kubernetes поставщика в файле Terraform — удивлен, что я не получу какое-то предупреждение за то, что не включил его, учитывая, что я взаимодействую с его ресурсами.

Вот что я сделал, чтобы это исправить:

outputs.tf:

 output "host" {
  value = azurerm_kubernetes_cluster.default.kube_config.0.host
}

output "client_key" {
  value = azurerm_kubernetes_cluster.default.kube_config.0.client_key
}

output "client_certificate" {
  value = azurerm_kubernetes_cluster.default.kube_config.0.client_certificate
}

output "kube_config" {
  value = azurerm_kubernetes_cluster.default.kube_config_raw
}

output "cluster_ca_certificate" {
  value = azurerm_kubernetes_cluster.default.kube_config.0.cluster_ca_certificate
}

 

main.tf:

 ...
provider "kubernetes" {
  version = "=1.13.2"
  load_config_file = "false"

  host = azurerm_kubernetes_cluster.default.kube_config.0.host
  
  client_certificate     = "${base64decode(azurerm_kubernetes_cluster.default.kube_config.0.client_certificate)}"
  client_key             = "${base64decode(azurerm_kubernetes_cluster.default.kube_config.0.client_key)}"
  cluster_ca_certificate = "${base64decode(azurerm_kubernetes_cluster.default.kube_config.0.cluster_ca_certificate)}"
}
...