MinIO Image Pull Failure¶
MinIO has removed its images from Docker Hub (minio/minio) and from Quay.io (quay.io/minio/minio). Kubernetes cannot start a new MinIO pod from those images, so a pod restart or reschedule (or a helm upgrade for Component Pack) fails with ErrImagePull or ImagePullBackOff.
MinIO is discontinued: migrate to SeaweedFS
MinIO no longer publishes community releases or security fixes. Boards now uses SeaweedFS for S3 storage. Huddo keeps a copy of the MinIO image in its private Quay.io registry (quay.io/huddo/minio) only so that MinIO keeps running while you migrate. It is not a long-term fix.
Follow the SeaweedFS migration guide now.
Check if you are affected¶
You are affected if you deploy MinIO with one of these:
- The
huddo-boards-cpHelm chart before2.6.0with MinIO enabled. MinIO is enabled unless your values file setsminio.enabled: false. - The standalone
minio.yamlfor Kubernetes, if it does not pullquay.io/huddo/minio.
Look for a MinIO pod that is not running:
kubectl get pods --all-namespaces | grep minio
kubectl describe pod <minio-pod-name> --namespace <namespace>
The events show a failed pull of docker.io/minio/minio or quay.io/minio/minio. A pull from Quay.io fails with 401 UNAUTHORIZED.
Note
Our earlier workaround used quay.io/minio/minio. That image is also no longer available. Use the steps on this page instead.
If the pull of quay.io/huddo/minio fails with 401 UNAUTHORIZED
Your Quay.io account cannot read huddo/minio. Email support@huddo.com with the Quay.io account name from your image pull secret (not the password).
Component Pack (huddo-boards-cp)¶
Upgrade the chart¶
From huddo-boards-cp 2.6.0, the chart pulls MinIO from quay.io/huddo/minio:RELEASE.2022-10-24T18-35-07Z, with the same image pull secret as your Boards images (global.imagePullSecret). It is the same MinIO version as before, so your data does not change.
Before you upgrade, make sure that you can pull the image. The upgrade stops MinIO before it starts the new MinIO pod. If the new pod cannot pull the image, MinIO stays down.
Then upgrade to the latest chart. Read the Breaking Changes column first: v2.0.0 moves to Traefik.
- If your chart is before 2.1.0, set
global.env.S3_BUCKET: kudos-boardsin your values file before you upgrade, as in Phase 1 of the SeaweedFS migration guide. If you do not, Boards uses a new empty bucket and your existing attachments do not show. - MinIO restarts once during the upgrade, so S3 is unavailable for a short time.
- If you applied an earlier workaround (
kubectl set imageorkubectl patch), the upgrade replaces it. You do not need to run it again. - If you installed the release with Helm 4 and applied a workaround,
helm upgradecan fail withconflict with "kubectl-set"orconflict with "kubectl-patch". Add--force-conflictsto thehelm upgradecommand. - If you pull Huddo images from your own registry (
global.repositoryis notquay.io/huddo), copyquay.io/huddo/minio:RELEASE.2022-10-24T18-35-07Zto<global.repository>/minio:RELEASE.2022-10-24T18-35-07Zbefore you upgrade.
Make sure that you can pull the image¶
-
Get the name of the image pull secret that your Boards services use:
kubectl get deployments --namespace connections -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.template.spec.imagePullSecrets[*].name}{"\n"}{end}' | grep huddo-boards-cpReplace
connectionswith your Boards namespace if it is different (seekubectl get pods --all-namespaces | grep minio). Use the same namespace in the next steps. -
Start a test pod that pulls the image with that secret. Replace
[PULL_SECRET_NAME]with the name from step 1:kubectl run minio-pull-test --namespace connections --restart=Never --image=quay.io/huddo/minio:RELEASE.2022-10-24T18-35-07Z --overrides='{"spec":{"imagePullSecrets":[{"name":"[PULL_SECRET_NAME]"}]}}' -- --version kubectl get pod minio-pull-test --namespace connectionsIf the status is
Completed, the pull works. If the status isErrImagePullorImagePullBackOff, see the note about401 UNAUTHORIZEDat the top of this page. -
Delete the test pod:
kubectl delete pod minio-pull-test --namespace connections
If you cannot upgrade yet¶
-
Stop MinIO, so that the old and the new MinIO pod do not use the data volume at the same time:
kubectl scale deployment huddo-boards-cp-minio --namespace connections --replicas=0 -
Point the MinIO deployment at the Huddo image and add the image pull secret. Replace
[PULL_SECRET_NAME]with the name that you found:kubectl patch deployment huddo-boards-cp-minio --namespace connections -p '{"spec":{"template":{"spec":{"imagePullSecrets":[{"name":"[PULL_SECRET_NAME]"}],"containers":[{"name":"minio","image":"quay.io/huddo/minio:RELEASE.2022-10-24T18-35-07Z"}]}}}}' -
Start MinIO and make sure that the pod starts:
kubectl scale deployment huddo-boards-cp-minio --namespace connections --replicas=1 kubectl rollout status deployment/huddo-boards-cp-minio --namespace connections
Do these steps again after every helm upgrade to a chart before 2.6.0
A chart before 2.6.0 sets the image back to Docker Hub. The MinIO pod that is running stays up, but Kubernetes cannot start a replacement pod. Immediately after each such helm upgrade, including the upgrades in the SeaweedFS migration, do the last three steps again: stop MinIO, run kubectl patch, then start MinIO. Do not run kubectl patch alone: the old MinIO pod is still running, so a second MinIO pod would start on the same data volume.
If you installed the release with Helm 4, helm upgrade fails with conflict with "kubectl-patch". Add --force-conflicts to the helm upgrade command, then do the three steps again.
Note
Loading the image onto your nodes yourself does not help. The chart sets imagePullPolicy: Always, so Kubernetes always pulls from the registry.
Migrate to SeaweedFS¶
Follow the SeaweedFS migration guide. The migration needs chart huddo-boards-cp v2.1.0 or later. If your chart is older, upgrade to the latest chart as part of Phase 1 of the migration guide, with the Phase 1 values (including S3_BUCKET: kudos-boards), so that Boards keeps your existing attachments.
After the cutover (minio.enabled: false), MinIO is removed and you do not need the MinIO image.
Standalone Kubernetes (minio.yaml)¶
Pull the Huddo image¶
-
Get the name of the image pull secret that your Boards services use:
kubectl get deployments --namespace boards -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.template.spec.imagePullSecrets[*].name}{"\n"}{end}'Replace
boardswith your Boards namespace if it is different. -
In your
minio.yaml, add the image pull secret to the MinIO pod and change the image.imagePullSecretsis at the same level ascontainers. Replace[PULL_SECRET_NAME]with the name from step 1:spec: dnsPolicy: ClusterFirst imagePullSecrets: - name: '[PULL_SECRET_NAME]' containers: - name: minio image: quay.io/huddo/minio:RELEASE.2025-09-07T16-13-09ZKeep the MinIO version that your file already uses:
- If your image ends in
:RELEASE.2022-10-24T18-35-07Z, usequay.io/huddo/minio:RELEASE.2022-10-24T18-35-07Z. - Otherwise (for example
minio/miniowith no tag), usequay.io/huddo/minio:RELEASE.2025-09-07T16-13-09Z. It is the last MinIO image that was published aslatest.
- If your image ends in
-
Stop MinIO, so that the old and the new MinIO pod do not use the data volume at the same time. Then apply the file, which starts MinIO again, and make sure that the pod starts:
kubectl scale deployment minio --namespace boards --replicas=0 kubectl apply -f ./minio.yaml kubectl rollout status deployment/minio --namespace boardsIf the pod cannot pull the image, see the note about
401 UNAUTHORIZEDat the top of this page.
Your data is on the MinIO volume (kudos-minio-claim), so it does not change.
Migrate to SeaweedFS¶
Deploy SeaweedFS, then copy your data from MinIO with rclone copy --update, as shown in the manual migration command. Use http://minio-service:9000 as the source endpoint and your SeaweedFS service as the destination. In the command, the first path is the source (MinIO) and the second path is the destination (SeaweedFS). MinIO must be running for the copy.
The command never deletes from the destination and never replaces an object that is newer there, so it is safe to run again.
Danger
Do not use rclone sync. It makes the destination identical to the source, so it deletes destination objects that are not in the source. After the apps write to SeaweedFS, it deletes their new files. With the paths swapped, it deletes your data from MinIO.
Then change S3_ENDPOINT in your boards.yaml to SeaweedFS and upgrade Boards. When the upgrade has finished and no old Boards pods are left, run the copy command once more. This copies the files uploaded to MinIO since the first run, including uploads from old pods during the upgrade.
If you need help, email support@huddo.com.