【发布时间】:2021-01-08 12:20:08
【问题描述】:
我想知道部署在云上运行的容器是否可以通过某种方式获取自己的服务 url 或者是不可能的?
我想知道这一点,因为我想要一个为自己创建谷歌云任务的云运行工作者。
如果可以,怎么做?
【问题讨论】:
标签: google-cloud-run
我想知道部署在云上运行的容器是否可以通过某种方式获取自己的服务 url 或者是不可能的?
我想知道这一点,因为我想要一个为自己创建谷歌云任务的云运行工作者。
如果可以,怎么做?
【问题讨论】:
标签: google-cloud-run
我写了an article to self call Cloud Run service to prevent Cold Start。我用 Go 写的代码在my github
这个想法是调用元数据服务器来找到项目编号和区域(像这样你没有这个硬编码或在 env var 中),然后你调用命名空间 API。
如果您需要其他语言的帮助,请告诉我。
【讨论】:
undefined for service.status.url(在nodejs中)
如果您知道服务名称,则可以向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"
【讨论】:
使用namespaces.services.get获取云运行服务信息,该api需要的一些信息
服务名称
Cloud Run 提供了default environment variableK_SERVICE
项目编号
地区
访问令牌
项目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中的云运行服务信息,提取带有jq、export环境变量的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')
curl 和 jq 可能需要安装,对于 alpine:apk add --no-cache curl jq
Cloud Run 服务帐号需要run.services.get 权限才能调用namespaces.services.get
【讨论】: