Skip to content

Commit cb1a4f8

Browse files
committed
Support for reconcile interval and max concurrent reconciles configurable
Signed-off-by: jaehanbyun <[email protected]>
1 parent 2718efb commit cb1a4f8

File tree

4 files changed

+51
-14
lines changed

4 files changed

+51
-14
lines changed

charts/redis-operator/templates/deployment.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ spec:
3737
imagePullPolicy: {{ .Values.redisOperator.imagePullPolicy }}
3838
securityContext:
3939
{{- toYaml .Values.securityContext | nindent 12 }}
40+
env:
41+
- name: RECONCILE_INTERVAL
42+
value: {{ .Values.redisOperator.reconcileInterval | default "0s" }}
43+
- name: MAX_CONCURRENT_RECONCILES
44+
value: "{{ .Values.redisOperator.maxConcurrentReconciles | default 5 }}"
4045
livenessProbe:
4146
httpGet:
4247
path: /healthz

charts/redis-operator/values.yaml

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ redisOperator:
55
imageTag: ""
66
imagePullSecrets: []
77

8+
reconcileInterval: ""
9+
maxConcurrentReconciles: 5
10+
811
replicaCount: 1
912

1013
service:
@@ -33,16 +36,6 @@ redisOperator:
3336
cpu: 500m
3437
memory: 500Mi
3538

36-
# This is to setup the liveness and readiness probes more information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
37-
# livenessProbe:
38-
# httpGet:
39-
# path: /
40-
# port: http
41-
# readinessProbe:
42-
# httpGet:
43-
# path: /
44-
# port: http
45-
4639
nodeSelector: {}
4740
tolerations: []
4841
affinity: {}

internal/controller/rediscluster_controller.go

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,23 @@ package controller
1818

1919
import (
2020
"context"
21+
"log"
22+
"os"
23+
"strconv"
2124
"time"
2225

2326
corev1 "k8s.io/api/core/v1"
2427
"k8s.io/apimachinery/pkg/api/errors"
2528
"k8s.io/apimachinery/pkg/runtime"
2629
"k8s.io/client-go/kubernetes"
2730
ctrl "sigs.k8s.io/controller-runtime"
31+
"sigs.k8s.io/controller-runtime/pkg/builder"
2832
"sigs.k8s.io/controller-runtime/pkg/client"
2933
"sigs.k8s.io/controller-runtime/pkg/controller"
3034
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
35+
"sigs.k8s.io/controller-runtime/pkg/event"
36+
"sigs.k8s.io/controller-runtime/pkg/handler"
37+
"sigs.k8s.io/controller-runtime/pkg/predicate"
3138

3239
"github.com/go-logr/logr"
3340
redisv1beta1 "github.com/jaehanbyun/redis-operator/api/v1beta1"
@@ -52,6 +59,11 @@ type RedisClusterReconciler struct {
5259
const RedisClusterFinalizer string = "redisClusterFinalizer"
5360

5461
func (r *RedisClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
62+
reconcileInterval, err := time.ParseDuration(os.Getenv("RECONCILE_INTERVAL"))
63+
if err != nil {
64+
log.Fatal(err)
65+
}
66+
5567
clusterLogger := r.Log.WithValues("redisCluster", req.NamespacedName)
5668
clusterLogger.Info("Reconciling RedisCluster")
5769

@@ -86,7 +98,7 @@ func (r *RedisClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request
8698

8799
// Update cluster status
88100
if err := k8sutils.UpdateClusterStatus(ctx, r.Client, r.K8sClient, redisCluster, clusterLogger); err != nil {
89-
return ctrl.Result{Requeue: true, RequeueAfter: time.Second * 10}, nil
101+
return ctrl.Result{RequeueAfter: reconcileInterval}, nil
90102
}
91103

92104
// Handle cluster initialization
@@ -104,7 +116,7 @@ func (r *RedisClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request
104116
return ctrl.Result{}, err
105117
}
106118

107-
return ctrl.Result{Requeue: true, RequeueAfter: time.Second * 10}, nil
119+
return ctrl.Result{RequeueAfter: reconcileInterval}, nil
108120
}
109121

110122
func (r *RedisClusterReconciler) reconcileDelete(ctx context.Context, logger logr.Logger, redisCluster *redisv1beta1.RedisCluster) (ctrl.Result, error) {
@@ -121,11 +133,34 @@ func (r *RedisClusterReconciler) reconcileDelete(ctx context.Context, logger log
121133

122134
// SetupWithManager sets up the controller with the Manager.
123135
func (r *RedisClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
136+
maxConcurrentReconciles, err := strconv.Atoi(os.Getenv("MAX_CONCURRENT_RECONCILES"))
137+
if err != nil {
138+
log.Fatal(err)
139+
}
140+
124141
return ctrl.NewControllerManagedBy(mgr).
125142
For(&redisv1beta1.RedisCluster{}).
126-
Owns(&corev1.Pod{}).
143+
Watches(&corev1.Pod{}, handler.EnqueueRequestForOwner(
144+
mgr.GetScheme(),
145+
mgr.GetRESTMapper(),
146+
&redisv1beta1.RedisCluster{}),
147+
builder.WithPredicates(predicate.Funcs{
148+
DeleteFunc: func(e event.DeleteEvent) bool { // Trigger a reconcile upon pod deletion
149+
return true
150+
},
151+
CreateFunc: func(e event.CreateEvent) bool {
152+
return false
153+
},
154+
UpdateFunc: func(e event.UpdateEvent) bool {
155+
return false
156+
},
157+
GenericFunc: func(e event.GenericEvent) bool {
158+
return false
159+
},
160+
}),
161+
).
127162
WithOptions(controller.Options{ // Number of concurrent Reconcils desired
128-
MaxConcurrentReconciles: 5,
163+
MaxConcurrentReconciles: maxConcurrentReconciles,
129164
}).
130165
Complete(r)
131166
}

internal/controller/rediscluster_controller_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package controller
1818

1919
import (
2020
"context"
21+
"os"
2122

2223
. "github.com/onsi/ginkgo/v2"
2324
. "github.com/onsi/gomega"
@@ -45,6 +46,9 @@ var _ = Describe("RedisCluster Controller", func() {
4546
BeforeEach(func() {
4647
By("creating the custom resource for the Kind RedisCluster")
4748
err := k8sClient.Get(ctx, typeNamespacedName, rediscluster)
49+
os.Setenv("RECONCILE_INTERVAL", "0s")
50+
os.Setenv("MAX_CONCURRENT_RECONCILES", "5")
51+
4852
if err != nil && errors.IsNotFound(err) {
4953
resource := &redisv1beta1.RedisCluster{
5054
ObjectMeta: metav1.ObjectMeta{

0 commit comments

Comments
 (0)