【问题标题】:Dockerized GAE app fails to connect to Redis instanceDockerized GAE 应用无法连接到 Redis 实例
【发布时间】:2021-06-07 10:41:53
【问题描述】:

我正在将 GoLang 聊天服务器部署到 Google App Engine 灵活,同时通过 vpc_access_connector 连接到 Google Cloud 中的 Redis 实例

翻遍了一堆官方资源和SO posts无济于事。

基本上,我对我的 golang 应用程序进行了 docker 化,它能够很好地连接到本地 Redis 主机。然后,我继续使用以下命令将其部署到 Google Cloud,但 Google 抛出了拨号错误。

我需要在 docker 端进行任何其他设置以启用网络连接吗?还是其他原因?

部署错误

这个内部 IP 10.177.235.139:6379 是 Google 在创建 Redis 实例后返回的。请注意,在将其部署到 Google App Engine 之前,我已在我的应用程序中替换了此 IP。

应用和 Redis 实例都在同一个默认网络和同一个区域中。

{"level":"error","addr":"10.177.235.139:6379","error":"dial tcp 10.177.235.139:6379: i/o timeout","time":"2021-06-07T10:30:31Z","message":"error dialing to Redis"}

构建命令

# create a redis instance
gcloud redis instances create prulia-redis --size=2 --region=asia-southeast1 --redis-version=redis_4_0

# get internal ip
gcloud redis instances describe prulia-redis --region=asia-southeast1

# enable serverless vpc api
gcloud services enable vpcaccess.googleapis.com

# create a vpc connector
gcloud compute networks vpc-access connectors create prulia-redis-connector --network default \
    --region asia-southeast1 --range 10.10.0.0/28

# check cpnnector status
gcloud compute networks vpc-access connectors describe prulia-redis-connector --region asia-southeast1

# create firewall rule for port 6379
gcloud compute firewall-rules create firewall-redis --network default --allow tcp:6379

# deploy application
gcloud app deploy

app.yaml

请注意,我没有在此处包含环境,因为应用程序运行配置文件。

runtime: custom

env: flex

service: chat

manual_scaling:
  instances: 1

resources:
  cpu: 2
  memory_gb: 6
  disk_size_gb: 20
  volumes:
  - name: ramdisk1
    volume_type: tmpfs
    size_gb: 2.5
    
network:
  forwarded_ports:
    - 6379/tcp

vpc_access_connector:
  name: projects/pruliaagm/locations/asia-southeast1/connectors/prulia-redis-connector

Dockerfile

FROM golang:1.15

RUN apt-get install -y ca-certificates

ADD . /app

WORKDIR /app

RUN make build

EXPOSE 8080 6379

CMD ["/app/chat-server"]

【问题讨论】:

  • 请提供您要连接到 Redis 的代码 sn-p。
  • @DebdutGoswami 就是一个普通的简单的golang redis拨号方法向内部IP发出请求,不要以为和代码有什么关系
  • 拨号地址是如何得出的,我认为这是@Debdut 的目标。这很可能是 DNS 问题。

标签: docker go google-cloud-platform redis gcloud


【解决方案1】:

根据您提供的描述,您提到 AppEngine 和 Redis 实例位于同一区域。但是,根据 Google 公开文档[1],AppEngine 在“asia-southeast1”中不可用。 App Engine 应用程序必须与 Redis 实例位于同一区域并位于同一网络中,才能获得访问 Redis 实例的授权。

我建议您点击链接[2] 来配置 app.yml 文件。

[1]。 https://cloud.google.com/about/locations#asia-pacific
[2]。 https://cloud.google.com/appengine/docs/flexible/python/reference/app-yaml

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2021-04-05
    • 2014-07-04
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多