我正在从GKE旋转一个容器(pod / Job)。
我已经在群集的VM上设置了适当的服务帐户。
因此,当我手动对特定的CloudRun服务端点执行@override
void setState(fn) {
if (mounted) {
super.setState(fn);
}
}
时,我可以执行请求(并获得授权并在响应中包含curl
)< / p>
但是,当我尝试通过按如下所示将图像设置为在200
中运行来实现自动化时,我得到了Job
401
以下是 - name: pre-upgrade-job
image: "google/cloud-sdk"
args:
- curl
- -s
- -X
- GET
- -H
- "Authorization: Bearer $(gcloud auth print-identity-token)"
- https://my-cloud-run-endpoint
Stackdriver
我的问题是我如何查看“身份验证”标头是否确实到达端点(日志对我没有多大启发),如果可以,是否在图像命令/参数调用时适当地呈现了它。
答案 0 :(得分:1)
在您的工作中,gcloud auth print-identity-token
可能不会返回任何令牌。
原因是在本地,gcloud使用您的身份铸造令牌,但是在Job中,您没有登录gcloud。
答案 1 :(得分:1)
在工作中,您使用此容器google/cloud-sdk
,该容器是gcloud
工具的全新安装。它是通用的,没有任何自定义。
调用此$(gcloud auth print-identity-token)
时,您会要求使用gcloud
工具中配置的服务帐户的身份令牌。
如果我们将这两段放在一起,则您想从gcloud
工具的通用/空白安装中生成一个身份令牌。顺便说一下,您没有在gcloud
中定义服务帐户,并且令牌为空(如@johnhanley所说)。
要解决此问题,请添加这样的环境变量
env:
- GOOGLE_APPLICATION_CREDENTIAL=<path to your credential.json>
我不知道您当前的运行环境credential.json
在哪里。尝试执行此环境变量的echo
来找到它并将其正确转发到您的gcloud
工作。
如果您使用的是与元数据服务器兼容的计算引擎或类似系统,则可以使用以下命令获取正确的令牌:
curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=<URL of your service>"
更新
尝试在gcloud
容器之外运行命令。这是您的工作更新
- name: pre-upgrade-job
image: "google/cloud-sdk"
entrypoint: "bash"
args:
- -c
- "curl -s -X GET -H \"Authorization: Bearer $(gcloud auth print-identity-token)\" https://my-cloud-run-endpoint"
不确定是否可行。让我知道