Kubernetes CloudRun:来自curl的调试身份验证错误
我正在从GKE旋转一个容器(吊舱/作业) 我已在集群的VM上设置了相应的服务帐户 因此,当我手动对特定CloudRun服务端点执行Kubernetes CloudRun:来自curl的调试身份验证错误,kubernetes,google-cloud-platform,escaping,google-cloud-run,Kubernetes,Google Cloud Platform,Escaping,Google Cloud Run,我正在从GKE旋转一个容器(吊舱/作业) 我已在集群的VM上设置了相应的服务帐户 因此,当我手动对特定CloudRun服务端点执行curl时,我可以执行请求(并获得授权,在响应中使用200) 然而,当我试图通过如下方式将图像设置为在作业中运行来实现自动化时,我得到了401 - name: pre-upgrade-job image: "google/cloud-sdk" args: - curl - -s
curl
时,我可以执行请求(并获得授权,在响应中使用200
)
然而,当我试图通过如下方式将图像设置为在作业中运行来实现自动化时,我得到了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
{
httpRequest: {
latency: "0s"
protocol: "HTTP/1.1"
remoteIp: "gdt3:r787:ff3:13:99:1234:avb:1f6b"
requestMethod: "GET"
requestSize: "313"
requestUrl: "https://my-cloud-run-endpoint"
serverIp: "212.45.313.83"
status: 401
userAgent: "curl/7.59.0"
}
insertId: "29jdnc39dhfbfb"
logName: "projects/my-gcp-project/logs/run.googleapis.com%2Frequests"
receiveTimestamp: "2019-09-26T16:27:30.681513204Z"
resource: {
labels: {
configuration_name: "my-cloud-run-service"
location: "us-east1"
project_id: "my-gcp-project"
revision_name: "my-cloudrun-service-d5dbd806-62e8-4b9c-8ab7-7d6f77fb73fb"
service_name: "my-cloud-run-service"
}
type: "cloud_run_revision"
}
severity: "WARNING"
textPayload: "The request was not authorized to invoke this service. Read more at https://cloud.google.com/run/docs/securing/authenticating"
timestamp: "2019-09-26T16:27:30.673565Z"
}
我的问题是,如何查看“身份验证”头是否到达端点(日志不会给我太多启示),如果到达端点,在调用image命令/args时是否正确呈现。在作业中,gcloud auth print identity token
可能不会返回任何tocken。
原因是,在本地,gcloud使用您的身份创建令牌,但在作业中,您没有登录到gcloud。在作业中,gcloud auth print identity token
可能不会返回任何tocken。
原因是,在本地,gcloud使用您的身份创建令牌,但在作业中,您没有登录到gcloud。在作业中,您使用此容器google/cloud sdk
,这是一个全新安装的gcloud
工具。它是通用的,没有任何定制
调用此$(gcloud auth print identity token)
时,您需要在gcloud
工具中配置的服务帐户的标识
如果我们将这两段放在一起,您希望从gcloud
工具的通用/空白安装中生成标识。顺便说一下,您的gcloud
中没有定义服务帐户,您的令牌是空的(如@johnhanley所说)
要解决此问题,请添加如下环境变量
env:
- GOOGLE_APPLICATION_CREDENTIAL=<path to your credential.json>
更新
尝试在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"
我不确定这是否有效。让我知道在您的工作中,您使用了这个容器google/cloud sdk
,这是一个全新的gcloud
工具安装。它是通用的,没有任何定制
调用此$(gcloud auth print identity token)
时,您需要在gcloud
工具中配置的服务帐户的标识
如果我们将这两段放在一起,您希望从gcloud
工具的通用/空白安装中生成标识。顺便说一下,您的gcloud
中没有定义服务帐户,您的令牌是空的(如@johnhanley所说)
要解决此问题,请添加如下环境变量
env:
- GOOGLE_APPLICATION_CREDENTIAL=<path to your credential.json>
更新
尝试在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"
我不确定这是否有效。让我知道错误401表示“请求的凭据无效”gcloud
是一个脚本。这意味着作业需要启动shell并运行python程序。这可能是失败的。在接收服务上,关闭IAP并手动记录HTTP头。您收到的HTTP授权标头可能如下所示authorization:bearer
。请注意,令牌可能丢失。错误401表示“请求的凭据无效”gcloud
是一个脚本。这意味着作业需要启动shell并运行python程序。这可能是失败的。在接收服务上,关闭IAP并手动记录HTTP头。您收到的HTTP授权标头可能如下所示authorization:bearer
。请注意,令牌可能已丢失。鉴于pod
已附加GCP ServiceAccount(基础VM之一),我不必登录到帐户。我已经尝试了上面的命令,当手动执行时,它可以工作gcloud auth print identity token
在虚拟机连接了SA时会返回一个令牌。如果pod
连接了GCP ServiceAccount(基础虚拟机之一),则我不必登录到帐户。我已经尝试了上面的命令,当手动执行时,它可以工作gcloud auth print identity token
在VM附加SA时返回令牌。请查看我发布给用户Steren的注释请查看我发布给用户Steren的注释