[英]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.