You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2019/06/07 13:11:11 UTC
[camel-k] 02/07: Fix #703: fix warming cache and affinity to work
in global mode
This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit ebf1d62673ae24f96729b4a5e30dc4687420b4f8
Author: nferraro <ni...@gmail.com>
AuthorDate: Wed Jun 5 13:03:29 2019 +0200
Fix #703: fix warming cache and affinity to work in global mode
---
deploy/operator-role-kubernetes.yaml | 3 ++
deploy/operator-role-openshift.yaml | 3 ++
deploy/resources.go | 6 ++++
pkg/builder/kaniko/publisher.go | 36 ++++++++++++++++--------
pkg/controller/build/schedule_pod.go | 31 ++++++++++++--------
pkg/controller/integrationplatform/initialize.go | 20 +++++++++----
pkg/platform/operator.go | 31 ++++++++++++++------
7 files changed, 93 insertions(+), 37 deletions(-)
diff --git a/deploy/operator-role-kubernetes.yaml b/deploy/operator-role-kubernetes.yaml
index 30bdf03..5b44671 100644
--- a/deploy/operator-role-kubernetes.yaml
+++ b/deploy/operator-role-kubernetes.yaml
@@ -37,6 +37,9 @@ rules:
- persistentvolumeclaims
- configmaps
- secrets
+ - serviceaccounts
+ - roles
+ - rolebindings
verbs:
- create
- delete
diff --git a/deploy/operator-role-openshift.yaml b/deploy/operator-role-openshift.yaml
index 695ddce..ea12152 100644
--- a/deploy/operator-role-openshift.yaml
+++ b/deploy/operator-role-openshift.yaml
@@ -37,6 +37,9 @@ rules:
- persistentvolumeclaims
- configmaps
- secrets
+ - serviceaccounts
+ - roles
+ - rolebindings
verbs:
- create
- delete
diff --git a/deploy/resources.go b/deploy/resources.go
index 53af8b2..cc87284 100644
--- a/deploy/resources.go
+++ b/deploy/resources.go
@@ -10815,6 +10815,9 @@ rules:
- persistentvolumeclaims
- configmaps
- secrets
+ - serviceaccounts
+ - roles
+ - rolebindings
verbs:
- create
- delete
@@ -10895,6 +10898,9 @@ rules:
- persistentvolumeclaims
- configmaps
- secrets
+ - serviceaccounts
+ - roles
+ - rolebindings
verbs:
- create
- delete
diff --git a/pkg/builder/kaniko/publisher.go b/pkg/builder/kaniko/publisher.go
index f11c19b..6de226e 100644
--- a/pkg/builder/kaniko/publisher.go
+++ b/pkg/builder/kaniko/publisher.go
@@ -24,6 +24,7 @@ import (
"time"
"github.com/apache/camel-k/pkg/builder"
+ "github.com/apache/camel-k/pkg/platform"
"github.com/apache/camel-k/pkg/util/kubernetes"
"github.com/apache/camel-k/pkg/util/tar"
@@ -131,19 +132,32 @@ func publisher(ctx *builder.Context) error {
},
RestartPolicy: corev1.RestartPolicyNever,
Volumes: volumes,
- // Co-locate with builder pod for sharing the volume
- Affinity: &corev1.Affinity{
- PodAffinity: &corev1.PodAffinity{
- RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{
- {
- LabelSelector: &metav1.LabelSelector{
- MatchLabels: map[string]string{
- "camel.apache.org/component": "operator",
- },
- },
- TopologyKey: "kubernetes.io/hostname",
+ },
+ }
+
+
+ var labelKey string
+ var labelValue string
+ if ctx.Namespace == platform.GetOperatorNamespace() {
+ // Check if the operator is running in the same namespace
+ labelKey = "camel.apache.org/component"
+ labelValue = "operator"
+ } else {
+ labelKey = "camel.apache.org/build"
+ labelValue = ctx.Build.Meta.Name
+ }
+
+ // Co-locate with builder pod for sharing the volume
+ pod.Spec.Affinity = &corev1.Affinity{
+ PodAffinity: &corev1.PodAffinity{
+ RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{
+ {
+ LabelSelector: &metav1.LabelSelector{
+ MatchLabels: map[string]string{
+ labelKey: labelValue,
},
},
+ TopologyKey: "kubernetes.io/hostname",
},
},
},
diff --git a/pkg/controller/build/schedule_pod.go b/pkg/controller/build/schedule_pod.go
index 60a9278..ee84c54 100644
--- a/pkg/controller/build/schedule_pod.go
+++ b/pkg/controller/build/schedule_pod.go
@@ -156,6 +156,9 @@ func newBuildPod(build *v1alpha1.Build, operatorImage string) *corev1.Pod {
ObjectMeta: metav1.ObjectMeta{
Namespace: build.Namespace,
Name: buildPodName(build.Spec.Meta),
+ Labels: map[string]string{
+ "camel.apache.org/build": build.Name,
+ },
},
Spec: corev1.PodSpec{
ServiceAccountName: "camel-k-operator",
@@ -193,22 +196,26 @@ func newBuildPod(build *v1alpha1.Build, operatorImage string) *corev1.Pod {
MountPath: build.Spec.BuildDir,
},
}
- // Co-locate with the builder pod for sharing the host path volume as the current
- // persistent volume claim uses the default storage class which is likely relying
- // on the host path provisioner.
- pod.Spec.Affinity = &corev1.Affinity{
- PodAffinity: &corev1.PodAffinity{
- RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{
- {
- LabelSelector: &metav1.LabelSelector{
- MatchLabels: map[string]string{
- "camel.apache.org/component": "operator",
+
+ // Use affinity only when the operator is present in the namespaced
+ if build.Namespace == platform.GetOperatorNamespace() {
+ // Co-locate with the builder pod for sharing the host path volume as the current
+ // persistent volume claim uses the default storage class which is likely relying
+ // on the host path provisioner.
+ pod.Spec.Affinity = &corev1.Affinity{
+ PodAffinity: &corev1.PodAffinity{
+ RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{
+ {
+ LabelSelector: &metav1.LabelSelector{
+ MatchLabels: map[string]string{
+ "camel.apache.org/component": "operator",
+ },
},
+ TopologyKey: "kubernetes.io/hostname",
},
- TopologyKey: "kubernetes.io/hostname",
},
},
- },
+ }
}
}
diff --git a/pkg/controller/integrationplatform/initialize.go b/pkg/controller/integrationplatform/initialize.go
index d8cea6e..6976165 100644
--- a/pkg/controller/integrationplatform/initialize.go
+++ b/pkg/controller/integrationplatform/initialize.go
@@ -153,13 +153,21 @@ func (action *initializeAction) Handle(ctx context.Context, ip *v1alpha1.Integra
return err
}
- // Create the Kaniko warmer pod that caches the base image into the Camel K builder volume
- action.L.Info("Create Kaniko cache warmer pod")
- err = createKanikoCacheWarmerPod(ctx, action.client, target)
- if err != nil {
- return err
+ // Check if the operator is running in the same namespace before starting the cache warmer
+ if target.Namespace == platform.GetOperatorNamespace() {
+ // Create the Kaniko warmer pod that caches the base image into the Camel K builder volume
+ action.L.Info("Create Kaniko cache warmer pod")
+ err = createKanikoCacheWarmerPod(ctx, action.client, target)
+ if err != nil {
+ return err
+ }
+
+ target.Status.Phase = v1alpha1.IntegrationPlatformPhaseWarming
+ } else {
+ // Skip the warmer pod creation
+ target.Status.Phase = v1alpha1.IntegrationPlatformPhaseCreating
}
- target.Status.Phase = v1alpha1.IntegrationPlatformPhaseWarming
+
} else {
target.Status.Phase = v1alpha1.IntegrationPlatformPhaseCreating
}
diff --git a/pkg/platform/operator.go b/pkg/platform/operator.go
index 2ffd051..82ed950 100644
--- a/pkg/platform/operator.go
+++ b/pkg/platform/operator.go
@@ -24,6 +24,7 @@ import (
"strings"
v1 "k8s.io/api/core/v1"
+ k8serrors "k8s.io/apimachinery/pkg/api/errors"
"sigs.k8s.io/controller-runtime/pkg/client"
)
@@ -33,13 +34,9 @@ const operatorPodNameEnvVariable = "POD_NAME"
// GetCurrentOperatorImage returns the image currently used by the running operator if present (when running out of cluster, it may be absent).
func GetCurrentOperatorImage(ctx context.Context, c client.Client) (string, error) {
- var podNamespace string
- var podName string
- var envSet bool
- if podNamespace, envSet = os.LookupEnv(operatorNamespaceEnvVariable); !envSet || podNamespace == "" {
- return "", nil
- }
- if podName, envSet = os.LookupEnv(operatorPodNameEnvVariable); !envSet || podName == "" {
+ podNamespace := GetOperatorNamespace()
+ podName := GetOperatorPodName()
+ if podNamespace == "" || podName == "" {
return "", nil
}
@@ -49,7 +46,9 @@ func GetCurrentOperatorImage(ctx context.Context, c client.Client) (string, erro
}
pod := v1.Pod{}
- if err := c.Get(ctx, podKey, &pod); err != nil {
+ if err := c.Get(ctx, podKey, &pod); err != nil && k8serrors.IsNotFound(err) {
+ return "", nil
+ } else if err != nil {
return "", err
}
if len(pod.Spec.Containers) == 0 {
@@ -65,3 +64,19 @@ func IsCurrentOperatorGlobal() bool {
}
return false
}
+
+// GetOperatorNamespace returns the namespace where the current operator is located (if set)
+func GetOperatorNamespace() string {
+ if podNamespace, envSet := os.LookupEnv(operatorNamespaceEnvVariable); envSet {
+ return podNamespace
+ }
+ return ""
+}
+
+// GetOperatorPodName returns the pod that is running the current operator (if any)
+func GetOperatorPodName() string {
+ if podName, envSet := os.LookupEnv(operatorPodNameEnvVariable); envSet {
+ return podName
+ }
+ return ""
+}