Skip to content

Commit

Permalink
sync deployment replicas when it is controlled by hpa
Browse files Browse the repository at this point in the history
Signed-off-by: chaosi-zju <[email protected]>
  • Loading branch information
chaosi-zju committed Mar 13, 2024
1 parent 9ccc8be commit 952f3bc
Show file tree
Hide file tree
Showing 8 changed files with 256 additions and 525 deletions.
2 changes: 1 addition & 1 deletion artifacts/deploy/karmada-controller-manager.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ spec:
- --cluster-status-update-frequency=10s
- --secure-port=10357
- --failover-eviction-timeout=30s
- --controllers=*,hpaReplicasSyncer
- --controllers=*,hpaAutoLabelRetain,deploymentReplicasSyncer
- --feature-gates=PropagationPolicyPreemption=true,MultiClusterService=true
- --v=4
livenessProbe:
Expand Down
29 changes: 17 additions & 12 deletions cmd/controller-manager/app/controllermanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ import (
"k8s.io/client-go/informers"
kubeclientset "k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/scale"
cliflag "k8s.io/component-base/cli/flag"
"k8s.io/component-base/term"
"k8s.io/klog/v2"
Expand Down Expand Up @@ -62,14 +61,15 @@ import (
metricsclient "github.com/karmada-io/karmada/pkg/controllers/federatedhpa/metrics"
"github.com/karmada-io/karmada/pkg/controllers/federatedresourcequota"
"github.com/karmada-io/karmada/pkg/controllers/gracefuleviction"
"github.com/karmada-io/karmada/pkg/controllers/hpareplicassyncer"
"github.com/karmada-io/karmada/pkg/controllers/hpaautolabelretain"
"github.com/karmada-io/karmada/pkg/controllers/mcs"
"github.com/karmada-io/karmada/pkg/controllers/multiclusterservice"
"github.com/karmada-io/karmada/pkg/controllers/namespace"
"github.com/karmada-io/karmada/pkg/controllers/remediation"
"github.com/karmada-io/karmada/pkg/controllers/status"
"github.com/karmada-io/karmada/pkg/controllers/unifiedauth"
"github.com/karmada-io/karmada/pkg/dependenciesdistributor"
"github.com/karmada-io/karmada/pkg/deploymentreplicassyncer"
"github.com/karmada-io/karmada/pkg/detector"
"github.com/karmada-io/karmada/pkg/features"
"github.com/karmada-io/karmada/pkg/karmadactl/util/apiclient"
Expand Down Expand Up @@ -206,7 +206,7 @@ func Run(ctx context.Context, opts *options.Options) error {
var controllers = make(controllerscontext.Initializers)

// controllersDisabledByDefault is the set of controllers which is disabled by default
var controllersDisabledByDefault = sets.New("hpaReplicasSyncer")
var controllersDisabledByDefault = sets.New("hpaAutoLabelRetain", "deploymentReplicasSyncer")

func init() {
controllers["cluster"] = startClusterController
Expand All @@ -226,7 +226,8 @@ func init() {
controllers["applicationFailover"] = startApplicationFailoverController
controllers["federatedHorizontalPodAutoscaler"] = startFederatedHorizontalPodAutoscalerController
controllers["cronFederatedHorizontalPodAutoscaler"] = startCronFederatedHorizontalPodAutoscalerController
controllers["hpaReplicasSyncer"] = startHPAReplicasSyncerController
controllers["hpaAutoLabelRetain"] = startHPAReplicasSyncerController
controllers["deploymentReplicasSyncer"] = startDeploymentReplicasSyncerController
controllers["multiclusterservice"] = startMCSController
controllers["endpointsliceCollect"] = startEndpointSliceCollectController
controllers["endpointsliceDispatch"] = startEndpointSliceDispatchController
Expand Down Expand Up @@ -656,19 +657,23 @@ func startCronFederatedHorizontalPodAutoscalerController(ctx controllerscontext.
}

func startHPAReplicasSyncerController(ctx controllerscontext.Context) (enabled bool, err error) {
scaleKindResolver := scale.NewDiscoveryScaleKindResolver(ctx.KubeClientSet.Discovery())
scaleClient, err := scale.NewForConfig(ctx.Mgr.GetConfig(), ctx.Mgr.GetRESTMapper(), dynamic.LegacyAPIPathResolverFunc, scaleKindResolver)
hpaAutoLabelRetain := hpaautolabelretain.HPAAutoLabelRetain{
DynamicClient: ctx.DynamicClientSet,
RESTMapper: ctx.Mgr.GetRESTMapper(),
}
err = hpaAutoLabelRetain.SetupWithManager(ctx.Mgr)
if err != nil {
return false, err
}

hpaReplicasSyncer := hpareplicassyncer.HPAReplicasSyncer{
Client: ctx.Mgr.GetClient(),
DynamicClient: ctx.DynamicClientSet,
RESTMapper: ctx.Mgr.GetRESTMapper(),
ScaleClient: scaleClient,
return true, nil
}

func startDeploymentReplicasSyncerController(ctx controllerscontext.Context) (enabled bool, err error) {
deploymentReplicasSyncer := deploymentreplicassyncer.DeploymentReplicasSyncer{
Client: ctx.Mgr.GetClient(),
}
err = hpaReplicasSyncer.SetupWithManager(ctx.Mgr)
err = deploymentReplicasSyncer.SetupWithManager(ctx.Mgr)
if err != nil {
return false, err
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
Copyright 2023 The Karmada Authors.
Licensed 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.
*/

package hpaautolabelretain

import (
"context"

autoscalingv2 "k8s.io/api/autoscaling/v2"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/client-go/dynamic"
controllerruntime "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/builder"

"github.com/karmada-io/karmada/pkg/util"
)

const (
// ControllerName is the controller name that will be used when reporting events.
ControllerName = "hpa-auto-label-retain"
// scaleRefWorkerNum is the async Worker number
scaleRefWorkerNum = 1
)

// HPAAutoLabelRetain is to automatically add `retain-replicas` label to resource template mananged by HPA.
type HPAAutoLabelRetain struct {
DynamicClient dynamic.Interface
RESTMapper meta.RESTMapper

scaleRefWorker util.AsyncWorker
}

// SetupWithManager creates a controller and register to controller manager.
func (r *HPAAutoLabelRetain) SetupWithManager(mgr controllerruntime.Manager) error {
scaleRefWorkerOptions := util.Options{
Name: "scale ref worker",
ReconcileFunc: r.reconcileScaleRef,
}
r.scaleRefWorker = util.NewAsyncWorker(scaleRefWorkerOptions)
r.scaleRefWorker.Run(scaleRefWorkerNum, context.Background().Done())

return controllerruntime.NewControllerManagedBy(mgr).
Named(ControllerName).
For(&autoscalingv2.HorizontalPodAutoscaler{}, builder.WithPredicates(r)).
Complete(r)
}

// Reconcile performs a full reconciliation for the object referred to by the Request.
// The Controller will requeue the Request to be processed again if an error is non-nil or
// Result.Requeue is true, otherwise upon completion it will remove the work from the queue.
func (r *HPAAutoLabelRetain) Reconcile(_ context.Context, _ controllerruntime.Request) (controllerruntime.Result, error) {
return controllerruntime.Result{}, nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

package hpareplicassyncer
package hpaautolabelretain

import (
autoscalingv2 "k8s.io/api/autoscaling/v2"
Expand All @@ -25,10 +25,10 @@ import (
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
)

var _ predicate.Predicate = &HPAReplicasSyncer{}
var _ predicate.Predicate = &HPAAutoLabelRetain{}

// Create implements CreateEvent filter
func (r *HPAReplicasSyncer) Create(e event.CreateEvent) bool {
func (r *HPAAutoLabelRetain) Create(e event.CreateEvent) bool {
hpa, ok := e.Object.(*autoscalingv2.HorizontalPodAutoscaler)
if !ok {
klog.Errorf("create predicates in hpa controller called, but obj is not hpa type")
Expand All @@ -44,7 +44,7 @@ func (r *HPAReplicasSyncer) Create(e event.CreateEvent) bool {
}

// Update implements UpdateEvent filter
func (r *HPAReplicasSyncer) Update(e event.UpdateEvent) bool {
func (r *HPAAutoLabelRetain) Update(e event.UpdateEvent) bool {
oldHPA, ok := e.ObjectOld.(*autoscalingv2.HorizontalPodAutoscaler)
if !ok {
klog.Errorf("update predicates in hpa controller called, but old obj is not hpa type")
Expand Down Expand Up @@ -72,7 +72,7 @@ func (r *HPAReplicasSyncer) Update(e event.UpdateEvent) bool {
}

// Delete implements DeleteEvent filter
func (r *HPAReplicasSyncer) Delete(e event.DeleteEvent) bool {
func (r *HPAAutoLabelRetain) Delete(e event.DeleteEvent) bool {
hpa, ok := e.Object.(*autoscalingv2.HorizontalPodAutoscaler)
if !ok {
klog.Errorf("delete predicates in hpa controller called, but obj is not hpa type")
Expand All @@ -86,7 +86,7 @@ func (r *HPAReplicasSyncer) Delete(e event.DeleteEvent) bool {
}

// Generic implements default GenericEvent filter
func (r *HPAReplicasSyncer) Generic(_ event.GenericEvent) bool {
func (r *HPAAutoLabelRetain) Generic(_ event.GenericEvent) bool {
return false
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

package hpareplicassyncer
package hpaautolabelretain

import (
"context"
Expand Down Expand Up @@ -45,7 +45,7 @@ type labelEvent struct {
hpa *autoscalingv2.HorizontalPodAutoscaler
}

func (r *HPAReplicasSyncer) reconcileScaleRef(key util.QueueKey) (err error) {
func (r *HPAAutoLabelRetain) reconcileScaleRef(key util.QueueKey) (err error) {
event, ok := key.(labelEvent)
if !ok {
klog.Errorf("Found invalid key when reconciling hpa scale ref: %+v", key)
Expand All @@ -68,7 +68,7 @@ func (r *HPAReplicasSyncer) reconcileScaleRef(key util.QueueKey) (err error) {
return err
}

func (r *HPAReplicasSyncer) addHPALabelToScaleRef(ctx context.Context, hpa *autoscalingv2.HorizontalPodAutoscaler) error {
func (r *HPAAutoLabelRetain) addHPALabelToScaleRef(ctx context.Context, hpa *autoscalingv2.HorizontalPodAutoscaler) error {
targetGVK := schema.FromAPIVersionAndKind(hpa.Spec.ScaleTargetRef.APIVersion, hpa.Spec.ScaleTargetRef.Kind)
mapping, err := r.RESTMapper.RESTMapping(targetGVK.GroupKind(), targetGVK.Version)
if err != nil {
Expand Down Expand Up @@ -110,7 +110,7 @@ func (r *HPAReplicasSyncer) addHPALabelToScaleRef(ctx context.Context, hpa *auto
return nil
}

func (r *HPAReplicasSyncer) deleteHPALabelFromScaleRef(ctx context.Context, hpa *autoscalingv2.HorizontalPodAutoscaler) error {
func (r *HPAAutoLabelRetain) deleteHPALabelFromScaleRef(ctx context.Context, hpa *autoscalingv2.HorizontalPodAutoscaler) error {
targetGVK := schema.FromAPIVersionAndKind(hpa.Spec.ScaleTargetRef.APIVersion, hpa.Spec.ScaleTargetRef.Kind)
mapping, err := r.RESTMapper.RESTMapping(targetGVK.GroupKind(), targetGVK.Version)
if err != nil {
Expand Down
161 changes: 0 additions & 161 deletions pkg/controllers/hpareplicassyncer/hpa_replicas_syncer_controller.go

This file was deleted.

Loading

0 comments on commit 952f3bc

Please sign in to comment.