当前位置: 首页 > 知识库问答 >
问题:

从terraform helm\u发布资源获取redis主机url

吴炎彬
2023-03-14

我正在使用Terraform helm\u 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"
  }
}

它成功地完成了,在一个单独的目录中,我有我的应用程序terraform配置。在app配置中,我想从上面的helm\u版本获取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
  }
}

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

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

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

如何从helm\u release或其创建的任何底层服务获取redis主机?

我已尝试从我的应用程序部署中调试和ping特定的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

共有1个答案

翟宾实
2023-03-14

可能您只是使用了错误的属性来获取该信息。查看Terraform Registry网站上的文档,我们可以使用spec文档描述中描述的cluster\u ip属性。因此,您应该以以下方式结束:

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
  }
}
 类似资料:
  • 问题内容: 我正在使用以下方法从WildFly中的WAR文件获取资源: 当应用程序作为爆炸式WAR部署时,它可以工作。 它也曾经 与压缩的WAR一起 使用 。昨天,我在Eclipse中进行了项目的干净和重建,但它刚刚停止工作。 当我检查资源根目录时: 我得到这个: 因此,难怪它不起作用。它可能与JBoss模块加载有关,但是我不知道这是错误还是正常行为。 我在StackOverflow上发现了各种类

  • I am not a number. "The Prisoner" — Number Six 将机器搬来搬去是很常见的做法,尤其是在云的基础设施中搬动,所以一个特定主机的 IP 经常会改变。 正因为如此,在你的配置中使用硬编码的 IP 地址显然是个坏主意。 如果一台机器要访问另一台(例如,一个应用服务器需要访问一台数据库服务器), 那么使用主机名而不是 IP 地址会更好。 然而,如何映射主机名到

  • 问题内容: 我正在尝试使用jdbcTemplate连接到Java中的数据库,并且开始出现以下错误。我已经使用Google搜索了很长时间,发现的所有解决方案都无法解决我的问题。我尝试了几种不同的数据库(SQLServer和MySQL),但没有一个起作用。 这是我的属性文件: webapp / WEB-INF / applicationContext-database.xml: DAO类: 问题答案:

  • 问题内容: 我正在尝试使用哨兵来获取我的主服务器的连接地址,问题是哨兵仅在故障转移时发送该地址,但是如果我的主服务器关闭并且从属服务器被提升为主服务器并且我的应用程序刚刚启动,则不会知道并且不会收到有关原始主服务器已关闭的消息,是否有任何方法可以与哨兵通信,并询问他认为主服务器正在使用C#servicestack redis客户端的人? 问题答案: 不得不这样做,我使用下一个代码段模仿了redis

  • 我正在尝试使用sentinel来获取我的主机的连接地址,问题是sentinel只在故障转移时发送地址,但如果我的主机关闭,而从机被提升为master,而我的应用程序刚刚启动,它将不知道也不会得到原始主机关闭的消息,有没有办法与sentinel通信,并询问他认为master使用的是C#servicestack redis客户机?

  • 这里有一个案例:我有身份服务器、客户端应用程序和资源(API)。身份服务器在endpoint超文本传输协议://身份服务器: 8080/连接/用户信息上提供用户信息。如果您发送带有有效访问令牌的请求,您将获得有关用户的其他信息。如果我需要有关资源的这些信息,我将如何获得它。我有两个想法: 通过客户端获取用户信息。(客户端在userinfoendpoint上发送请求并获取信息,然后使用请求调用API