如何使用cloudbuild.yaml在GCP上配置redis?

3
我正在尝试在GCP上设置CI/CD管道。我有一个使用redis作为数据库的nodejs应用程序。我正在尝试在GCP上配置redis。以下是我尝试过的配置,但一旦执行redis步骤,它会一直等待redis连接,不会进入下一步,过一段时间后就会超时。Cloudbuild.yaml文件如下: steps: - name: 'gcr.io/cloud-builders/npm' args: ['install'] - name: 'redis' env: ['REDISHOST=127.0.0.1', 'REDISPORT=6379'] - name: 'gcr.io/cloud-builders/npm' args: ['test'] - name: "gcr.io/cloud-builders/gcloud" args: ["app deploy"] 错误日志:

错误:上下文超时 超时 完成步骤#1 步骤#1:1:M 06 Sep 2019 18:43:09.317#Redis现在已准备好退出,再见... 步骤#1:1:M 06 Sep 2019 18:43:09.317 *数据库已保存到磁盘 步骤#1:1:M 06 Sep 2019 18:43:09.312 *退出之前保存最终的RDB快照。 步骤#1:1:M 06 Sep 2019 18:43:09.312#用户请求关闭... 步骤#1:1:signal-handler(1567795389)收到SIGTERM调度关机... 步骤#1:1:M 06 Sep 2019 18:33:38.595 *准备接受连接 步骤#1:1:M 06 Sep 2019 18:33:38.595#警告:内核中启用了透明大页面(THP)支持。这将导致Redis出现延迟和内存使用问题。要解决此问题,请以root身份运行命令“echo never > /sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到/etc/rc.local中,以保留设置在重新启动后。 THP禁用后必须重新启动Redis。 步骤#1:1:M 06 Sep 2019 18:33:38.595#警告:overcommit_memory设置为0!低内存条件下,后台保存可能失败。要解决此问题,请将'vm.overcommit_memory = 1'添加到/etc/sysctl.conf中,然后重新启动或运行命令'sysctl vm.overcommit_memory=1'以使其生效。 步骤#1:1:M 06 Sep 2019 18:33:38.595#服务器已初始化 步骤#1:1:M 06 Sep 2019 18:33:38.595#警告:无法强制执行511的TCP后备设置,因为/proc/sys/net/core/somaxconn设置为较低的值128。 步骤#1:1:M 06 Sep 2019 18:33:38.594 *运行模式=独立,端口=6379。 步骤#1:1:C 06 Sep 2019 18:33:38.592#警告:未指定配置文件,请使用默认配置。要指定配置文件,请使用redis-server / path / to / redis.conf 步骤#1:1:C 06 Sep 2019 18:33:38.592#Redis版本=5.0.5,位=64,提交=00000000,修改=0,pid = 1,刚开始 步骤#1:1:C 06 Sep 2019 18:33:38.592#oO0OoO0OoO0Oo Redis正在启动oO0OoO0OoO0Oo 步骤#1:docker.io/library/redis:latest 步骤#1:状态:已下载更新的映像以获取redis:latest 步骤#1:摘要:sha256:0e67625224c1da47cb3270e7a861a83e332f708d3d89dde0cbed432c94824d9a 步骤#1:93e8c2071125:拉取完成 步骤#1:8e4f9890211f:拉取完成 步骤#1:8a9a85c968a2:拉取完成 步骤#1:c1b01f4f76d9:拉取完成

2个回答

1
在Google Cloud Build中,每个步骤都在一个单独的Docker容器中依次执行。在您的情况下,第二个步骤启动Redis容器并等待连接。构建会“卡住”并超时。
在这种情况下,您可以使用Docker Compose在后台运行Redis容器。您的cloudbuild.yaml文件可能如下所示:
steps:
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']
- name: 'docker/compose:1.24.1' # you can use the version of your choice
  args: ['up', '-d']
- name: 'gcr.io/cloud-builders/npm'
  args: ['test']
  env:
  - 'HOST=redis' # name of the running container
  - 'PORT=6379'
- name: "gcr.io/cloud-builders/gcloud"
  args: ['app', 'deploy'] # NOTE THAT YOU HAVE TO PROVIDE THIS AS 2 PARAMETERS

您的docker-compose.yml文件可能如下所示:

version: '3'
services:
  redis:
    image: redis
    network_mode: cloudbuild
    container_name: redis
    expose:
      - 6379

请注意network_mode: cloudbuild的配置。如此处所述:“每个构建步骤都会将其容器附加到名为cloudbuild的本地Docker网络上运行”。我们指示Docker Compose在此网络中运行redis容器,以便它们可以通信。

我尝试了你的配置。我得到了“无效构建:无效的.steps.env字段:构建步骤1 100”。 - Sayyad Ali Khan
我的错误。在步骤1中应该是“args”而不是“env”。我已经更新了我的回答。 - LundinCast
我已经更新了我的答案,并添加了一些额外的信息。在我的端上成功测试,使用示例nodejs代码:https://github.com/GoogleCloudPlatform/nodejs-docs-samples/tree/master/appengine/redis - LundinCast

-1

我做了一些谷歌搜索,发现了几个其他的堆栈溢出案例,都涉及到你错误中的警告信息。具体来说,这三条信息:

Step #1: 1:M 06 Sep 2019 18:33:38.595 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

Step #1: 1:M 06 Sep 2019 18:33:38.595 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

Step #1: 1:M 06 Sep 2019 18:33:38.595 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

我找到了以下几种情况:

什么情况下需要关闭Redis的透明巨页功能

解决Ubuntu 16.04上EC2上的Redis警告:关于overcommit_memory和Transparent Huge Pages问题

redis.conf中的“tcp-backlog”是什么意思

你的问题可能与启用了透明巨页(THP)有关。

请按照“什么情况下需要关闭Redis的透明巨页功能”的文章中的答案操作,应该就可以解决了。此外,这里还有Redis的延迟故障排除指南。

https://redis.io/topics/latency


我该如何在GCP云构建服务中为Redis配置THP关闭? - Sayyad Ali Khan
1
我不明白这个答案和问题有什么关联。问题不在于错误信息(CI最终会停止Redis),而在于Redis没有在后台启动。 - akauppi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接