我正在尝试使用 Cloud Tasks 调用 Cloud Run 服务,如此处文档中所述。
我有一个正在运行的 Cloud Run 服务。如果我公开该服务,它就会按预期运行。
我创建了一个云队列,并使用本地脚本安排云任务。这个是用我自己的账号。脚本看起来像这样
from google.cloud import tasks_v2
client = tasks_v2.CloudTasksClient()
project = 'my-project'
queue = 'my-queue'
location = 'europe-west1'
url = 'https://url_to_my_service'
parent = client.queue_path(project, location, queue)
task = {
'http_request': {
'http_method': 'GET',
'url': url,
'oidc_token': {
'service_account_email': 'my-service-account@my-project.iam.gserviceaccount.com'
}
}
}
response = client.create_task(parent, task)
print('Created task {}'.format(response.name))
Run Code Online (Sandbox Code Playgroud)
我看到该任务出现在队列中,但它失败并立即重试。其原因(通过检查日志)是 Cloud Run 服务返回 401 响应。
我自己的用户具有“服务帐户令牌创建者”和“服务帐户用户”角色。它没有明确的“云任务入队”,但由于我能够在队列中创建任务,我想我已经继承了所需的权限。服务帐户“my-service-account@my-project.iam.gserviceaccount.com”(我在任务中使用它来获取 OIDC 令牌)具有以下角色:
所以我做了一个肮脏的伎俩:我为服务帐户创建了一个密钥文件,将其下载到本地,并通过使用密钥文件将帐户添加到我的 gcloud …
我正在为我的博客和工作网站使用 cloud run,我真的很喜欢它。我已经根据 google 教程通过容器化部署了 python API 和 Vue/Nuxt 应用程序。我不明白的一件事是为什么前面不需要 NGINX。
# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim
# Create and change to the app directory.
WORKDIR /usr/src/app
# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./
# Install production dependencies.
RUN npm install --only=production
# Copy …Run Code Online (Sandbox Code Playgroud) 我正在做的是在 Dockerfile 中的 RUN 命令中设置 sbcl 和 Quicklisp,然后使用 CMD 加载我的自定义代码。
当我在本地计算机上使用 Docker 运行它时,一切都很好,但是当我将其推送到“google run”时,lisp 代码(使用 CMD 加载)崩溃,因为它找不到 Quicklisp。
据我所知,这是因为 RUN (/root) 和 CMD (/home) 的 HOME 不同。
RUN 和 CMD 中是同一个用户 = uid=0(root) gid=0(root) groups=0(root)
我假设他们(谷歌运行)使用一些 linux 命令来更改用户的“用户上下文”(不知道用于 linux 的正确单词),但不知道他们为什么或如何这样做。因为我不知道他们这样做是什么或为什么,所以很难通过谷歌搜索解决方案。
欢迎大家提出意见。
要查看行为:
Dockerfile:
FROM phusion/baseimage
MAINTAINER Piet Pompies <piet@pompies.com>
RUN echo $HOME
CMD echo $HOME
Run Code Online (Sandbox Code Playgroud)
当您构建 $HOME 时,它将是 /root;当您部署并运行时,它将是 /home
编辑:我找到了解决方法(2020 年 6 月 12 日):
不确定我是否应该将解决方法放在答案中,或者只是像我在这里所做的那样进行编辑。将其保留在编辑中,直到另有通知为止。
解决方法:
您可以在 RUN 命令中转储核心并在 CMD 中使用它或使用 buildapp 来运行 lisp。buildapp 是您在最终版本中想要的。
完整的 woo 和 …
我已经使用 Cloud Build 等在 Google Cloud Run 上启动并运行了一个示例应用程序,并附带来自 GitHub 的 CD。我希望将不同的分支部署到不同的环境(开发、阶段产品等),但是文档没有暗示任何类型的设置。
我能想到的最简单的方法是在不同的分支 RegExes 上使用 Cloud Build 触发器设置单独的 Cloud Runs,但我想知道是否有更优雅的解决方案,因为这仍然感觉像是一种非常“手动”的方法来实现什么我想。
我找到了一个答案(如何让 Cloud Run 处理多个同时部署?),它证实这是一种已遵循的做法,但我只是想确认这是否确实是最好的方法,或者 GCP 是否提供了更好的方法这个目的。
我对 Google Cloud Run 以及整个 Google Cloud Platform 都是新手。
production-environment staging continuous-deployment google-cloud-platform google-cloud-run
部署使用 Uvicorn 和Tiangolo 的 Gunicorn+Uvicorn dockerized 的FastAPI 应用程序有什么区别?为什么我的结果表明,仅使用 Uvicorn 进行部署时我会得到比 Gunicorn+Uvicorn 更好的结果?
当我在 Tiangolo 的文档中搜索时,它说:
您可以使用 Gunicorn 来管理 Uvicorn 并运行多个这些并发进程。这样,您可以获得最佳的并发性和并行性。
由此,我可以假设使用这个 Gunicorn 会得到更好的结果吗?
这是我使用 JMeter 进行的测试。我将脚本部署到 Google Cloud Run,结果如下:
使用 Python 和 Uvicorn:
使用 Tiangolo 的 Gunicorn+Uvicorn:
这是我的 Python Dockerfile (Uvicorn):
FROM python:3.8-slim-buster
RUN apt-get update --fix-missing
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y libgl1-mesa-dev python3-pip git
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip3 install -U setuptools
RUN pip3 install --upgrade pip
RUN pip3 install -r ./requirements.txt …Run Code Online (Sandbox Code Playgroud) 我有一个 Flask 应用程序(使用 Dockerfile)部署到 Google Cloud Run。该应用程序的结构与Flask Mega 教程非常相似。它使用在 Cloud SQL 上运行的 Postgres 数据库。
该应用程序需要处理后台任务。看起来Celery或Redis Queue是最常见的方法。我不想使用Cloud Tasks ,因为它违反了12 要素应用程序范式中的开发/产品对等规则。
Redis Queue 在我的本地计算机上启动和运行很简单,但我在任何地方都找不到有关如何将 Redis Queue 与在 Cloud Run 上运行的 Flask 应用程序一起使用的最佳实践指南。
我决定为我的 Redis 实例使用 Google 的 Memorystore,但现在我不确定运行 Redis 工作线程的最佳方式是什么。我希望这些工作人员随着 Flask 服务器将更多任务添加到 Redis 队列而扩展(当发出越来越多的 HTTP 请求时 Cloud Run 扩展实例的方式)。现在,我正在考虑将一个工作程序(带有任务功能的 Flask 应用程序的副本)部署到 App Engine,但这似乎不是一个正确的解决方案。
人们对部署 RQ / celery 工作人员有何建议?我很高兴完全改变我的部署策略(和平台),以实现一个简单的、可扩展的架构,可以在本地开发设置中轻松复制。
我有一个云运行服务(不接收流量),我将最大实例和最小实例设置为 1,以便它始终运行。
部署新实例时,实例计数跳至 3。这是一个问题(我在实例启动时发出一些请求,如果两个实例同时发出这些请求,则会达到 429)。
为什么 CloudRun 实例计数超过我的最大值?
我可以确认我的设置是否正确,并且查看日志有两个新实例启动。
PS:Cloudrun确实有这个消息,这让我觉得我想做的事情是不可能的。我只是认为这是因为停机而不是额外的实例。
使用最大实例数为 3 或更少的修订可能会遇到意外停机。
我正在寻找与 Azure 中的 Cloud Run(GCP 产品)等效的产品
尤其:
Azure有这样的服务吗?
我正在研究 Azure App Service,但它似乎缺少缩小到 0 的能力。
azure google-cloud-platform azure-web-app-service google-cloud-run
Google Cloud Run 允许我为给定容器设置并发性,即在启动新容器之前它将服务的并发请求数。
我如何实际检查在任何给定时间有多少容器正在运行?Web 界面提到了哪些服务正在运行,但没有提到有多少服务,当我这样做时也是如此gcloud beta run services (list|describe)。