如何在Terraform中使用kubernetes_service数据提供程序

21次阅读
没有评论

问题描述

在使用Terraform时,遇到了一个问题。他的工作流程是创建一个集群,使用Helm安装ingress,并在准备好后获取负载均衡器的IP地址,以更新CF DNS记录。他将所有这些步骤都放在一个脚本中。
在创建nginx-ingress控制器后,他尝试获取负载均衡器的IP地址。他尝试使用kubernetes_service数据提供程序来获取负载均衡器的IP地址,但始终无法成功。他发现问题的原因是它尝试连接到本地主机,然后他找到了这个限制。

警告:当使用插值将凭据从其他资源传递给Kubernetes提供程序时,这些资源不应该在同一个Terraform模块中创建。这将导致间歇性和不可预测的错误,很难进行调试和诊断。根本问题在于Terraform自身评估提供程序块与实际资源的顺序。请参考Terraform文档的这一部分以获取进一步的解释。

然后,用户将kubernetes提供程序移动到了另一个模块中,但现在他遇到了新的问题。

注意:在模块中,不能使用countfor_eachdepends_on来配置提供程序。

没有使用depends_on时,network模块与cluster同时调用,这当然会导致失败,因为对于network模块来说,cluster应该是准备好的。所以这是一个死循环,用户不知道如何打破它。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据提供的问答数据,我们可以得出以下解决方案:
根据Terraform的提供者文档,它需要在计划时配置提供者,因此在provider "kubernetes"块中的所有内容在计划时必须是已知的。这意味着您不能在其中使用尚未创建的任何内容。
文档试图告诉您,您需要将声明Kubernetes集群的配置与配置或使用Kubernetes集群的所有其他配置分开,并且首先使用terraform apply创建集群,然后使用kubernetes提供者分别terraform apply与之交互的其他配置。

方案2

用户在评论中提到了他找到了解决方案。他不再使用config_file,而是使用hosttokenca,并且这样可以正常工作。

以上是解决这个问题的两种方案。您可以根据自己的需求选择其中一种方案来解决您的问题。

希望这些解决方案对您有所帮助!如果您还有其他问题,请随时提问。

正文完