-
Notifications
You must be signed in to change notification settings - Fork 51
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enable multi-platform support for operator image builds #1923
Enable multi-platform support for operator image builds #1923
Conversation
Hi @ashokpariya0. Thanks for your PR. PRs from untrusted users cannot be marked as trusted with I understand the commands that are listed here. Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice thanks
First pass
.dockerignore
Outdated
pkg | ||
cmd | ||
tools | ||
#pkg |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
leftovers?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, this change is necessary because we need to build the two binaries listed here inside the Dockerfile in order to support Go cross-compilation for building the target binaries.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lets remove the lines then completely ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, Removed in the latest commit.
Makefile
Outdated
@@ -13,6 +13,14 @@ OPERATOR_IMAGE ?= cluster-network-addons-operator | |||
REGISTRY_IMAGE ?= cluster-network-addons-registry | |||
export OCI_BIN ?= $(shell if podman ps >/dev/null 2>&1; then echo podman; elif docker ps >/dev/null 2>&1; then echo docker; fi) | |||
TLS_SETTING := $(if $(filter $(OCI_BIN),podman),--tls-verify=false,) | |||
PLATFORMS ?= linux/amd64,linux/s390x,linux/arm64 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lets have just amd64 by default, so it wont take time on each regular use ?
the rest can be in an example comment
moreover if we build just one image, we dont need buildx just docker build, much easier to maintain, usually this will be the case, unless on releases and such once time come,
and then we can keep the simple one image build on make,
(nit, not important) - and for multi docker build, have layout like
https://github.com/nmstate/kubernetes-nmstate does (wrt buildx scripts and make targets)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@oshoval Thanks for the feedback! I agree that simplifying the default platform to just amd64 will streamline the build process and reduce unnecessary overhead. I'll update the configuration accordingly and move the other platforms into an example comment as you suggested.
As for the use of docker build vs. buildx, that approach makes sense for most cases. I'll switch to docker build for simplicity and reserve buildx for when it's needed.
During releases, we'll set PLATFORMS ?= linux/amd64,linux/s390x,linux/arm64, use buildx, and build and push a multi-platform image for the operator. For all other cases, we'll default to using amd64 as the platform. Does that sound good?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sgtm thx
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated in the latest commit.
Makefile
Outdated
null := | ||
space := $(null) # | ||
comma := , |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we just inline those please?
Makefile
Outdated
|
||
# Target to build the operator image with support for multiple platforms | ||
build-multiarch-operator-image: | ||
# Remove any existing manifest and image |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please drop the comments (all over unless it is not trivial)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please remove more comments, there are still some trivial ones
we usually add as few as possible
only for non trivial stuff
build/operator/Dockerfile
Outdated
FROM quay.io/centos/centos:stream9 | ||
# Define build-time arguments | ||
ARG BUILD_ARCH=amd64 # Default value for architecture is amd64 | ||
ARG GO_VERSION="1.23.3" # Default Go version is 1.23.3 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
might worth to auto take it from go.mod
i.e hack/go-version.sh
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good suggestion! I'll look into implementing that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I made the changes according to the script install-go.sh. With the current setup, we are compiling and building the manager binary using the Go version specified above.
Please note that the script go-version.sh returns the Go version in major.minor format. Additionally, the command curl -L -s "https://go.dev/dl/?mode=json" does not list Go 1.21, as it's archived. Before Go 1.22, we would need to download it directly from the archive. However, the install-go.sh script currently downloads the latest Go version and proceeds to compile with it.
I’ve made the same update in the Dockerfile to ensure consistency.
build/operator/Dockerfile
Outdated
RUN dnf install -y tar gzip && dnf clean all | ||
RUN ARCH=$(uname -m | sed 's/x86_64/amd64/') && \ | ||
curl -L https://go.dev/dl/go${GO_VERSION}.linux-${ARCH}.tar.gz -o go.tar.gz && \ | ||
tar -C /usr/local -xzf go.tar.gz && \ | ||
rm go.tar.gz | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe using docker ADD can simplify some of this ?
build/operator/Dockerfile
Outdated
COPY build/_output/bin/manager $OPERATOR | ||
COPY build/_output/bin/manifest-templator $MANIFEST_TEMPLATOR | ||
|
||
# Copy the final built binaries into the image |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please drop comments all over unless non trivial
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
hack/build-multiarch-operator.sh
Outdated
@@ -0,0 +1,54 @@ | |||
#!/bin/bash | |||
|
|||
# Function to check if Docker Buildx is available |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please drop comments unless non trivial
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
hack/build-multiarch-operator.sh
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
might worth to consider doing as close to
https://github.com/nmstate/kubernetes-nmstate/blob/2e791f9d650fe3cd4844e3964a2fea49688466b9/hack/init-buildx.sh please
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated in latest commit.
FYI- It would be preferable to pass the builder name at line 30 in the script init-buildx.sh.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we make it even closer to that script ?
will be easier to maintain, it still seems too close to the original version if i am not wrong
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I did that.
Just to let you know, I noticed an issue in this line of init-buildx.sh — we are not performing the inspection based on the builder name.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thanks, if you think it worth it you can open an issue on nmstate repo
i must work on some other stuff at this very moment, so will take me bit time to review
2fdfd41
to
993cbb4
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks,
there are some comments that were not addressed / replied to
please check those as well
hack/build-multiarch-operator.sh
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we make it even closer to that script ?
will be easier to maintain, it still seems too close to the original version if i am not wrong
Makefile
Outdated
|
||
# Target to build the operator image with support for multiple platforms | ||
build-multiarch-operator-image: | ||
# Remove any existing manifest and image |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please remove more comments, there are still some trivial ones
we usually add as few as possible
only for non trivial stuff
Makefile
Outdated
else ifeq ($(OCI_BIN),docker) | ||
ifeq ($(words $(PLATFORM_LIST)), 1) | ||
docker push ${TLS_SETTING} ${OPERATOR_IMAGE_TAGGED} | ||
endif |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please try to think about a makefile target structure that can be simpler wrt to multi platform and one platform
the logic is split here and on docker-build-operator, it will be better to have it concentrated if possible (i understand it might be not possible because there are stages)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For docker buildx, we need to combine both build and push in a single command because the images are not stored locally by default, unlike with docker build. As a result, we don't need a separate docker push command when working with multi-platform builds. To simplify the logic and maintain consistency, we could consider adding the --push option to docker build as well. What do you think @oshoval
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
might be interesting to try if you think it will simplify it please
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
993cbb4
to
209a203
Compare
f3073b3
to
a853967
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps an unpopular opinion, but why do we need to maintain two builds for Podman and Docker? In https://github.com/kubevirt/ssp-operator we went with Podman only.
personally i am against dropping docker support While it is a nice question, not sure if the PR is the right place for it (i.e it shouldn't block it) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@oshoval Not to block the PR, but IMO it adds a lot of complexity which I'm not sure is required. (especially looking at hack/build-multiarch-operator.sh
)
Makefile
Outdated
NULL := | ||
SPACE := $(NULL) # | ||
COMMA := , |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are these vars really required?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It was needed, but removed it latest commit and moved to shell script.
|
||
docker-build-registry: | ||
$(OCI_BIN) build -f build/registry/Dockerfile -t $(IMAGE_REGISTRY)/$(REGISTRY_IMAGE):$(IMAGE_TAG) . | ||
|
||
docker-push: docker-push-operator docker-push-registry | ||
|
||
docker-push-operator: | ||
$(OCI_BIN) push ${TLS_SETTING} $(IMAGE_REGISTRY)/$(OPERATOR_IMAGE):$(IMAGE_TAG) | ||
ifeq ($(OCI_BIN),podman) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is called docker-push-operator but uses podman?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ashokpariya0 Can you comment on this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, We may need to modify the section at Makefile lines 113-126(https://github.com/kubevirt/cluster-network-addons-operator/blob/main/Makefile#L113-L126), but this can be addressed in a separate PR, as renaming might impact some build processes or jobs. The existing code already supports both Docker and Podman, as indicated in Makefile line 14.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With your change this target will only push in case OCI_BIN
is equal to podman
, IIUC?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes exactly, with docker buildx, push is combined with image build.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fine by me to address naming on follow-up
thx
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sorry that i change my mind, can you please estimate how deep the change will be doing it in this PR on separate commits ?
once we have the estimation we can decide
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@oshoval I've already looked into this and found that docker-*
is being called from various scripts in the automation, hack folder, etc. Additionally, we need to update the README and other related files. Including all of this in a single commit would add unnecessary complexity. It would be better to handle these changes separately.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok thanks
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@oshoval I will create an separate issue for this, resolve it, and provide a follow-up.
Makefile
Outdated
--build-arg BUILD_ARCH=$(ARCH) \ | ||
--platform $(PLATFORMS) \ | ||
-f build/operator/Dockerfile \ | ||
-t ${OPERATOR_IMAGE_TAGGED} --push . |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you reuse/deduplicate the args?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated in latest commit.
hack/build-multiarch-operator.sh
Outdated
# If there is no buildx let's install it | ||
if ! docker buildx > /dev/null 2>&1; then | ||
mkdir -p ~/.docker/cli-plugins | ||
curl -L https://github.com/docker/buildx/releases/download/v0.6.3/buildx-v0.6.3.linux-amd64 --output ~/.docker/cli-plugins/docker-buildx |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hardcoded buildx version?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
good catch, corrected it.
hack/build-multiarch-operator.sh
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Did you run shellcheck against this file?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes.
It is fine to block while we discuss how to make it better please, |
a853967
to
22f160c
Compare
22f160c
to
820b930
Compare
build/operator/Dockerfile
Outdated
|
||
ARG TARGETOS | ||
ARG TARGETARCH | ||
ARG TARGETPLATFORM |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this arg used?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I may be blind, but where?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we use at
cluster-network-addons-operator/build/operator/Dockerfile
Lines 18 to 19 in 106c2b6
RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o build/_output/bin/manager ./cmd/... && \ | |
CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o build/_output/bin/manifest-templator ./tools/manifest-templator/... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TARGETPLATFORM can be removed.
hack/build-operator-docker.sh
Outdated
./hack/init-buildx.sh "$DOCKER_BUILDER" | ||
docker buildx build --platform "$PLATFORMS" $BUILD_ARGS | ||
fi | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Empty lines at EOF
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed.
ARG TARGETOS | ||
ARG TARGETARCH |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Where are these set?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TARGETOS and TARGETARCH are set by docker/podman based on the platform you're building for based on (--platform ) flag.
820b930
to
106c2b6
Compare
106c2b6
to
4aa7e93
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
quick pass
|
||
RUN dnf install -y tar gzip jq && dnf clean all | ||
RUN ARCH=$(uname -m | sed 's/x86_64/amd64/') && \ | ||
GO_VERSION=$(curl -L -s "https://go.dev/dl/?mode=json" | jq -r '.[0].version') && \ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i dont think we want unpinned go version?
stuff can break suddenly
unless we are fine with that or if this was the case already, lets see other maintainers idea
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This was already the case; this PR follows the same approach.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@oshoval For this as well, I will create a separate issue, resolve it, and provide a follow-up.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thanks, if this was already the case, no rush to fix it, its ok
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please consider in the follow-up to use ADD if it helps
hack/build-operator-docker.sh
Outdated
exit 1 | ||
fi | ||
|
||
# Split the comma-separated platforms into an array |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please drop comments
from all files, unless non trivial
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed.
|
||
docker-build-registry: | ||
$(OCI_BIN) build -f build/registry/Dockerfile -t $(IMAGE_REGISTRY)/$(REGISTRY_IMAGE):$(IMAGE_TAG) . | ||
|
||
docker-push: docker-push-operator docker-push-registry | ||
|
||
docker-push-operator: | ||
$(OCI_BIN) push ${TLS_SETTING} $(IMAGE_REGISTRY)/$(OPERATOR_IMAGE):$(IMAGE_TAG) | ||
ifeq ($(OCI_BIN),podman) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sorry that i change my mind, can you please estimate how deep the change will be doing it in this PR on separate commits ?
once we have the estimation we can decide
please see pull-cluster-network-addons-operator-unit-test |
|
These changes enable building and pushing container images for multiple platforms (amd64, s390x, arm64) from a single Dockerfile. Enhanced multi-platform support in the build process by adding a PLATFORMS argument in the Makefile for amd64, s390x, and arm64 architectures. Updated the docker-build-operator target to support builds with docker buildx and podman, and added new targets for creating Docker Buildx builders and pushing multi-platform images. Signed-off-by: Ashok Pariya <[email protected]>
4aa7e93
to
46b23df
Compare
|
Thanks @qinqon |
Could we please have a release once this PR is merged? There were commits made after the last release (v0.96.0) on October 8th. We would like to perform end-to-end testing on this release. |
yes thanks but at this very moment i cant work on that you are welcome if you want to check project-infra and suggest a PR |
Okay, thanks! For now, merging the PR once it passes the tests would be helpful. |
@RamLavi |
Very nice thanks |
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: oshoval The full list of commands accepted by this bot can be found here. The pull request process is described here
Needs approval from an approver in each of these files:
Approvers can indicate their approval by writing |
@oshoval Thanks for approving the PR! How can we trigger all the tests for it? |
/test all thought it auto triggers once lgtm approve |
Thanks @oshoval all tests have passed. There's one pending test job (tide) that requires the LGTM label. |
Hi @0xFelix |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/lgtm
Thanks!
Hi also i dont understand how come some lanes seems they didn't run |
Created #1929 Might need some time to upgrade the non laptop machine i am using, sorry about that, but otherwise |
|
||
for platform in "${PLATFORM_LIST[@]}"; do | ||
podman build \ | ||
--no-cache \ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please drop the no-cache on a follow-up
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks
podman manifest rm "${OPERATOR_IMAGE_TAGGED}" || true | ||
podman rmi "${OPERATOR_IMAGE_TAGGED}" || true |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please consider adding redir of stderr to /dev/null so it will clean up the logs from marking error on CI
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added in PR: #1928
These changes enable building and pushing CNAO operator image for multiple platforms (amd64, s390x, arm64) from a single Dockerfile. Enhanced multi-platform support in the build process by adding a PLATFORMS argument in the Makefile for amd64, s390x, and arm64 architectures. Updated the docker-build-operator target to support builds with docker buildx and podman, and added new targets for creating Docker Buildx builders and pushing multi-platform images.
What this PR does / why we need it:
The existing CNAO operator (link) currently supports only the amd64 architecture. These changes extend multi-platform support to include arm64 and s390x architectures, enabling broader compatibility for the CNAO operator image.
Special notes for your reviewer:
Please note that Docker and Podman handle multi-architecture image builds differently. As a result, the changes have been made accordingly. Additionally, Go cross-compilation support has been added to build binaries for the target architecture.
Added a PLATFORMS argument in the Makefile to support building images for multiple architectures (amd64, s390x, arm64).
Updated the Dockerfile to dynamically handle multi-architecture builds.
Added Go cross-compilation support in Dockerfile to build binaries for the target architecture.
Enhanced the docker-build-operator target to enable multi-platform builds using both docker buildx and podman.
Introduced a new build-multiarch-operator-image target to build and push multi-platform images using podman.
Added a create-builder target to generate Docker Buildx builders for multi-platform image support.
Release note: