Как автоматически пройти аутентификацию на кластере kubernetes после создания его с помощью terraform в Azure? - PullRequest
0 голосов
/ 24 февраля 2020

Вопрос:

Я пытаюсь создать кластер kubernetes, пространство имен и секреты с помощью terraform. Кластер создан, но не удается создать ресурсы, основанные на кластере.

Справочная информация

Сообщение об ошибке:

Это сообщение об ошибке, выданное terraform после создания кластера kubernetes, когда необходимо создать пространство имен:

azurerm_kubernetes_cluster_node_pool.mypool: Creation complete after 6m4s [id=/subscriptions/aaabcde1-abcd-abcd-abcd-aaaaaaabdce/resourcegroups/myrg/providers/Microsoft.ContainerService/managedClusters/my-aks/agentPools/win]        
Error: Post https://my-aks-abcde123.hcp.australiaeast.azmk8s.io:443/api/v1/namespaces: dial tcp: lookup my-aks-abcde123.hcp.australiaeast.azmk8s.io on 10.128.10.5:53: no such host

  on mytf.tf line 114, in resource "kubernetes_namespace" "my":
 114: resource "kubernetes_namespace" "my" {

Обходной путь вручную:

Я могу решить эту проблему, вручную проверив аутентификацию в кластере kubernetes через командную строку и применив невыполненные изменения terraform через другое terraform apply:

az aks get-credentials -g myrg -n my-aks --overwrite-existing

Автоматическая попытка обхода:

Моя попытка автоматизировать этот шаг аутентификации не удалась. Я попытался с локальным exe c инициатором внутри определения кластера kubernetes, но безуспешно:

resource "azurerm_kubernetes_cluster" "myCluster" {
  name                = "my-aks"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  dns_prefix          = "my-aks"
  network_profile {
    network_plugin      = "azure"
  }

  default_node_pool {
    name       = "default"
    node_count = 1
    vm_size    = "Standard_B2s"
  }
  service_principal {
    client_id     = azuread_service_principal.tfapp.application_id
    client_secret = azuread_service_principal_password.tfapp.value
  }
  tags = {
    Environment = "demo"
  }
  windows_profile {
    admin_username = "myself"
    admin_password = random_string.password.result
  }
  provisioner "local-exec" {
    command="az aks get-credentials -g myrg -n my-aks --overwrite-existing"
  }
}

Это пример ресурса, который не может быть создан:

resource "kubernetes_namespace" "my" {
  metadata {
    name = "my-namespace"
  }
}

Есть ли способ полностью автоматизировать создание моих ресурсов, в том числе тех, которые основаны на кластере kubernetes, без ручной аутентификации?

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Для ваших требований, я думаю, вы можете отделить создание кластера AKS от создания ресурсов в кластере AKS.

При создании кластера AKS вам просто нужно поставить инициатора local-exec в null_resource примерно так:

resource "null_resource" "example" {
  provisioner "local-exec" {
    command="az aks get-credentials -g ${azurerm_resource_group.rg.name} -n my-aks --overwrite-existing"
  }
}

Когда создание кластера AKS завершено. Затем вы go снова создадите свое пространство имен через Terraform.

Таким образом, вам не нужно вручную проходить аутентификацию. Просто выполните код Terraform.

0 голосов
/ 03 марта 2020

В документации для ресурса Terraform AKS есть пример создания аутентифицированного провайдера Kubernetes:

provider "kubernetes" {
  host                   = "${azurerm_kubernetes_cluster.main.kube_config.0.host}"
  username               = "${azurerm_kubernetes_cluster.main.kube_config.0.username}"
  password               = "${azurerm_kubernetes_cluster.main.kube_config.0.password}"
  client_certificate     = "${base64decode(azurerm_kubernetes_cluster.main.kube_config.0.client_certificate)}"
  client_key             = "${base64decode(azurerm_kubernetes_cluster.main.kube_config.0.client_key)}"
  cluster_ca_certificate = "${base64decode(azurerm_kubernetes_cluster.main.kube_config.0.cluster_ca_certificate)}"
}

Затем вы можете создать Kubernetes namespace или секрет с терраформ.

...