Container Registry
Edka supports multiple container registries to store and manage your Docker images. This guide covers setup and configuration for supported registries.
Supported Registries
Section titled “Supported Registries”- GitHub Container Registry (ghcr.io)
- Docker Hub
- AWS Elastic Container Registry (ECR)
- Google Artifact Registry
- Custom Container Registry
- In-Cluster Zot Registry (per-cluster)
External registry credentials are stored once at the account level under Integrations > External Container Registry, then applied to individual clusters from each cluster’s Registry > External Registries tab (where one can be set as the cluster default).
How external registry sync works
Section titled “How external registry sync works”External registries are configured in two steps:
- Add the registry credential under Integrations > External Container Registry.
- Apply it to a cluster from Clusters > your cluster > Registry > External Registries.
When a registry is applied to a cluster, Edka installs and configures the edka-registry-operator inside the cluster. The operator continuously reconciles registry pull credentials:
- Creates a
kubernetes.io/dockerconfigjsonpull Secret namededka-registry-<registry-name>in every active namespace. - Adds that pull Secret to the namespace’s
defaultServiceAccountimagePullSecrets. - Watches for new namespaces and adds credentials there automatically.
- Updates credentials when the account-level registry credential changes.
- Removes managed pull Secrets when a registry is no longer applied to the cluster.
- Renews AWS ECR Docker authorization tokens before they expire.
If your workload uses the namespace’s default ServiceAccount, no extra Kubernetes configuration is required. If your workload uses a custom ServiceAccount, add the generated pull Secret to that ServiceAccount’s imagePullSecrets.
Changing the cluster default registry does not remove credentials for other applied registries. To stop distributing a registry’s pull credentials, remove it from the cluster’s applied registries.
Build pushes and workload pulls
Section titled “Build pushes and workload pulls”Registry credentials are used in two places:
- Kubernetes pulls: the in-cluster operator creates namespace pull Secrets so pods can pull private images.
- Edka build pushes: branch deployment builds create a per-build Docker config so BuildKit can push the built image to the cluster default registry.
Docker Hub, GHCR, Google Artifact Registry, and custom Docker-compatible registries use the configured Docker credential directly.
AWS ECR is different. Store an AWS access key ID, secret access key, and registry URL in Edka. Edka exchanges those IAM credentials for short-lived ECR Docker authorization tokens when syncing Kubernetes pull Secrets and when creating build jobs. Do not paste the output of aws ecr get-login-password into Edka as the long-lived registry password.
In-Cluster Zot Registry
Section titled “In-Cluster Zot Registry”Edka also supports an in-cluster registry powered by Zot.
- Managed from the cluster’s Registry tab > Cluster Registry sub-tab.
- Includes runtime visibility (pods/workload/resource usage/volume usage).
- Supports safe storage expansion for existing installations.
For full operational guidance, see:
GitHub Container Registry
Section titled “GitHub Container Registry”Overview
Section titled “Overview”GitHub Container Registry (ghcr.io) stores images alongside GitHub repositories and works directly with GitHub Actions.
Benefits:
- Free for public images
- 500MB storage for private repos (free tier)
- Integrated with GitHub Actions
- Fine-grained permissions
1. Enable GitHub Packages
Section titled “1. Enable GitHub Packages”- Go to your GitHub account settings
- Navigate to Developer settings > Personal access tokens
- Generate a new token (classic) with scopes:
write:packages- Upload imagesread:packages- Pull imagesdelete:packages- Delete images (optional)
2. Configure in Edka
Section titled “2. Configure in Edka”- In Edka dashboard, go to Integrations > External Container Registry
- Select GitHub Container Registry
- Enter:
- Registry Name: a unique identifier you choose
- Registry URL:
ghcr.io - Username: Your GitHub username
- Token: Personal access token
- Click Save
Docker Hub
Section titled “Docker Hub”Overview
Section titled “Overview”Docker Hub is the default registry for Docker images, with public and private repositories.
Benefits:
- Unlimited public repositories
- 1 private repository (free tier)
- Official images
- Automated builds
1. Create Docker Hub Account
Section titled “1. Create Docker Hub Account”- Sign up at hub.docker.com
- Create an access token:
- Go to Account Settings > Security
- Click New Access Token
- Set permissions and generate
2. Configure in Edka
Section titled “2. Configure in Edka”- Navigate to Integrations > External Container Registry
- Select Docker Hub
- Enter:
- Registry Name: a unique identifier you choose
- Username: Docker Hub username
- Password: Access token
- Click Save
Rate Limits
Section titled “Rate Limits”Anonymous users: 100 pulls per 6 hours Authenticated users: 200 pulls per 6 hours Paid users: Unlimited
AWS Elastic Container Registry
Section titled “AWS Elastic Container Registry”Overview
Section titled “Overview”AWS ECR stores container images and authenticates through AWS IAM.
Benefits:
- Integrated with AWS IAM
- Vulnerability scanning
- Image replication
- Lifecycle policies
1. Create ECR Repository
Section titled “1. Create ECR Repository”# Create repositoryaws ecr create-repository --repository-name my-app --region us-east-12. Configure IAM
Section titled “2. Configure IAM”Use an IAM user or role that can request ECR authorization tokens and access the repositories Edka will use.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ecr:GetAuthorizationToken", "Resource": "*" }, { "Effect": "Allow", "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:BatchGetImage", "ecr:CompleteLayerUpload", "ecr:GetDownloadUrlForLayer", "ecr:InitiateLayerUpload", "ecr:PutImage", "ecr:UploadLayerPart" ], "Resource": "arn:aws:ecr:us-east-1:123456789012:repository/my-app" } ]}If Edka only needs to pull existing images from ECR, keep ecr:BatchGetImage and ecr:GetDownloadUrlForLayer in the repository statement. If Edka builds and pushes images to ECR, keep the write actions shown above.
3. Configure in Edka
Section titled “3. Configure in Edka”- Go to Integrations > External Container Registry
- Select AWS ECR
- Enter:
- Registry Name: a unique identifier you choose
- Registry URL:
123456789012.dkr.ecr.us-east-1.amazonaws.com - Access Key ID: AWS access key
- Secret Access Key: AWS secret key
- Click Save
For FIPS or GovCloud endpoints, also fill in the AWS Region field (for example us-gov-west-1).
4. Apply to a cluster
Section titled “4. Apply to a cluster”- Open the cluster’s Registry page.
- Select the External Registries tab.
- Apply the ECR registry to the cluster.
- Set it as the default registry if Edka builds should push new images there.
After the registry is applied, newly created namespaces receive the ECR pull Secret automatically. ECR tokens are renewed inside the cluster before they expire.
Google Artifact Registry
Section titled “Google Artifact Registry”Overview
Section titled “Overview”Google Artifact Registry is Google Cloud’s container registry, with regional and multi-regional storage.
Benefits:
- Regional and multi-regional storage
- Vulnerability scanning
- Binary authorization
1. Enable API and Create Repository
Section titled “1. Enable API and Create Repository”# Enable APIgcloud services enable artifactregistry.googleapis.com
# Create repositorygcloud artifacts repositories create my-repo \ --repository-format=docker \ --location=us-central1 \ --description="My container images"2. Configure Authentication
Section titled “2. Configure Authentication”# Configure Dockergcloud auth configure-docker us-central1-docker.pkg.dev
# Create service accountgcloud iam service-accounts create edka-registry
# Grant permissionsgcloud artifacts repositories add-iam-policy-binding my-repo \ --location=us-central1 \ --member="serviceAccount:edka-registry@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/artifactregistry.reader"
# Create keygcloud iam service-accounts keys create key.json \ --iam-account=edka-registry@PROJECT_ID.iam.gserviceaccount.com3. Configure in Edka
Section titled “3. Configure in Edka”- Navigate to Integrations > External Container Registry
- Select Google Artifact Registry
- Enter:
- Registry Name: a unique identifier you choose
- Registry URL:
us-central1-docker.pkg.dev - Project ID: Your GCP project
- Service Account Key: Contents of key.json
- Click Save
Troubleshooting
Section titled “Troubleshooting”New namespace cannot pull private images
Section titled “New namespace cannot pull private images”Wait for the registry operator to reconcile, or trigger an immediate sync with Sync Now on the cluster’s Registry > External Registries tab. Then check that the namespace has an edka-registry-<registry-name> Secret and that the namespace’s default ServiceAccount references it. If the workload uses a custom ServiceAccount, add the same Secret to that ServiceAccount’s imagePullSecrets.
ECR build push returns 401 Unauthorized
Section titled “ECR build push returns 401 Unauthorized”A namespace pull Secret only affects Kubernetes image pulls. Edka build pushes use a separate BuildKit Docker config generated for the build job. Check that:
- The ECR registry is the cluster default registry when the build starts.
- The ECR registry URL is correct.
- The AWS credentials can call
ecr:GetAuthorizationToken. - The IAM policy includes ECR push permissions for the target repository when Edka is building and pushing images.