从 terraform helm_release 资源获取 redis 主机 url

Get redis host url from terraform helm_release resource

我正在使用 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] Unhandled error event: Error: getaddrinfo ENOTFOUND redis-dev-master at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26) [ioredis] Unhandled error event: Error: getaddrinfo ENOTFOUND

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

如何从 helm_releaserelease 创建的任何基础服务中获取 redis 主机?

我已尝试调试 pinging 我的 app 部署中的特定 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

也许您只是使用了错误的 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
  }
}