From 579dd378f74f85e3e9ff3fb8c36e0c744e27c3ef Mon Sep 17 00:00:00 2001 From: Benjamin Isinger Date: Fri, 9 May 2025 17:10:14 +0200 Subject: [PATCH] Add support to configure MaxVolumesPerNode for of csi node Add support to configure MaxVolumesPerNode setting of csi node via the cos-csi-driver-configmap. The configmap value will be synced to the CR The node syncer will then update the MAX_VOLUMES_PER_NODE env var on the daemonset Depends on https://github.com/IBM/ibm-object-csi-driver/pull/173 Signed-off-by: Benjamin Isinger --- api/v1alpha1/ibmobjectcsi_types.go | 3 +++ controllers/ibmobjectcsi_controller.go | 14 ++++++++++---- controllers/syncer/csi_node.go | 11 ++++++++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/api/v1alpha1/ibmobjectcsi_types.go b/api/v1alpha1/ibmobjectcsi_types.go index 33ef1d5..190622a 100644 --- a/api/v1alpha1/ibmobjectcsi_types.go +++ b/api/v1alpha1/ibmobjectcsi_types.go @@ -69,6 +69,9 @@ type IBMObjectCSINodeSpec struct { Tolerations []corev1.Toleration `json:"tolerations,omitempty"` Resources ResourcesSpec `json:"resources,omitempty"` + + // +kubebuilder:validation:Optional + MaxVolumesPerNode string `json:"maxVolumesPerNode,omitempty"` } // IBMObjectCSIControllerSpec defines the desired state of IBMObjectCSIController diff --git a/controllers/ibmobjectcsi_controller.go b/controllers/ibmobjectcsi_controller.go index d7ce78d..a25f485 100644 --- a/controllers/ibmobjectcsi_controller.go +++ b/controllers/ibmobjectcsi_controller.go @@ -222,10 +222,15 @@ func (r *IBMObjectCSIReconciler) handleConfigMapReconcile(ctx context.Context, r CSINodeMemoryRequest := configMap.Data["CSINodeMemoryRequest"] CSINodeCPULimit := configMap.Data["CSINodeCPULimit"] CSINodeMemoryLimit := configMap.Data["CSINodeMemoryLimit"] + CSINodeMaxVolumesPerNode := configMap.Data["CSINodeMaxVolumesPerNode"] - reqLogger.Info("The resource requests and limits fetched from configmap", - "CSINodeCPURequest", CSINodeCPURequest, "CSINodeMemoryRequest", CSINodeMemoryRequest, - "CSINodeCPULimit", CSINodeCPULimit, "CSINodeMemoryLimit", CSINodeMemoryLimit) + reqLogger.Info("Configruration fetched from configmap", + "CSINodeCPURequest", CSINodeCPURequest, + "CSINodeMemoryRequest", CSINodeMemoryRequest, + "CSINodeCPULimit", CSINodeCPULimit, + "CSINodeMemoryLimit", CSINodeMemoryLimit, + "CSINodeMaxVolumesPerNode", CSINodeMaxVolumesPerNode, + ) // Fetch the IBMObjectCSI instance instance := &objectdriverv1alpha1.IBMObjectCSI{} @@ -245,9 +250,10 @@ func (r *IBMObjectCSIReconciler) handleConfigMapReconcile(ctx context.Context, r instance.Spec.Node.Resources.Requests.Memory = CSINodeMemoryRequest instance.Spec.Node.Resources.Limits.CPU = CSINodeCPULimit instance.Spec.Node.Resources.Limits.Memory = CSINodeMemoryLimit + instance.Spec.Node.MaxVolumesPerNode = CSINodeMaxVolumesPerNode // Update the instance in the Kubernetes API server - reqLogger.Info("Updating IBMObjectCSI CR with resource requests and limits for Node pods") + reqLogger.Info("Updating IBMObjectCSI CR with ConfigMap values") err = r.Update(ctx, instance) if err != nil { reqLogger.Error(err, "Failed to update IBMObjectCSI instance with ConfigMap values") diff --git a/controllers/syncer/csi_node.go b/controllers/syncer/csi_node.go index 21c96cb..6b66c99 100644 --- a/controllers/syncer/csi_node.go +++ b/controllers/syncer/csi_node.go @@ -212,7 +212,7 @@ func envVarFromField(name, fieldPath string) corev1.EnvVar { func (s *csiNodeSyncer) getEnvFor(name string) []corev1.EnvVar { switch name { case constants.NodeContainerName: - return []corev1.EnvVar{ + envVars := []corev1.EnvVar{ { Name: "CSI_ENDPOINT", Value: constants.CSINodeEndpoint, @@ -220,6 +220,15 @@ func (s *csiNodeSyncer) getEnvFor(name string) []corev1.EnvVar { envVarFromField("KUBE_NODE_NAME", "spec.nodeName"), } + if s.driver.Spec.Node.MaxVolumesPerNode != "" { + envVars = append(envVars, corev1.EnvVar{ + Name: "MAX_VOLUMES_PER_NODE", + Value: s.driver.Spec.Node.MaxVolumesPerNode, + }) + } + + return envVars + case constants.CSINodeDriverRegistrar: return []corev1.EnvVar{ {