问题描述
在使用Terraform时,遇到了一个问题。他的工作流程是创建一个集群,使用Helm安装ingress,并在准备好后获取负载均衡器的IP地址,以更新CF DNS记录。他将所有这些步骤都放在一个脚本中。
在创建nginx-ingress控制器后,他尝试获取负载均衡器的IP地址。他尝试使用kubernetes_service
数据提供程序来获取负载均衡器的IP地址,但始终无法成功。他发现问题的原因是它尝试连接到本地主机,然后他找到了这个限制。
警告:当使用插值将凭据从其他资源传递给Kubernetes提供程序时,这些资源不应该在同一个Terraform模块中创建。这将导致间歇性和不可预测的错误,很难进行调试和诊断。根本问题在于Terraform自身评估提供程序块与实际资源的顺序。请参考Terraform文档的这一部分以获取进一步的解释。
然后,用户将kubernetes
提供程序移动到了另一个模块中,但现在他遇到了新的问题。
注意:在模块中,不能使用
count
、for_each
或depends_on
来配置提供程序。
没有使用depends_on
时,network
模块与cluster
同时调用,这当然会导致失败,因为对于network
模块来说,cluster
应该是准备好的。所以这是一个死循环,用户不知道如何打破它。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据提供的问答数据,我们可以得出以下解决方案:
根据Terraform的提供者文档,它需要在计划时配置提供者,因此在provider "kubernetes"
块中的所有内容在计划时必须是已知的。这意味着您不能在其中使用尚未创建的任何内容。
文档试图告诉您,您需要将声明Kubernetes集群的配置与配置或使用Kubernetes集群的所有其他配置分开,并且首先使用terraform apply
创建集群,然后使用kubernetes提供者分别terraform apply
与之交互的其他配置。
方案2
用户在评论中提到了他找到了解决方案。他不再使用config_file
,而是使用host
、token
和ca
,并且这样可以正常工作。
以上是解决这个问题的两种方案。您可以根据自己的需求选择其中一种方案来解决您的问题。
希望这些解决方案对您有所帮助!如果您还有其他问题,请随时提问。