@@ -19,7 +19,10 @@ package rediscluster
1919import (
2020 "context"
2121 "fmt"
22+ "k8s.io/apimachinery/pkg/types"
2223 "reflect"
24+ "sigs.k8s.io/controller-runtime/pkg/handler"
25+ "strconv"
2326 "time"
2427
2528 rcvb2 "github.com/OT-CONTAINER-KIT/redis-operator/api/rediscluster/v1beta2"
@@ -49,10 +52,11 @@ const (
4952type Reconciler struct {
5053 client.Client
5154 k8sutils.StatefulSet
52- Healer redis.Healer
53- Checker redis.Checker
54- K8sClient kubernetes.Interface
55- Recorder record.EventRecorder
55+ Healer redis.Healer
56+ Checker redis.Checker
57+ K8sClient kubernetes.Interface
58+ Recorder record.EventRecorder
59+ ResourceWatcher * intctrlutil.ResourceWatcher
5660}
5761
5862func (r * Reconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (ctrl.Result , error ) {
@@ -84,6 +88,21 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
8488 return intctrlutil .RequeueE (ctx , err , "failed to add finalizer" )
8589 }
8690
91+ // hotreload tls
92+ if instance .Spec .TLS != nil {
93+ r .ResourceWatcher .Watch (
94+ ctx ,
95+ types.NamespacedName {
96+ Namespace : instance .Namespace ,
97+ Name : instance .Spec .TLS .Secret .SecretName ,
98+ },
99+ types.NamespacedName {
100+ Namespace : instance .Namespace ,
101+ Name : instance .Name ,
102+ },
103+ )
104+ }
105+
87106 // Check if the cluster is downscaled
88107 if leaderCount := r .GetStatefulSetReplicas (ctx , instance .Namespace , instance .Name + "-leader" ); leaderReplicas < leaderCount {
89108 if ! r .IsStatefulSetReady (ctx , instance .Namespace , instance .Name + "-leader" ) || ! r .IsStatefulSetReady (ctx , instance .Namespace , instance .Name + "-follower" ) {
@@ -195,6 +214,14 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
195214 return intctrlutil .Reconciled ()
196215 }
197216
217+ if instance .Spec .TLS != nil {
218+ err := r .reloadTLS (ctx , instance , int (leaderReplicas ), int (followerReplicas ))
219+ if err != nil {
220+ log .FromContext (ctx ).Error (err , "hotReloadTLS failed, will retry later" )
221+ return intctrlutil .RequeueAfter (ctx , 30 * time .Second , "Retry hotReloadTLS" )
222+ }
223+ }
224+
198225 // Mark the cluster status as bootstrapping if all the leader and follower nodes are ready
199226 if instance .Status .ReadyLeaderReplicas != leaderReplicas || instance .Status .ReadyFollowerReplicas != followerReplicas {
200227 err = r .updateStatus (ctx , instance , rcvb2.RedisClusterStatus {
@@ -334,6 +361,24 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
334361 return intctrlutil .RequeueAfter (ctx , time .Second * 10 , "" )
335362}
336363
364+ func (r * Reconciler ) reloadTLS (ctx context.Context , rc * rcvb2.RedisCluster , leaderReplicas , followerReplicas int ) error {
365+ log .FromContext (ctx ).Info ("hotReloadTLS: reloading TLS configuration" )
366+ for i := 0 ; i < followerReplicas ; i ++ {
367+ err := k8sutils .HotReloadTLS (ctx , r .K8sClient , rc , rc .Name + "-follower-" + strconv .Itoa (i ))
368+ if err != nil {
369+ return fmt .Errorf ("RedisCluster controller -> failed reloading tls in follower: %w" , err )
370+ }
371+ }
372+ for j := 0 ; j < leaderReplicas ; j ++ {
373+ err := k8sutils .HotReloadTLS (ctx , r .K8sClient , rc , rc .Name + "-leader-" + strconv .Itoa (j ))
374+ if err != nil {
375+ return fmt .Errorf ("RedisCluster controller -> failed reloading tls in leader: %w" , err )
376+ }
377+ }
378+ log .FromContext (ctx ).Info ("hotReloadTLS: reloaded TLS configuration has been completed" )
379+ return nil
380+ }
381+
337382func (r * Reconciler ) updateStatus (ctx context.Context , rc * rcvb2.RedisCluster , status rcvb2.RedisClusterStatus ) error {
338383 if reflect .DeepEqual (rc .Status , status ) {
339384 return nil
@@ -365,5 +410,16 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager, opts controller.Options)
365410 For (& rcvb2.RedisCluster {}).
366411 Owns (& appsv1.StatefulSet {}).
367412 WithOptions (opts ).
413+ Watches (& rcvb2.RedisCluster {}, & handler.EnqueueRequestForObject {}).
414+ Watches (& corev1.Secret {}, r .ResourceWatcher ).
368415 Complete (r )
369416}
417+
418+ //func (r *RedisSentinelReconciler) SetupWithManager(mgr ctrl.Manager, opts controller.Options) error {
419+ // return ctrl.NewControllerManagedBy(mgr).
420+ // For(&rsvb2.RedisSentinel{}).
421+ // Owns(&appsv1.StatefulSet{}).
422+ // WithOptions(opts).
423+ // Watches(&rrvb2.RedisReplication{}, r.ReplicationWatcher).
424+ // Complete(r)
425+ //}
0 commit comments