等待条件时terraform头盔释放超时

Mat*_*ble 11 terraform kubernetes-helm terraform-provider-azure azure-aks nginx-ingress

我正在使用terraform在azure中预配置一些资源,但似乎无法掌控安装nginx-ingress,因为它等待状态超时

  • helm_release.nginx_ingress:发生1个错误:

  • helm_release.nginx_ingress:rpc错误:代码=未知desc =发布nginx-ingress失败:等待条件超时

面对错误,Terraform不会自动回滚。相反,您的Terraform状态文件已使用成功完成的所有资源进行了部分更新。请解决以上错误,然后再次应用以逐步更改您的基础架构。主文件

data "azurerm_public_ip" "nginx_ingress" {
    name                = "xxxx-public-ip"
    resource_group_name = "xxxx-public-ip"
}

resource "azurerm_resource_group" "xxxx_RG" {
  name     = "${var.name_prefix}"
  location = "${var.location}"
}

resource "azurerm_kubernetes_cluster" "k8s" {
    name                    = "${var.name_prefix}-aks"
    kubernetes_version      = "${var.kubernetes_version}"
    location                = "${azurerm_resource_group.xxxx_RG.location}"
    resource_group_name     = "${azurerm_resource_group.xxxx_RG.name}"
    dns_prefix              = "AKS-${var.dns_prefix}"

    agent_pool_profile {
        name                = "${var.node_pool_name}"
        count               = "${var.node_pool_size}"
        vm_size             = "${var.node_pool_vmsize}"
        os_type             = "${var.node_pool_os}"
        os_disk_size_gb     = 30
    }

    service_principal {
        client_id           = "${var.client_id}"
        client_secret       = "${var.client_secret}"
    }

    tags = {
        environment = "${var.env_tag}"
    }
}

provider "helm" {
  install_tiller = true

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

# Add Kubernetes Stable Helm charts repo
resource "helm_repository" "stable" {
  name = "stable"
  url  = "https://kubernetes-charts.storage.googleapis.com"
}

# Install Nginx Ingress using Helm Chart
resource "helm_release" "nginx_ingress" {
  name       = "nginx-ingress"
  repository = "${helm_repository.stable.metadata.0.name}"
  chart      = "nginx-ingress"
  wait       = "true"

  set {
    name  = "rbac.create"
    value = "false"
  }

  set {
    name  = "controller.service.externalTrafficPolicy"
    value = "Local"
  }

  set {
    name  = "controller.service.loadBalancerIP"
    value = "${data.azurerm_public_ip.nginx_ingress.ip_address}"
  }
}
Run Code Online (Sandbox Code Playgroud)

然后用这个部署我的应用程序

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

resource "kubernetes_deployment" "flask_api_deployment" {
    metadata {
        name = "flask-api-deployment"
    }

    spec {
        replicas = 1
        selector {
            match_labels {
                component = "api"
            }
        }

        template {
            metadata {
                labels = {
                    component = "api"
                }
            }

            spec {
                container {
                    image = "xxxx.azurecr.io/sampleflask:0.1.0"
                    name = "flask-api"
                    port {
                        container_port = 5000
                    }
                }
            }
        }
    }
}

resource "kubernetes_ingress" "flask_api_ingress_service" {
    metadata {
        name = "flask-api-ingress-service"
    }

    spec {
        backend {
            service_name = "flask-api-cluster-ip-service"
            service_port = 5000
        }
    }
}

resource "kubernetes_service" "flask_api_cluster_ip-service" {
    metadata {
        name = "flask-api-cluster-ip-service"
    }

    spec {
        selector {
            component = "api"
        }

        port {
            port = 5000
            target_port = 5000
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定它在等待什么条件。我可以将超时设置得更大一些,但这似乎无济于事。我还可以在掌舵版本中设置wait = false,但是似乎没有资源可供配置。

编辑:从一些测试中我已经完成,我看到在helm版本中指定loadbalancerIP时存在问题。如果我发表评论,它就很好了。

编辑:从更多的测试,我发现创建的负载平衡器无法创建。控制器:在资源组MC_xxxxxxxx中找不到用户提供的IP地址52.xxx.x.xx

所以我想问题是我如何允许从其他资源组指定IP?

Cha*_* Xu 5

要通过 Terraform 中的 helm 在 AKS 集群中安装 nginx-ingress,我在这里展示了一种可用的方法。这样,您需要在要运行 terraform 脚本的机器上安装 helm。然后你还需要将 helm 配置到你的 AKS 集群。将helm 配置为 AKS 中的步骤。您可以通过在 AKS 上安装一些东西来检查 helm 是否配置为 AKS。

当一切准备就绪。您只需要设置 helm provider 并使用资源helm_release。用于安装 nginx-ingress 的 Terraform 脚本显示在此处:

provider "helm" {
  version = "~> 0.9"
}

resource "helm_release" "ingress" {
    name = "application1"
    chart = "stable/nginx-ingress"
    version = "1.10.2"
    namespace = "ingress-basic"

    set {
        name = "controller.replicaCount"
        value = "1"
    }

    ...

}
Run Code Online (Sandbox Code Playgroud)

该过程显示在此处:

在此处输入图片说明

这只是为了在 Terraform 中通过 helm 安装 nginx-ingress。如果你想创建 kubernetes 的资源。您可以在 Terraform 中使用 kubernetes。

更新

好的,要将另一个资源组中的静态公共 IP 用于您的入口,您还需要执行两个步骤。

  1. AKS 群集使用的服务主体必须将权限委派给公共 IP 所在的其他资源组。权限至少应为“网络贡献者”。
  2. 使用公共IP所在的资源组的值设置入口服务注释。

yaml 文件中的注释是这样的:

annotations:
    service.beta.kubernetes.io/azure-load-balancer-resource-group: myResourceGroup
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅在节点资源组之外使用静态 IP 地址

更新1:

“helm_release”中的代码:

resource "helm_release" "ingress" {
    name = "application1223"
    chart = "stable/nginx-ingress"
        version = "1.10.2"
    namespace = "ingress-basic"

    set {
        name = "controller.replicaCount"
        value = "1"
    }

    set {
      name = "controller.service.annotations.\"service\\.beta\\.kubernetes\\.io/azure-load-balancer-resource-group\""
      value = "v-chaxu-xxxx"
    }

    set {
      name = "controller.service.loadBalancerIP"
      value = "13.68.175.40"
    }

}
Run Code Online (Sandbox Code Playgroud)

部署成功后,入口服务显示如下:

在此处输入图片说明

另一个资源组中的公共IP信息:

在此处输入图片说明