You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pc...@apache.org on 2022/06/20 12:55:51 UTC

[camel-k] branch main updated: MultiArchitecture support (#3309)

This is an automated email from the ASF dual-hosted git repository.

pcongiusti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git


The following commit(s) were added to refs/heads/main by this push:
     new d71cddff2 MultiArchitecture support (#3309)
d71cddff2 is described below

commit d71cddff2064e90e3fe7deae8b81ec416acd7d89
Author: Roberto Navarra <ro...@gmail.com>
AuthorDate: Mon Jun 20 14:55:47 2022 +0200

    MultiArchitecture support (#3309)
    
    * restore core to upstream version
    update docker file for camel-k operator
    change makefile to build multiplatform image
    add platform parameter to buildah task
    
    * correct image and make file script
    
    * update buildah image version for multi platform support
    
    * replace arch with platform
    
    * add variant field and change the policy
    
    * add docker.io inside baseimage
    
    * obtain architecture value from PublishStrategyOptions
    add buildah go file inside builder package
    add Architecture field inside publish task and mapping to buildah
    
    * replace name of buildah property
    
    * correct buildah attribute
    
    * correct attribute name
    platform attribute moved to BuildahTask
    
    * add Dockerfile.arch to support arm64
    add images-arch images-dev-arch bundle-build-arch for manual build
    
    * remove useless import
    
    * execute goimports lint
    
    * correct docker file for buildx
    
    * correct makefile command
    use platform attribute if exists
    docker.io from defaults.go
    
    * fix platform initialize
    
    * improve readibility of bud command
    
    * remove useless containerd dependency
    
    * Fix makefile images-arch command
    
    * correct docker image name
    
    * add default docker.io to baseimage because buildah required it
    correct bud initialization
    
    * correct bud command
    
    * correct bud command with platform
    
    * add log to trace platform attribute
    
    * add docs page to describe multi architecture use
    
    * add note
    
    * Generate CRD
    
    * regenerate crd
    
    Co-authored-by: ConsNavarraRoberto <co...@sia.eu>
    Co-authored-by: raspberry <pi...@raspberry.home>
---
 build/Dockerfile.arch                              | 47 +++++++++++++
 config/crd/bases/camel.apache.org_builds.yaml      |  3 +
 .../pages/configuration/multi-architecture.adoc    | 81 ++++++++++++++++++++++
 docs/modules/ROOT/partials/apis/camel-k-crds.adoc  | 40 ++++++++++-
 docs/modules/ROOT/partials/apis/kamelets-crds.adoc | 14 ++++
 go.sum                                             |  1 +
 helm/camel-k/crds/crd-build.yaml                   |  3 +
 pkg/apis/camel/v1/build_types.go                   |  2 +
 .../defaults/defaults.go => builder/buildah.go}    | 35 +---------
 pkg/controller/build/build_pod.go                  | 18 ++++-
 pkg/trait/builder.go                               | 11 +++
 pkg/util/defaults/defaults.go                      |  4 +-
 script/Makefile                                    | 38 +++++++++-
 13 files changed, 254 insertions(+), 43 deletions(-)

diff --git a/build/Dockerfile.arch b/build/Dockerfile.arch
new file mode 100644
index 000000000..799e65da5
--- /dev/null
+++ b/build/Dockerfile.arch
@@ -0,0 +1,47 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM --platform=$BUILDPLATFORM ghcr.io/graalvm/graalvm-ce:ol8-java11-22.1.0
+
+ARG MAVEN_VERSION="3.8.4"
+ARG MAVEN_HOME="/usr/share/maven"
+ARG SHA="a9b2d825eacf2e771ed5d6b0e01398589ac1bfa4171f36154d1b5787879605507802f699da6f7cfc80732a5282fd31b28e4cd6052338cbef0fa1358b48a5e3c8"
+ARG BASE_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries"
+
+USER 0
+
+RUN mkdir -p ${MAVEN_HOME} \
+    && curl -Lso /tmp/maven.tar.gz ${BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
+    && echo "${SHA} /tmp/maven.tar.gz" | sha512sum -c - \
+    && tar -xzC ${MAVEN_HOME} --strip-components=1 -f /tmp/maven.tar.gz \
+    && rm -v /tmp/maven.tar.gz \
+    && ln -s ${MAVEN_HOME}/bin/mvn /usr/bin/mvn \
+    && rm ${MAVEN_HOME}/lib/maven-slf4j-provider*
+
+ADD build/_maven_output /tmp/artifacts/m2
+ADD build/_kamelets /kamelets
+COPY build/_maven_overlay/ /usr/share/maven/lib/
+ADD build/logback.xml /usr/share/maven/conf/
+
+ENV MAVEN_OPTS="${MAVEN_OPTS} -Dlogback.configurationFile=/usr/share/maven/conf/logback.xml"
+
+RUN chgrp -R 0 /tmp/artifacts/m2 \
+    && chmod -R g=u /tmp/artifacts/m2 \
+    && chgrp -R 0 /kamelets \
+    && chmod -R g=u /kamelets
+
+USER 1000
+
+ADD build/_output/bin/kamel /usr/local/bin/kamel
diff --git a/config/crd/bases/camel.apache.org_builds.yaml b/config/crd/bases/camel.apache.org_builds.yaml
index 5db172705..f7d585a7e 100644
--- a/config/crd/bases/camel.apache.org_builds.yaml
+++ b/config/crd/bases/camel.apache.org_builds.yaml
@@ -107,6 +107,9 @@ spec:
                         name:
                           description: name of the task
                           type: string
+                        platform:
+                          description: The platform of build image
+                          type: string
                         registry:
                           description: where to publish the final image
                           properties:
diff --git a/docs/modules/ROOT/pages/configuration/multi-architecture.adoc b/docs/modules/ROOT/pages/configuration/multi-architecture.adoc
new file mode 100644
index 000000000..45c0c2e4b
--- /dev/null
+++ b/docs/modules/ROOT/pages/configuration/multi-architecture.adoc
@@ -0,0 +1,81 @@
+[[multi-architecture-props]]
+= Multi Architecture
+
+To use kamel inside other architecture like arm64 you must build it and use Buildah as builder strategy.
+
+NOTE: For now only arm64 is supported as other architectures
+
+[[multi-architecture-build]]
+== Build and Publish Kamel
+
+As first step it's necessary to build kamel project `https://github.com/apache/camel-k` manually and push image to own docker repository.
+
+I suggest to create a free docker image repository with `docker-hub` or `ghcr`.
+
+[source,shell]
+.script/Makefile
+----
+make build images-arch images-push
+----
+
+NOTE: The base image of kamel operator is graalvm because multi architecture quarkus-mandrel image not published yet
+
+[[multi-architecture-install]]
+== Install Kamel
+
+Proceed with installation of kamel inside kubernetes cluster with the below command
+
+[source,shell]
+----
+./kamel install --build-publish-strategy=Buildah --registry YOUR_REGISTRY --registry-auth-username YOUR_USERNAME --registry-auth-password YOUR_PASSWORD
+----
+
+[[multi-architecture-use]]
+== Use kamel
+
+Build and run an integration
+
+[source,groovy]
+.hello.groovy
+----
+from('timer:tick?period=3000')
+  .setBody().constant('Hello world from Camel K')
+  .to('log:info')
+----
+
+Send the groovy file to kamel operator to build, publish and run it
+[source,shell]
+----
+kamel run hello.groovy
+----
+
+[[multi-architecture-configure-optional]]
+== Optional Buildah Configuration
+
+If you want change the default architecture of buildah build strategy, you must edit integration platform manually.
+
+[source,shell]
+----
+kubectl edit ip
+----
+
+This command will open the editor with the yaml of `IntegrationPlatform`, to change the architecture you can fill inside `spec.build.PublishStrategyOptions` as below
+[source,yaml]
+----
+spec:
+  build:
+    PublishStrategyOptions:
+      BuildahPlatform: linux/arm/v8
+----
+
+After few seconds the yaml will be updated and that field is imported inside status
+
+[source,yaml]
+----
+status:
+  build:
+    PublishStrategyOptions:
+      BuildahPlatform: linux/arm/v8
+----
+
+NOTE: It's important to know buidah supports only amd64 and arm64
diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
index b70cc29db..62fe06ce1 100644
--- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
+++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
@@ -431,6 +431,13 @@ BuildStatus defines the observed state of Build
 |Field
 |Description
 
+|`observedGeneration` +
+int64
+|
+
+
+ObservedGeneration is the most recent generation observed for this Build.
+
 |`phase` +
 *xref:#_camel_apache_org_v1_BuildPhase[BuildPhase]*
 |
@@ -546,6 +553,13 @@ BuildahTask is used to configure Buildah
 
 
 
+|`platform` +
+string
+|
+
+
+The platform of build image
+
 |`verbose` +
 bool
 |
@@ -1425,6 +1439,13 @@ IntegrationKitStatus defines the observed state of IntegrationKit
 |Field
 |Description
 
+|`observedGeneration` +
+int64
+|
+
+
+ObservedGeneration is the most recent generation observed for this IntegrationKit.
+
 |`phase` +
 *xref:#_camel_apache_org_v1_IntegrationKitPhase[IntegrationKitPhase]*
 |
@@ -1861,6 +1882,13 @@ IntegrationPlatformStatus defines the observed state of IntegrationPlatform
 
 
 
+|`observedGeneration` +
+int64
+|
+
+
+ObservedGeneration is the most recent generation observed for this IntegrationPlatform.
+
 |`phase` +
 *xref:#_camel_apache_org_v1_IntegrationPlatformPhase[IntegrationPlatformPhase]*
 |
@@ -2014,6 +2042,13 @@ IntegrationStatus defines the observed state of Integration
 |Field
 |Description
 
+|`observedGeneration` +
+int64
+|
+
+
+ObservedGeneration is the most recent generation observed for this Integration.
+
 |`phase` +
 *xref:#_camel_apache_org_v1_IntegrationPhase[IntegrationPhase]*
 |
@@ -2485,9 +2520,8 @@ NodeSelector
 
 TopologySpreadConstraints
 
-
 |`securityContext` +
-*https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core[[\]Kubernetes core/v1.PodSecurityContext]*
+*https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#podsecuritycontext-v1-core[Kubernetes core/v1.PodSecurityContext]*
 |
 
 
@@ -3204,4 +3238,4 @@ Selects a key of a ConfigMap.
 Selects a key of a secret.
 
 
-|===
+|===
\ No newline at end of file
diff --git a/docs/modules/ROOT/partials/apis/kamelets-crds.adoc b/docs/modules/ROOT/partials/apis/kamelets-crds.adoc
index fe8e1b828..04aab42a9 100644
--- a/docs/modules/ROOT/partials/apis/kamelets-crds.adoc
+++ b/docs/modules/ROOT/partials/apis/kamelets-crds.adoc
@@ -874,6 +874,13 @@ KameletBindingStatus specify the status of a binding
 |Field
 |Description
 
+|`observedGeneration` +
+int64
+|
+
+
+ObservedGeneration is the most recent generation observed for this KameletBinding.
+
 |`phase` +
 *xref:#_camel_apache_org_v1alpha1_KameletBindingPhase[KameletBindingPhase]*
 |
@@ -1096,6 +1103,13 @@ KameletStatus defines the observed state of Kamelet
 |Field
 |Description
 
+|`observedGeneration` +
+int64
+|
+
+
+ObservedGeneration is the most recent generation observed for this Kamelet.
+
 |`phase` +
 *xref:#_camel_apache_org_v1alpha1_KameletPhase[KameletPhase]*
 |
diff --git a/go.sum b/go.sum
index 711cdf2a0..520c4ff6f 100644
--- a/go.sum
+++ b/go.sum
@@ -310,6 +310,7 @@ github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7
 github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU=
 github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI=
 github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s=
+github.com/containerd/containerd v1.5.8 h1:NmkCC1/QxyZFBny8JogwLpOy2f+VEbO/f6bV2Mqtwuw=
 github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s=
 github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
diff --git a/helm/camel-k/crds/crd-build.yaml b/helm/camel-k/crds/crd-build.yaml
index 5db172705..f7d585a7e 100644
--- a/helm/camel-k/crds/crd-build.yaml
+++ b/helm/camel-k/crds/crd-build.yaml
@@ -107,6 +107,9 @@ spec:
                         name:
                           description: name of the task
                           type: string
+                        platform:
+                          description: The platform of build image
+                          type: string
                         registry:
                           description: where to publish the final image
                           properties:
diff --git a/pkg/apis/camel/v1/build_types.go b/pkg/apis/camel/v1/build_types.go
index 880fef782..0de3fd47c 100644
--- a/pkg/apis/camel/v1/build_types.go
+++ b/pkg/apis/camel/v1/build_types.go
@@ -107,6 +107,8 @@ type PublishTask struct {
 type BuildahTask struct {
 	BaseTask    `json:",inline"`
 	PublishTask `json:",inline"`
+	// The platform of build image
+	Platform string `json:"platform,omitempty"`
 	// log more information
 	Verbose *bool `json:"verbose,omitempty"`
 }
diff --git a/pkg/util/defaults/defaults.go b/pkg/builder/buildah.go
similarity index 54%
copy from pkg/util/defaults/defaults.go
copy to pkg/builder/buildah.go
index 257d8e3ce..d900ec1fe 100644
--- a/pkg/util/defaults/defaults.go
+++ b/pkg/builder/buildah.go
@@ -15,37 +15,6 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package defaults
+package builder
 
-// ***********************
-//  DO NOT EDIT THIS FILE
-// ***********************
-
-const (
-	// Version --
-	Version = "1.10.0-SNAPSHOT"
-
-	// DefaultRuntimeVersion --
-	DefaultRuntimeVersion = "1.13.0"
-
-	// BuildahVersion --
-	BuildahVersion = "1.14.0"
-
-	// KanikoVersion --
-	KanikoVersion = "0.17.1"
-
-	// baseImage --
-	baseImage = "adoptopenjdk/openjdk11:slim"
-
-	// LocalRepository --
-	LocalRepository = "/tmp/artifacts/m2"
-
-	// ImageName --
-	ImageName = "docker.io/apache/camel-k"
-
-	// installDefaultKamelets --
-	installDefaultKamelets = true
-)
-
-// GitCommit must be provided during application build
-var GitCommit string
+const BuildahPlatform = "BuildahPlatform"
diff --git a/pkg/controller/build/build_pod.go b/pkg/controller/build/build_pod.go
index 00cab13aa..1ebb74c52 100644
--- a/pkg/controller/build/build_pod.go
+++ b/pkg/controller/build/build_pod.go
@@ -30,7 +30,6 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-
 	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
 
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
@@ -239,16 +238,29 @@ func addBuildTaskToPod(build *v1.Build, taskName string, pod *corev1.Pod) {
 }
 
 func addBuildahTaskToPod(ctx context.Context, c ctrl.Reader, build *v1.Build, task *v1.BuildahTask, pod *corev1.Pod) error {
-	bud := []string{
+	var bud []string
+
+	bud = []string{
 		"buildah",
 		"bud",
 		"--storage-driver=vfs",
+	}
+
+	if task.Platform != "" {
+		bud = append(bud, []string{
+			"--platform",
+			task.Platform,
+		}...)
+	}
+
+	bud = append(bud, []string{
+		"--pull-always",
 		"-f",
 		"Dockerfile",
 		"-t",
 		task.Image,
 		".",
-	}
+	}...)
 
 	push := []string{
 		"buildah",
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index 21908ed03..9b7ea2e64 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -101,7 +101,17 @@ func (t *builderTrait) Apply(e *Environment) error {
 		}})
 
 	case v1.IntegrationPlatformBuildPublishStrategyBuildah:
+		var platform string
+		var found bool
+		if platform, found = e.Platform.Status.Build.PublishStrategyOptions[builder.BuildahPlatform]; !found {
+			platform = ""
+			t.L.Infof("Attribute platform for buildah not found, default from host will be used!")
+		} else {
+			t.L.Infof("User defined %s platform, will be used from buildah!", platform)
+		}
+
 		e.BuildTasks = append(e.BuildTasks, v1.Task{Buildah: &v1.BuildahTask{
+			Platform: platform,
 			BaseTask: v1.BaseTask{
 				Name: "buildah",
 			},
@@ -151,6 +161,7 @@ func (t *builderTrait) builderTask(e *Environment) (*v1.BuilderTask, error) {
 	for _, repo := range e.IntegrationKit.Spec.Repositories {
 		maven.Repositories = append(maven.Repositories, mvn.NewRepository(repo))
 	}
+
 	task := &v1.BuilderTask{
 		BaseTask: v1.BaseTask{
 			Name: "builder",
diff --git a/pkg/util/defaults/defaults.go b/pkg/util/defaults/defaults.go
index 257d8e3ce..90ca3eb15 100644
--- a/pkg/util/defaults/defaults.go
+++ b/pkg/util/defaults/defaults.go
@@ -29,13 +29,13 @@ const (
 	DefaultRuntimeVersion = "1.13.0"
 
 	// BuildahVersion --
-	BuildahVersion = "1.14.0"
+	BuildahVersion = "1.23.3"
 
 	// KanikoVersion --
 	KanikoVersion = "0.17.1"
 
 	// baseImage --
-	baseImage = "adoptopenjdk/openjdk11:slim"
+	baseImage = "docker.io/adoptopenjdk/openjdk11:slim"
 
 	// LocalRepository --
 	LocalRepository = "/tmp/artifacts/m2"
diff --git a/script/Makefile b/script/Makefile
index 635f3265c..5b12f11b0 100644
--- a/script/Makefile
+++ b/script/Makefile
@@ -19,14 +19,14 @@ OPERATOR_VERSION := $(subst -SNAPSHOT,,$(VERSION))
 LAST_RELEASED_IMAGE_NAME := camel-k-operator
 LAST_RELEASED_VERSION := 1.9.2
 RUNTIME_VERSION := 1.13.0
-BUILDAH_VERSION := 1.14.0
+BUILDAH_VERSION := 1.23.3
 KANIKO_VERSION := 0.17.1
 INSTALL_DEFAULT_KAMELETS := true
 CONTROLLER_GEN_VERSION := v0.6.1
 OPERATOR_SDK_VERSION := v1.14.0
 KUSTOMIZE_VERSION := v4.1.2
 OPM_VERSION := v1.21.0
-BASE_IMAGE := adoptopenjdk/openjdk11:slim
+BASE_IMAGE := docker.io/adoptopenjdk/openjdk11:slim
 LOCAL_REPOSITORY := /tmp/artifacts/m2
 IMAGE_NAME := docker.io/apache/camel-k
 
@@ -334,6 +334,23 @@ else
 endif
 	docker build -t $(CUSTOM_IMAGE):$(CUSTOM_VERSION) -f build/Dockerfile .
 
+images-arch: bundle-kamelets test maven-overlay
+	mkdir -p build/_maven_output
+	mkdir -p build/_output/bin
+ifneq ($(shell uname -s 2>/dev/null || echo Unknown),Linux)
+	GOOS=linux go build $(GOFLAGS) -o build/_output/bin/kamel ./cmd/kamel/*.go
+else
+	cp kamel build/_output/bin
+endif
+	docker buildx rm --all-inactive --force
+	docker buildx create --append --name builder
+ifeq ($(shell uname -m), x86_x64)
+    	docker buildx build --platform=linux/amd64 -t $(CUSTOM_IMAGE):$(CUSTOM_VERSION) -f build/Dockerfile.arch .
+endif
+ifeq ($(shell uname -m), aarch64)
+	docker buildx build --platform=linux/arm64 -t $(CUSTOM_IMAGE):$(CUSTOM_VERSION) -f build/Dockerfile.arch .
+endif
+
 images-dev: bundle-kamelets test package-artifacts maven-overlay
 	mkdir -p build/_maven_output
 	mkdir -p build/_output/bin
@@ -344,6 +361,23 @@ else
 endif
 	docker build -t $(CUSTOM_IMAGE):$(CUSTOM_VERSION) -f build/Dockerfile .
 
+images-arch-dev: bundle-kamelets test package-artifacts maven-overlay
+	mkdir -p build/_maven_output
+	mkdir -p build/_output/bin
+ifneq ($(shell uname -s 2>/dev/null || echo Unknown),Linux)
+	GOOS=linux go build $(GOFLAGS) -o build/_output/bin/kamel ./cmd/kamel/*.go
+else
+	cp kamel build/_output/bin
+endif
+	docker buildx rm --all-inactive --force
+	docker buildx create --append --name builder
+ifeq ($(shell uname -m), x86_x64)
+	docker buildx build --platform=linux/amd64 -t $(CUSTOM_IMAGE):$(CUSTOM_VERSION) -f build/Dockerfile.arch .
+endif
+ifeq ($(shell uname -m), aarch64)
+	docker buildx build --platform=linux/arm64 -t $(CUSTOM_IMAGE):$(CUSTOM_VERSION) -f build/Dockerfile.arch .
+endif
+
 images-push:
 	docker push $(CUSTOM_IMAGE):$(CUSTOM_VERSION)