Google Kubernetes Engine 上的 Firebase 授权
Firebase authorization on Google Kubernetes Engine
我无法在 docker 容器中使用 Python Firebase Admin SDK,特别是在 Google Kubernetes Engine (GKE) 上。同一个容器在 Cloud 运行 上没有问题。我相信问题是权限,但我已经陷入困境。如有任何帮助,我们将不胜感激!
这是 Flask 应用程序的概要。所有三个路由都在 Cloud 运行 上工作,前两个在 GKE 上工作,第三个失败。
# realtime database address
dbAddress = 'https://[projectID].firebaseio.com/'
# initialize the firebase SDK
credentials = None # the service account should provide the credentials
firebase_admin.initialize_app(credentials,{'databaseURL': dbAddress})
@app.route('/')
def hello_world(): # works on cloud run and GKE
print('Hello, World print statement!')
return 'Hello, World!'
@app.route('/simplepost', methods = ['POST'])
def simple_post():# works on cloud run and GKE
content = request.get_json()
return {'results': content}, 201
@app.route('/firepost', methods = ['POST'])
def fire_post(): # works on cloud run. FAILS ON GKE!
jobRef = db.reference('jobs/').push()
return {'results': jobRef.path}, 201
if __name__ == '__main__':
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
带容器的 Repo(需要你自己的 firebase 项目):
https://github.com/crispyDyne/GKE-py-fire
来自 GKE 控制台的错误:
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/firebase_admin/db.py", line 943, in request
return super(_Client, self).request(method, url, **kwargs)
File "/usr/local/lib/python3.8/site-packages/firebase_admin/_http_client.py", line 117, in request
resp.raise_for_status()
File "/usr/local/lib/python3.8/site-packages/requests/models.py", line 941, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://[projectName].firebaseio.com/jobs.json
我尝试通过“Workload Identity”解决权限问题,但没有成功。
当我创建我的 GKE 集群时,我为具有“所有者”角色的节点池设置了一个服务帐户(应该是矫枉过正)。在集群安全性下,我 select“启用工作负载身份”复选框。
然后我使用以下说明配置 Kubernetes 服务帐户:
https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#gcloud_1
我从容器注册表部署工作负载,并使用外部负载均衡器(端口:80,目标端口:8080)公开它。前两条路线工作正常,但第三条路线失败。当部署在云 运行.
上时,这三个都工作正常
希望我正在做一些很容易解决的蠢事!干杯!
经过多次努力,我想我明白了。以下是创建集群、部署容器并最终在 pod 中使用正确的应用程序默认凭据的三种方法。
1. Workload Identity(基本上就是这个 Workload Identity article,添加了一些部署细节)
首选此方法,因为它允许集群中的每个 pod 部署仅被授予其所需的权限。
使用的 googleServiceAccount 需要分配适当的角色(见下文)。
创建集群(注意:未定义范围或服务帐户)
gcloud beta container clusters create {cluster-name} \
--release-channel regular \
--identity-namespace {projectID}.svc.id.goog
然后创建k8sServiceAccount,分配角色,注解。
gcloud container clusters get-credentials {cluster-name}
kubectl create serviceaccount --namespace default {k8sServiceAccount}
gcloud iam service-accounts add-iam-policy-binding \
--member serviceAccount:{projectID}.svc.id.goog[default/{k8sServiceAccount}] \
--role roles/iam.workloadIdentityUser \
{googleServiceAccount}
kubectl annotate serviceaccount \
--namespace default \
{k8sServiceAccount} \
iam.gke.io/gcp-service-account=
然后我创建部署,设置 k8sServiceAccount。
(设置服务帐户是我遗漏的部分)
kubectl create deployment {deployment-name} --image={containerImageURL}
kubectl set serviceaccount deployment {deployment-name} {k8sServiceAccount}
然后以8080为目标暴露
kubectl expose deployment {deployment-name} --name={service-name} --type=LoadBalancer --port 80 --target-port 8080
2。群集服务帐户
这种方法不是首选,因为集群中的所有 VM 和 pods 都将具有基于定义的服务帐户的权限。
使用分配的服务帐户创建集群
gcloud beta container clusters create [cluster-name] \
--release-channel regular \
--service-account {googleServiceAccount}
使用的 googleServiceAccount 需要分配适当的角色(见下文)。
然后如上部署和公开,但不设置 k8sServiceAccount
3。范围
这种方法不是首选,因为集群中的所有 VM 和 pods 都将根据定义的范围具有权限。
创建具有指定范围的集群(firestore 只需要“cloud-platform”,实时数据库也需要“userinfo.email”)
gcloud beta container clusters create \
--release-channel regular \
--scopes https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email
然后如上部署和公开,但不设置 k8sServiceAccount
前两种方法需要一个 Google 服务帐户并分配了适当的角色。以下是我分配给一些 Firebase 产品的角色:
- FireStore:云数据存储用户(数据存储)
- 实时数据库:Firebase 实时数据库管理员(Firebase 产品)
- 存储:存储对象管理员(云存储)
我无法在 docker 容器中使用 Python Firebase Admin SDK,特别是在 Google Kubernetes Engine (GKE) 上。同一个容器在 Cloud 运行 上没有问题。我相信问题是权限,但我已经陷入困境。如有任何帮助,我们将不胜感激!
这是 Flask 应用程序的概要。所有三个路由都在 Cloud 运行 上工作,前两个在 GKE 上工作,第三个失败。
# realtime database address
dbAddress = 'https://[projectID].firebaseio.com/'
# initialize the firebase SDK
credentials = None # the service account should provide the credentials
firebase_admin.initialize_app(credentials,{'databaseURL': dbAddress})
@app.route('/')
def hello_world(): # works on cloud run and GKE
print('Hello, World print statement!')
return 'Hello, World!'
@app.route('/simplepost', methods = ['POST'])
def simple_post():# works on cloud run and GKE
content = request.get_json()
return {'results': content}, 201
@app.route('/firepost', methods = ['POST'])
def fire_post(): # works on cloud run. FAILS ON GKE!
jobRef = db.reference('jobs/').push()
return {'results': jobRef.path}, 201
if __name__ == '__main__':
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
带容器的 Repo(需要你自己的 firebase 项目): https://github.com/crispyDyne/GKE-py-fire
来自 GKE 控制台的错误:
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/firebase_admin/db.py", line 943, in request
return super(_Client, self).request(method, url, **kwargs)
File "/usr/local/lib/python3.8/site-packages/firebase_admin/_http_client.py", line 117, in request
resp.raise_for_status()
File "/usr/local/lib/python3.8/site-packages/requests/models.py", line 941, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://[projectName].firebaseio.com/jobs.json
我尝试通过“Workload Identity”解决权限问题,但没有成功。
当我创建我的 GKE 集群时,我为具有“所有者”角色的节点池设置了一个服务帐户(应该是矫枉过正)。在集群安全性下,我 select“启用工作负载身份”复选框。
然后我使用以下说明配置 Kubernetes 服务帐户: https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#gcloud_1
我从容器注册表部署工作负载,并使用外部负载均衡器(端口:80,目标端口:8080)公开它。前两条路线工作正常,但第三条路线失败。当部署在云 运行.
上时,这三个都工作正常希望我正在做一些很容易解决的蠢事!干杯!
经过多次努力,我想我明白了。以下是创建集群、部署容器并最终在 pod 中使用正确的应用程序默认凭据的三种方法。
1. Workload Identity(基本上就是这个 Workload Identity article,添加了一些部署细节)
首选此方法,因为它允许集群中的每个 pod 部署仅被授予其所需的权限。
使用的 googleServiceAccount 需要分配适当的角色(见下文)。
创建集群(注意:未定义范围或服务帐户)
gcloud beta container clusters create {cluster-name} \
--release-channel regular \
--identity-namespace {projectID}.svc.id.goog
然后创建k8sServiceAccount,分配角色,注解。
gcloud container clusters get-credentials {cluster-name}
kubectl create serviceaccount --namespace default {k8sServiceAccount}
gcloud iam service-accounts add-iam-policy-binding \
--member serviceAccount:{projectID}.svc.id.goog[default/{k8sServiceAccount}] \
--role roles/iam.workloadIdentityUser \
{googleServiceAccount}
kubectl annotate serviceaccount \
--namespace default \
{k8sServiceAccount} \
iam.gke.io/gcp-service-account=
然后我创建部署,设置 k8sServiceAccount。 (设置服务帐户是我遗漏的部分)
kubectl create deployment {deployment-name} --image={containerImageURL}
kubectl set serviceaccount deployment {deployment-name} {k8sServiceAccount}
然后以8080为目标暴露
kubectl expose deployment {deployment-name} --name={service-name} --type=LoadBalancer --port 80 --target-port 8080
2。群集服务帐户
这种方法不是首选,因为集群中的所有 VM 和 pods 都将具有基于定义的服务帐户的权限。
使用分配的服务帐户创建集群
gcloud beta container clusters create [cluster-name] \
--release-channel regular \
--service-account {googleServiceAccount}
使用的 googleServiceAccount 需要分配适当的角色(见下文)。
然后如上部署和公开,但不设置 k8sServiceAccount
3。范围
这种方法不是首选,因为集群中的所有 VM 和 pods 都将根据定义的范围具有权限。
创建具有指定范围的集群(firestore 只需要“cloud-platform”,实时数据库也需要“userinfo.email”)
gcloud beta container clusters create \
--release-channel regular \
--scopes https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email
然后如上部署和公开,但不设置 k8sServiceAccount
前两种方法需要一个 Google 服务帐户并分配了适当的角色。以下是我分配给一些 Firebase 产品的角色:
- FireStore:云数据存储用户(数据存储)
- 实时数据库:Firebase 实时数据库管理员(Firebase 产品)
- 存储:存储对象管理员(云存储)