从 terraform helm_release 资源获取 redis 主机 url

Posted

技术标签:

【中文标题】从 terraform helm_release 资源获取 redis 主机 url【英文标题】:Get redis host url from terraform helm_release resource 【发布时间】:2022-01-17 17:35:27 【问题描述】:

我正在使用 Terraform helm_release 资源在我的 K8s 集群中安装 bitnami/redis 实例。

代码如下所示:

resource "helm_release" "redis-chart" 
  name = "redis-$var.env"

  repository = "https://charts.bitnami.com/bitnami"
  chart      = "redis"
  namespace  = "redis"
  create_namespace = true

  set 
    name  = "auth.enabled"
    value = "false"
  

  set 
    name  = "master.containerPort"
    value = "6379"
  

  set 
    name  = "replica.replicaCount"
    value = "2"
  

它成功完成并在一个单独的目录中我有我的app terraform 配置。 在app的配置中,我想从上面的helm_release获取redis主机。

我是这样做的:

data "kubernetes_service" "redis-master" 
  metadata 
    name      = "redis-$var.env-master"
    namespace = "redis"
  

然后在kubernetes_secret 资源中,我将数据传递给我的app 部署:

resource "kubernetes_secret" "questo-server-secrets" 
  metadata 
    name      = "questo-server-secrets-$var.env"
    namespace = kubernetes_namespace.app-namespace.metadata.0.name
  

  data = 
    REDIS_HOST            = data.kubernetes_service.redis-master.metadata.0.name
    REDIS_PORT            = data.kubernetes_service.redis-master.spec.0.port.0.port
  

但不幸的是,当我运行应用程序 deployment 时,我得到了以下日志:

[ioredis] 未处理的错误事件:错误:getaddrinfo ENOTFOUND redis-dev-master 在 GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26) [ioredis] 未处理的错误事件:错误:getaddrinfo ENOTFOUND

这表明redis-dev-master 不是redis 实例的正确主机。

如何从helm_releaserelease 创建的任何底层服务获取redis 主机?

我已尝试从我的 app 部署中调试并 pinging 一个特定的 pod。

作为参考,这些是我的redis资源:

NAME                       READY   STATUS    RESTARTS   AGE
pod/redis-dev-master-0     1/1     Running   0          34m
pod/redis-dev-replicas-0   1/1     Running   1          34m
pod/redis-dev-replicas-1   1/1     Running   0          32m

NAME                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/redis-dev-headless   ClusterIP   None             <none>        6379/TCP   34m
service/redis-dev-master     ClusterIP   172.20.215.60    <none>        6379/TCP   34m
service/redis-dev-replicas   ClusterIP   172.20.117.134   <none>        6379/TCP   34m

NAME                                  READY   AGE
statefulset.apps/redis-dev-master     1/1     34m
statefulset.apps/redis-dev-replicas   2/2     34m

【问题讨论】:

你为什么不试试data.kubernetes_service.redis-master.spec.cluster_ip 听起来 DNS 在 Terraform 执行的任何地方都无法为您解析。该错误消息也看起来像 Redis 抛出的错误,而不是 Terraform 或 Terraform-Kubernetes 提供者抛出的错误,这有助于缩小根本原因。 是的,@Hackerman,我就是这么做的,如果你把它写成答案,我很乐意为可能偶然发现它的其他人投票。 【参考方案1】:

也许您只是使用了错误的attribute 来获取该信息。检查Terraform Registry Website 的文档,我们可以使用 cluster_ip 属性,如 spec 文档描述中所述。 所以你应该得到类似的结果:

data.kubernetes_service.redis-master.spec.cluster_ip

最后得到以下结果:

resource "kubernetes_secret" "questo-server-secrets" 
  metadata 
    name      = "questo-server-secrets-$var.env"
    namespace = kubernetes_namespace.app-namespace.metadata.0.name
  

  data = 
     REDIS_HOST            = data.kubernetes_service.redis-master.spec.cluster_ip
     REDIS_PORT            = data.kubernetes_service.redis-master.spec.port
  

【讨论】:

以上是关于从 terraform helm_release 资源获取 redis 主机 url的主要内容,如果未能解决你的问题,请参考以下文章

卡在 Terraform 到 Kubernetes 的部分 helm 版本中

具有地形和头盔的外部部署配置

如何将变量传递给 heml.tf 中的 yaml 文件?

使用 terraform-config-inspect 从 terraform 中提取原始(非字符串)参数值

如何从 terraform 状态中删除资源?

Terraform:如何从数据类型中获取元素