diff --git a/manifests/cluster-manager/management/cluster-manager-placement-deployment.yaml b/manifests/cluster-manager/management/cluster-manager-placement-deployment.yaml index 5e1b143a6..617697c3a 100644 --- a/manifests/cluster-manager/management/cluster-manager-placement-deployment.yaml +++ b/manifests/cluster-manager/management/cluster-manager-placement-deployment.yaml @@ -70,8 +70,8 @@ spec: initialDelaySeconds: 2 resources: requests: - cpu: 100m - memory: 128Mi + cpu: 2m + memory: 16Mi {{ if .DetachedMode }} volumeMounts: - mountPath: /var/run/secrets/hub diff --git a/manifests/cluster-manager/management/cluster-manager-registration-deployment.yaml b/manifests/cluster-manager/management/cluster-manager-registration-deployment.yaml index 3273c7ef3..5ce02437a 100644 --- a/manifests/cluster-manager/management/cluster-manager-registration-deployment.yaml +++ b/manifests/cluster-manager/management/cluster-manager-registration-deployment.yaml @@ -71,8 +71,8 @@ spec: initialDelaySeconds: 2 resources: requests: - cpu: 100m - memory: 128Mi + cpu: 2m + memory: 16Mi {{ if .DetachedMode }} volumeMounts: - mountPath: /var/run/secrets/hub diff --git a/manifests/cluster-manager/management/cluster-manager-registration-webhook-deployment.yaml b/manifests/cluster-manager/management/cluster-manager-registration-webhook-deployment.yaml index eee2cb0d8..2b7b16f60 100644 --- a/manifests/cluster-manager/management/cluster-manager-registration-webhook-deployment.yaml +++ b/manifests/cluster-manager/management/cluster-manager-registration-webhook-deployment.yaml @@ -76,8 +76,8 @@ spec: initialDelaySeconds: 2 resources: requests: - cpu: 100m - memory: 128Mi + cpu: 2m + memory: 16Mi volumeMounts: - name: webhook-secret mountPath: "/serving-cert" diff --git a/manifests/cluster-manager/management/cluster-manager-work-webhook-deployment.yaml b/manifests/cluster-manager/management/cluster-manager-work-webhook-deployment.yaml index 1645ea2ad..d0e79993e 100644 --- a/manifests/cluster-manager/management/cluster-manager-work-webhook-deployment.yaml +++ b/manifests/cluster-manager/management/cluster-manager-work-webhook-deployment.yaml @@ -75,8 +75,8 @@ spec: initialDelaySeconds: 2 resources: requests: - cpu: 100m - memory: 128Mi + cpu: 2m + memory: 16Mi volumeMounts: - name: webhook-secret mountPath: "/serving-cert" diff --git a/manifests/klusterlet/management/klusterlet-registration-deployment.yaml b/manifests/klusterlet/management/klusterlet-registration-deployment.yaml index 296a12611..3c443f91a 100644 --- a/manifests/klusterlet/management/klusterlet-registration-deployment.yaml +++ b/manifests/klusterlet/management/klusterlet-registration-deployment.yaml @@ -90,8 +90,8 @@ spec: initialDelaySeconds: 2 resources: requests: - cpu: 100m - memory: 128Mi + cpu: 2m + memory: 16Mi volumes: - name: bootstrap-secret secret: diff --git a/manifests/klusterlet/management/klusterlet-work-deployment.yaml b/manifests/klusterlet/management/klusterlet-work-deployment.yaml index c03e94e12..5bf54a6f9 100644 --- a/manifests/klusterlet/management/klusterlet-work-deployment.yaml +++ b/manifests/klusterlet/management/klusterlet-work-deployment.yaml @@ -84,8 +84,8 @@ spec: initialDelaySeconds: 2 resources: requests: - cpu: 100m - memory: 128Mi + cpu: 2m + memory: 16Mi volumes: - name: hub-kubeconfig-secret secret: diff --git a/pkg/helpers/helpers.go b/pkg/helpers/helpers.go index d72048515..d0a7ea212 100644 --- a/pkg/helpers/helpers.go +++ b/pkg/helpers/helpers.go @@ -517,6 +517,19 @@ func LoadClientConfigFromSecret(secret *corev1.Secret) (*rest.Config, error) { return clientcmd.NewDefaultClientConfig(*config, nil).ClientConfig() } +// DetermineReplica determines the replica of deployment based on: +// - mode: if it is Hosted mode will return 1 +// - node: list master nodes in the cluster and return 1 if the +// number of master nodes is equal or less than 1. Return 3 otherwise. +func DetermineReplica(ctx context.Context, kubeClient kubernetes.Interface, mode operatorapiv1.InstallMode) int32 { + // For hosted mode, there may be many cluster-manager/klusterlet running on the management cluster, + // set the replica to 1 to reduce the footprint of the management cluster. + if mode == operatorapiv1.InstallModeDetached { + return singleReplica + } + return DetermineReplicaByNodes(ctx, kubeClient) +} + // DetermineReplicaByNodes determines the replica of deployment based on: // list master nodes in the cluster and return 1 if // the number of master nodes is equal or less than 1. Return 3 otherwise. diff --git a/pkg/helpers/helpers_test.go b/pkg/helpers/helpers_test.go index 459e388b7..fd9bbc60f 100644 --- a/pkg/helpers/helpers_test.go +++ b/pkg/helpers/helpers_test.go @@ -763,6 +763,7 @@ func newKubeConfigSecret(namespace, name string, kubeConfigData, certData, keyDa func TestDeterminReplica(t *testing.T) { cases := []struct { name string + mode operatorapiv1.InstallMode existingNodes []runtime.Object expectedReplica int32 }{ @@ -776,12 +777,24 @@ func TestDeterminReplica(t *testing.T) { existingNodes: []runtime.Object{newNode("node1"), newNode("node2"), newNode("node3")}, expectedReplica: defaultReplica, }, + { + name: "single node hosted mode", + mode: operatorapiv1.InstallModeDetached, + existingNodes: []runtime.Object{newNode("node1")}, + expectedReplica: singleReplica, + }, + { + name: "multiple node hosted mode", + mode: operatorapiv1.InstallModeDetached, + existingNodes: []runtime.Object{newNode("node1"), newNode("node2"), newNode("node3")}, + expectedReplica: singleReplica, + }, } for _, c := range cases { t.Run(c.name, func(t *testing.T) { fakeKubeClient := fakekube.NewSimpleClientset(c.existingNodes...) - replica := DetermineReplicaByNodes(context.Background(), fakeKubeClient) + replica := DetermineReplica(context.Background(), fakeKubeClient, c.mode) if replica != c.expectedReplica { t.Errorf("Unexpected replica, actual: %d, expected: %d", replica, c.expectedReplica) } diff --git a/pkg/operators/clustermanager/controllers/clustermanagercontroller/clustermanager_controller.go b/pkg/operators/clustermanager/controllers/clustermanagercontroller/clustermanager_controller.go index 8326aed6f..f0b10d4a2 100644 --- a/pkg/operators/clustermanager/controllers/clustermanagercontroller/clustermanager_controller.go +++ b/pkg/operators/clustermanager/controllers/clustermanagercontroller/clustermanager_controller.go @@ -197,7 +197,7 @@ func (n *clusterManagerController) sync(ctx context.Context, controllerContext f RegistrationImage: clusterManager.Spec.RegistrationImagePullSpec, WorkImage: clusterManager.Spec.WorkImagePullSpec, PlacementImage: clusterManager.Spec.PlacementImagePullSpec, - Replica: helpers.DetermineReplicaByNodes(ctx, n.operatorKubeClient), + Replica: helpers.DetermineReplica(ctx, n.operatorKubeClient, clusterManagerMode), DetachedMode: clusterManager.Spec.DeployOption.Mode == operatorapiv1.InstallModeDetached, } // If we are deploying in the detached mode, it requires us to create webhook in a different way with the default mode. diff --git a/pkg/operators/klusterlet/controllers/klusterletcontroller/klusterlet_controller.go b/pkg/operators/klusterlet/controllers/klusterletcontroller/klusterlet_controller.go index c14dec458..2a280053e 100644 --- a/pkg/operators/klusterlet/controllers/klusterletcontroller/klusterlet_controller.go +++ b/pkg/operators/klusterlet/controllers/klusterletcontroller/klusterlet_controller.go @@ -202,7 +202,7 @@ func (n *klusterletController) sync(ctx context.Context, controllerContext facto HubKubeConfigSecret: helpers.HubKubeConfig, ExternalServerURL: getServersFromKlusterlet(klusterlet), OperatorNamespace: n.operatorNamespace, - Replica: helpers.DetermineReplicaByNodes(ctx, n.kubeClient), + Replica: helpers.DetermineReplica(ctx, n.kubeClient, klusterlet.Spec.DeployOption.Mode), ExternalManagedKubeConfigSecret: helpers.ExternalManagedKubeConfig, ExternalManagedKubeConfigRegistrationSecret: helpers.ExternalManagedKubeConfigRegistration,