从 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_release
或release
创建的任何底层服务获取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 版本中