Configure ECR Instead of Zot
An Open Container Initiative (OCI) registry is required to store OCI artifacts. Rather than using the default in‑cluster Zot registry, you can configure the PaletteAI Helm chart to use AWS Elastic Container Registry (ECR). ECR works on both AWS EKS and self‑managed Kubernetes on AWS (IaaS) and can be configured during or post-installation.
Prerequisites
- AWS IaaS
- EKS
-
An existing self-managed cluster using AWS EC2 instances.
-
Access to your cluster's kubeconfig.
-
PaletteAI's Helm chart downloaded.
curl --output values.yaml --silent https://docs.palette-ai.com/resources/assets/hosted/helm/values.yaml -
The following binaries installed on the machine where you are installing or upgrading PaletteAI from:
-
An AWS IAM role with the following ECR permissions for either a private or public ECR.
- ECR Private
- ECR Public
Minimal inline policy example for private ECR{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:CompleteLayerUpload",
"ecr:UploadLayerPart",
"ecr:InitiateLayerUpload",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
],
"Resource": "arn:aws:ecr:<region>:<account-id>:repository/<ecr-namespace>/<ecr-repo-name>"
},
{
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
}
]
}infoThe ECR Public registry's alias is not included in the resource Amazon Resource Name (ARN).
Minimal inline policy example for ECR Public{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr-public:CompleteLayerUpload",
"ecr-public:UploadLayerPart",
"ecr-public:InitiateLayerUpload",
"ecr-public:BatchCheckLayerAvailability",
"ecr-public:PutImage"
],
"Resource": "arn:aws:ecr-public::<account-id>:repository/<ecr-repo-name>"
},
{
"Effect": "Allow",
"Action": [
"ecr-public:GetAuthorizationToken",
"sts:GetServiceBearerToken"
],
"Resource": "*"
}
]
} -
The above IAM role attached to an AWS instance profile. This instance profile must be attached to each EC2 node that is part of your cluster.
-
An existing EKS cluster.
-
Access to your EKS cluster's kubeconfig.
-
PaletteAI's Helm chart downloaded.
curl --output values.yaml --silent https://docs.palette-ai.com/resources/assets/hosted/helm/values.yaml -
The following binaries installed on the machine where you are installing or upgrading PaletteAI from:
-
An OpenID Connect (OIDC) Identity Provider (IdP) within AWS Identity and Access Management (IAM) that uses your EKS cluster's OIDC issuer URL.
-
An AWS IAM role with the following ECR permissions for either a private or public ECR.
- ECR Private
- ECR Public
Minimal inline policy example for private ECR{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:CompleteLayerUpload",
"ecr:UploadLayerPart",
"ecr:InitiateLayerUpload",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
],
"Resource": "arn:aws:ecr:<region>:<account-id>:repository/<ecr-namespace>/<ecr-repo-name>"
},
{
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
}
]
}infoThe ECR Public registry's alias is not included in the resource Amazon Resource Name (ARN).
Minimal inline policy example for ECR Public{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr-public:CompleteLayerUpload",
"ecr-public:UploadLayerPart",
"ecr-public:InitiateLayerUpload",
"ecr-public:BatchCheckLayerAvailability",
"ecr-public:PutImage"
],
"Resource": "arn:aws:ecr-public::<account-id>:repository/<ecr-repo-name>"
},
{
"Effect": "Allow",
"Action": [
"ecr-public:GetAuthorizationToken",
"sts:GetServiceBearerToken"
],
"Resource": "*"
}
]
} -
The above IAM role must include the following trust policy. This allows the
hueandsource-controllerservice accounts to assume the IAM role via IAM roles for service accounts (IRSA).Example trust policy{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<account-id>:oidc-provider/oidc.eks.<region>.amazonaws.com/id/<provider-id>"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.<region>.amazonaws.com/id/<provider-id>:sub": [
"system:serviceaccount:<helm-release-namespace>:hue",
"system:serviceaccount:<helm-release-namespace>:source-controller"
]
}
}
}
]
}
Enablement
-
Open the Helm chart values file in a text editor of your choice. This example uses
vi.vi values.yaml -
PaletteAI's
Workloadcontroller, Hue, must be able to push OCI artifacts to ECR. To do so, sethue.ociRegistry.providertoawsand specify your ECR's URI forhue.ociRegistry.endpoint. The registry URI syntax varies based on whether you are using a public or private ECR.- ECR Private
- ECR Public
hue:
ociRegistry:
enabled: true
endpoint: 'oci://<account-id>.dkr.ecr.<region>.amazonaws.com/<ecr-namespace>'
repository: '<ecr-repo-name>'
insecure: false
interval: 5m
timeout: 60s
provider: 'aws'hue:
ociRegistry:
enabled: true
endpoint: 'oci://public.ecr.aws/<public-registry-alias>'
repository: '<ecr-repo-name>'
insecure: false
interval: 5m
timeout: 60s
provider: 'aws' -
Add the following IRSA annotation to Hue's service account.
hue:
serviceAccount:
create: true
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/<iam-role-name> -
Add the following IRSA annotation to the service account used by Flux's
source-controller.flux2:
sourceController:
serviceAccount:
create: true
automount: true
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/<iam-role-name> -
Each spoke cluster must reference the same OCI registry. Update every entry under
fleetConfig.spokes[i].ociRegistryto point to your ECR, and set theprovidertoaws.- ECR Private
- ECR Public
fleetConfig:
spokes:
- name: spoke-1
ociRegistry:
endpoint: 'oci://<account-id>.dkr.ecr.<region>.amazonaws.com/<ecr-namespace>'
repository: 'mural-workloads'
insecure: false
provider: 'aws'fleetConfig:
spokes:
- name: spoke-1
ociRegistry:
endpoint: 'oci://public.ecr.aws/<public-registry-alias>'
repository: 'mural-workloads'
insecure: false
provider: 'aws'Repeat this step for all spokes you intend to use.
-
If you have already installed PaletteAI using the default Zot registry, remove the
basicAuthsection from thehueandfleetConfigsections of your Helm chart. When using ECR with IRSA, authentication is automatically handled by AWS using the service account annotations set in steps 2 - 3.hue:
ociRegistry:
basicAuth:
username: 'user'
password: 'user'fleetConfig:
spokes:
- name: spoke-1
ociRegistry:
basicAuth:
username: 'user'
password: 'user' -
If you have already installed PaletteAI, update your installation using your modified Helm chart. Otherwise, proceed with the appropriate Install PaletteAI on AWS IaaS or Install PaletteAI on EKS guide.
helm upgrade mural oci://public.ecr.aws/mural/mural \
--namespace mural-system \
--filename values.yaml \
--wait
Validate
Once PaletteAI is installed or upgraded, take the following steps to verify that your ECR is correctly configured with PaletteAI.
-
Check that Flux OCIRepository resources are syncing successfully. Look for
READY: Truein the output.kubectl get ocirepository --namespace mural-system -
Check the Hue controller logs for successful OCI pushes.
kubectl logs --namespace mural-system deployment/hue | grep --ignore-case "push\|oci" -
Verify artifacts exist in ECR.
- ECR Private
- ECR Public
aws ecr describe-images \
--repository-name <ecr-namespace>/<ecr-repo-name> \
--region <region>aws ecr-public describe-images \
--repository-name <ecr-repo-name> \
--region us-east-1 -
After you have validated ECR, open the PaletteAI
values.yamlfile and disable Zot.vi values.yamlzot:
enabled: false -
Upgrade your PaletteAI installation to remove Zot.
helm upgrade mural oci://public.ecr.aws/mural/mural \
--namespace mural-system \
--filename values.yaml \
--wait