Architecture
Prerequisites
- GKE cluster (v1.24+) with Workload Identity enabled
gcloudCLI configured with appropriate permissionskubectlconfigured for your GKE cluster- Your GCP project allowlisted by Bifrost team
Contact the Bifrost team with your GCP project ID and service account email to get access configured.
Workload Identity (Recommended)
Workload Identity provides the most secure authentication method for GKE deployments by eliminating the need for service account keys.Step 1: Enable Workload Identity on GKE
If not already enabled, enable Workload Identity on your cluster:Step 2: Create GCP Service Account
Create a service account that will be used to pull images:Step 3: Request Access from Bifrost Team
Provide the following to the Bifrost team:- Your GCP project ID
- Service account email:
bifrost-pull-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com
Step 4: Create Namespace and ServiceAccount
Step 5: Bind Kubernetes SA to GCP SA
Allow the Kubernetes ServiceAccount to impersonate the GCP Service Account:Step 6: Create Image Pull Secret with Token Refresh
Artifact Registry tokens expire after 60 minutes. Use a CronJob to refresh the imagePullSecret:Step 7: Deploy Bifrost
Bootstrap: Initial Secret Creation
Before the first deployment, manually create the initial imagePullSecret:Service Account Impersonation
For cross-project deployments or when you need to use an existing service account:Configure Impersonation
Token Refresh with Impersonation
Update the CronJob to use impersonation:Service Account Key (Legacy)
For environments that cannot use Workload Identity:Verifying Access
Test Artifact Registry Authentication
Verify Workload Identity Configuration
Troubleshooting
ImagePullBackOff Errors
- Check imagePullSecret exists:
kubectl get secret ar-pull-secret -n bifrost - Verify token is valid: Check if CronJob ran successfully
- Check Workload Identity binding: Ensure GCP SA is bound to K8s SA
Workload Identity Issues
Token Expiration
If pods fail to pull images after 60 minutes:- Verify CronJob is running:
kubectl get cronjob -n bifrost - Check CronJob logs:
kubectl logs -l job-name=refresh-ar-secret -n bifrost - Manually trigger refresh:
kubectl create job --from=cronjob/refresh-ar-secret manual-refresh -n bifrost
Next Steps
- Configure Bifrost settings for your use case
- Set up observability for monitoring
- Enable clustering for high availability

