谷歌云跑:服务能知道自己的url吗?

时间:2021-01-08 12:20:08

标签: google-cloud-run

我想知道部署在 cloud run 上的容器是否可以以某种方式获取自己的服务 url 还是不可能?

我想知道这一点,因为我想要一个为自己创建谷歌云任务的云运行工作者。

如果可以,怎么做?

3 个答案:

答案 0 :(得分:1)

我写了an article to self call Cloud Run service to prevent Cold Start。我用 Go 写的代码在 my github

这个想法是调用元数据服务器来查找项目编号和区域(像这样你没有这个硬编码或在 env var 中),然后你调用命名空间 API。

如果您需要帮助以其他语言编写它,请告诉我。

答案 1 :(得分:0)

如果您知道服务名称,则可以向 https://{endpoint}/apis/serving.knative.dev/v1/{name} 发出 GET HTTP 请求

Method: namespaces.services.get

例如:

curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)"  https://us-central1-run.googleapis.com/apis/serving.knative.dev/v1/namespaces/your-project/services/your-service| grep url

"url": "https://cloud-run-xxxxxxxxxx-uc.a.run.app"

答案 2 :(得分:0)

使用namespaces.services.get获取云运行服务信息,这个api需要的一些信息

  1. 服务名称

    Cloud Run 提供了 default environment variable K_SERVICE

  2. 项目 ID

  3. 地区

  4. 访问令牌

项目 ID、地区和访问令牌可以从 metadata server

中检索
PROJECT_ID=$(curl "http://metadata.google.internal/computeMetadata/v1/project/project-id" -H "Metadata-Flavor: Google")
REGION=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/region" -H "Metadata-Flavor: Google" | sed "s/.*\///")
TOKEN=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google" | jq -r '.access_token')

然后你可以使用namespaces.services.get在json中检索云运行服务信息,使用jqexport环境变量提取url供应用程序使用

export PUCLIC_URL=$(curl -s "https://${REGION}-run.googleapis.com/apis/serving.knative.dev/v1/namespaces/${PROJECT_ID}/services/${K_SERVICE}" -H "Authorization: Bearer ${TOKEN}" | jq -r '.status.url')

curljq 可能需要安装,对于 alpine:apk add --no-cache curl jq

Cloud Run 服务帐户需要 run.services.get 权限才能调用 namespaces.services.get