簡體   English   中英

在 Azure 中使用 terraform 創建后如何自動對 kubernetes 集群進行身份驗證?

[英]How to automatically authenticate against the kubernetes cluster after creating it with terraform in Azure?

題:

我嘗試通過 terraform 創建 kubernetes 集群、命名空間和機密。 集群創建成功,但是建立在集群上的資源創建失敗。

背景資料

錯誤信息:

這是在kubernetes集群創建后,要創建namespace時terraform拋出的錯誤信息:

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 apply未完成的 terraform 更改來解決此問題:

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

自動解決方法嘗試:

我嘗試自動執行此身份驗證步驟失敗。 我在 kubernetes 集群的定義中嘗試了本地 exec 配置器,但沒有成功:

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 集群的資源,而無需手動身份驗證?

對於您的要求,我認為您可以將 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 群集創建完成后。 然后你再次通過 Terraform 創建你的命名空間。

這樣,您就不需要手動進行身份驗證。 只需執行 Terraform 代碼。

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)}"
}

然后您可以使用 Terraform 創建 Kubernetes 命名空間機密

最終讓這個工作,沒有任何要求使用 AZ LOGIN 或 AZ AKS GET-CREDENTIALS null_resource 或 local-exec 供應商,如上面建議的等。

而是使用 main.tf 中的數據塊來獲取 AKS 集群(來自 AKS 模塊的輸出),並使用來自 DATA 的 KUBE ADMIN CONFIG 作為 Kubernetes Provider 塊的憑據。 見下文:

  data "azurerm_kubernetes_cluster" "aks" {
  name                = local.aks_cluster_name
  resource_group_name = module.infra_resource_group.rg.name

  depends_on = [
    module.aks.aks_cluster
  ]
}

  provider "kubernetes" {
  host                   = data.azurerm_kubernetes_cluster.aks.kube_admin_config.0.host
  client_certificate     = base64decode(data.azurerm_kubernetes_cluster.aks.kube_admin_config.0.client_certificate)
  client_key             = base64decode(data.azurerm_kubernetes_cluster.aks.kube_admin_config.0.client_key)
  cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.aks.kube_admin_config.0.cluster_ca_certificate)
}

注意:發現在 Kubernetes Provider 塊中使用 KUBE_CONFIG 不起作用。 它需要更高的權限,因此為什么使用 KUBE_ADMIN_CONFIG 屬性代替

使用:

  • Terraform v0.15.0
  • AzureRM 提供程序 2.60.0
  • Kubernetes 提供者 2.2.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM