[英]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)}"
}
最終讓這個工作,沒有任何要求使用 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 屬性代替
使用:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.