Building the memcached-operator with podman and OCP
On this exercise we will go through the issues that I found while trying the example mem-cached operator.
I used the steps from Operator-SDK page and hit issues caused by myself. 🙂 This post is not a step by step from the Tutorial, but how I fixed the issues that I hit.
Pre-requisites
Original instructions for installations => here. But from my testing, at this time of writing were:
-
Binaries
$ go version go version go1.21.10 linux/amd64 $ operator-sdk version operator-sdk version: "v1.34.2", commit: "81dd3cb24b8744de03d312c1ba23bfc617044005", kubernetes version: "1.28.0", go version: "go1.21.10", GOOS: "linux", GOARCH: "amd64" $ oc version Client Version: 4.13.18 $ podman version Client: Podman Engine Version: 4.9.4 API Version: 4.9.4 Go Version: go1.21.8 Built: Tue Mar 26 10:41:56 2024 OS/Arch: linux/amd64 -
Environment
Issue: "Working with personal/private registries"
- Do podman login to docker.io
- Update secret from the cluster with the docker.io credentials
oc get secret/pull-secret -n openshift-config --template='{{index .data ".dockerconfigjson" | base64decode}}' > ocp-pullsecret.json oc registry login --registry=docker.io --auth-basic="$USER:$PASSW" --to=ocp-pullsecret.json oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=ocp-pullsecret.json
Issue: Back-off pulling image "controller:latest"
Hit back-off pulling image issues, because I mistakenly skipped the step to Setup the Operator Registry
pod/memcached-operator-controller-manager-6d57548c9f-fdh67 Back-off pulling image "controller:latest"
Failed to pull image "controller:latest": rpc error: code = Unknown desc = reading manifest latest in docker.io/library/controller: requested access to the resource is denied
Makefile, set your own registry so the image can be built and pushed automatically to your registry, and then pulled inside the cluster. Eg:
Issue: docker: command not found
Podman have all the equivalent functions as docker, simply use podman to run :)
Issue: No rule to make target 'podman-build'
This happens because in the Makefile it is still pointing to be used docker commands, not podman.
CONTAINER_TOOL ?= podman
.PHONY: podman-build
podman-build: ## Build docker image with the manager.
.PHONY: podman-push
podman-push: ## Push docker image with the manager.
.PHONY: podman-buildx
podman-buildx:
.PHONY: bundle-build
bundle-build: ## Build the bundle image.
podman build -f bundle.Dockerfile -t $(BUNDLE_IMG) .
.PHONY: bundle-push
bundle-push: ## Push the bundle image.
$(MAKE) podman-push IMG=$(BUNDLE_IMG)
catalog-build: opm ## Build a catalog image.
$(OPM) index add --container-tool podman --mode semver --tag $(CATALOG_IMG) --bundles $(BUNDLE_IMGS) $(FROM_INDEX_OPT)
.PHONY: catalog-push
catalog-push: ## Push a catalog image.
$(MAKE) podman-push IMG=$(CATALOG_IMG)
Voila!
❯ oc get events --sort-by='{.lastTimestamp}'
Successfully pulled image "docker.io/songbird159/controller:latest" in 3.862300324s (3.86231446s including waiting)
❯ oc get pods -n memcached-operator-system
NAME READY STATUS RESTARTS AGE
memcached-operator-controller-manager-6d889bb7dd-j4d8q 2/2 Running 0 30m
❯ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/songbird159/controller latest 4676737e0f28 51 minutes ago 55.4 MB