403 禁止访问 ESPv2、GKE AutoPilot、WIF
403 Forbidden on ESPv2, GKE AutoPilot, WIF
我正在关注 Getting started with Endpoints for GKE with ESPv2。我在 GKE 集群上使用 Workload Identity Federation 和 Autopilot。
我已经运行陷入错误:
F0110 03:46:24.304229 8 server.go:54] fail to initialize config manager: http call to GET https://servicemanagement.googleapis.com/v1/services/name:bookstore.endpoints.<project>.cloud.goog/rollouts?filter=status=SUCCESS returns not 200 OK: 403 Forbidden
这最终会导致传输失败错误并关闭 Pod。
我的第一步是调查权限问题,但我真的可以使用一些外部视角来解决这个问题,因为我一直在绕圈子。
这是我的配置:
>> gcloud container clusters describe $GKE_CLUSTER_NAME \
--zone=$GKE_CLUSTER_ZONE \
--format='value[delimiter="\n"](nodePools[].config.oauthScopes)'
['https://www.googleapis.com/auth/devstorage.read_only',
'https://www.googleapis.com/auth/logging.write',
'https://www.googleapis.com/auth/monitoring',
'https://www.googleapis.com/auth/service.management.readonly',
'https://www.googleapis.com/auth/servicecontrol',
'https://www.googleapis.com/auth/trace.append']
>> gcloud container clusters describe $GKE_CLUSTER_NAME \
--zone=$GKE_CLUSTER_ZONE \
--format='value[delimiter="\n"](nodePools[].config.serviceAccount)'
default
default
服务账户名:test-espv2
角色
Cloud Trace Agent
Owner
Service Account Token Creator
Service Account User
Service Controller
Workload Identity User
我已将 WIF svc-act 与具有以下 yaml 的集群相关联
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
iam.gke.io/gcp-service-account: test-espv2@<project>.iam.gserviceaccount.com
name: test-espv2
namespace: eventing
然后我将 pod 与 test-espv2
svc-act
相关联
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: esp-grpc-bookstore
namespace: eventing
spec:
replicas: 1
selector:
matchLabels:
app: esp-grpc-bookstore
template:
metadata:
labels:
app: esp-grpc-bookstore
spec:
serviceAccountName: test-espv2
由于gcr.io/endpoints-release/endpoints-runtime:2
名额有限,
我创建了一个测试容器并将其部署到相同的 eventing
命名空间。
在容器中,我可以使用以下命令检索端点服务配置:
curl --fail -o "service.json" -H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://servicemanagement.googleapis.com/v1/services/${SERVICE}/configs/${CONFIG_ID}?view=FULL"
而且在容器中,我 运行 作为模拟服务帐户,测试了:
curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/
还有其他测试可以运行帮助我调试这个问题吗?
提前致谢,
围绕调试 - 我经常通过遵循 Google 教程中的其他 methods/programming 语言之一来发现我的错误。
您看过 OpenAPI notes 并尝试跟进了吗?
我终于弄明白了。它分为两部分。
- 重新部署应用程序,特别注意和验证
kubectl annotate serviceaccount
命令
- add-iam-policy-binding 对于 serviceController 和 cloudtrace.agent
- 由于 Autopilot
而省略了 nodeSelector: iam.gke.io/gke-metadata-server-enabled: "true"
如日志所示,这样做可以成功部署 kube。
我遇到的下一个错误是
<h1>Error: Server Error</h1>
<h2>The server encountered a temporary error and could not complete your request.<p>Please try again in 30 seconds.</h2>
- 这是通过将我的注意力转回我的 Kube 集群来解决的。
查看我的入口服务中的事件,因为我处于 shared-vpc 并且我的安全策略只允许从主机项目进行防火墙管理,所以部署无法更新防火墙规则。
手动配置它们,如下所示:
解决了我的问题。
我正在关注 Getting started with Endpoints for GKE with ESPv2。我在 GKE 集群上使用 Workload Identity Federation 和 Autopilot。
我已经运行陷入错误:
F0110 03:46:24.304229 8 server.go:54] fail to initialize config manager: http call to GET https://servicemanagement.googleapis.com/v1/services/name:bookstore.endpoints.<project>.cloud.goog/rollouts?filter=status=SUCCESS returns not 200 OK: 403 Forbidden
这最终会导致传输失败错误并关闭 Pod。
我的第一步是调查权限问题,但我真的可以使用一些外部视角来解决这个问题,因为我一直在绕圈子。
这是我的配置:
>> gcloud container clusters describe $GKE_CLUSTER_NAME \
--zone=$GKE_CLUSTER_ZONE \
--format='value[delimiter="\n"](nodePools[].config.oauthScopes)'
['https://www.googleapis.com/auth/devstorage.read_only',
'https://www.googleapis.com/auth/logging.write',
'https://www.googleapis.com/auth/monitoring',
'https://www.googleapis.com/auth/service.management.readonly',
'https://www.googleapis.com/auth/servicecontrol',
'https://www.googleapis.com/auth/trace.append']
>> gcloud container clusters describe $GKE_CLUSTER_NAME \
--zone=$GKE_CLUSTER_ZONE \
--format='value[delimiter="\n"](nodePools[].config.serviceAccount)'
default
default
服务账户名:test-espv2
角色
Cloud Trace Agent
Owner
Service Account Token Creator
Service Account User
Service Controller
Workload Identity User
我已将 WIF svc-act 与具有以下 yaml 的集群相关联
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
iam.gke.io/gcp-service-account: test-espv2@<project>.iam.gserviceaccount.com
name: test-espv2
namespace: eventing
然后我将 pod 与 test-espv2
svc-act
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: esp-grpc-bookstore
namespace: eventing
spec:
replicas: 1
selector:
matchLabels:
app: esp-grpc-bookstore
template:
metadata:
labels:
app: esp-grpc-bookstore
spec:
serviceAccountName: test-espv2
由于gcr.io/endpoints-release/endpoints-runtime:2
名额有限,
我创建了一个测试容器并将其部署到相同的 eventing
命名空间。
在容器中,我可以使用以下命令检索端点服务配置:
curl --fail -o "service.json" -H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://servicemanagement.googleapis.com/v1/services/${SERVICE}/configs/${CONFIG_ID}?view=FULL"
而且在容器中,我 运行 作为模拟服务帐户,测试了:
curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/
还有其他测试可以运行帮助我调试这个问题吗?
提前致谢,
围绕调试 - 我经常通过遵循 Google 教程中的其他 methods/programming 语言之一来发现我的错误。
您看过 OpenAPI notes 并尝试跟进了吗?
我终于弄明白了。它分为两部分。
- 重新部署应用程序,特别注意和验证
kubectl annotate serviceaccount
命令- add-iam-policy-binding 对于 serviceController 和 cloudtrace.agent
- 由于 Autopilot 而省略了
nodeSelector: iam.gke.io/gke-metadata-server-enabled: "true"
如日志所示,这样做可以成功部署 kube。
我遇到的下一个错误是
<h1>Error: Server Error</h1>
<h2>The server encountered a temporary error and could not complete your request.<p>Please try again in 30 seconds.</h2>
- 这是通过将我的注意力转回我的 Kube 集群来解决的。 查看我的入口服务中的事件,因为我处于 shared-vpc 并且我的安全策略只允许从主机项目进行防火墙管理,所以部署无法更新防火墙规则。
手动配置它们,如下所示:
解决了我的问题。