Skip to content

Commit 29295dc

Browse files
committed
add role detect for redis replication
Signed-off-by: yangw <[email protected]>
1 parent c29a3de commit 29295dc

File tree

4 files changed

+111
-92
lines changed

4 files changed

+111
-92
lines changed

internal/controller/redisreplication/redisreplication_controller.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,9 @@ func (r *Reconciler) reconcileStatus(ctx context.Context, instance *rrvb2.RedisR
200200
if err = r.UpdateRedisReplicationMaster(ctx, instance, realMaster); err != nil {
201201
return intctrlutil.RequeueE(ctx, err, "")
202202
}
203-
if err = r.UpdateRedisPodRoleLabel(ctx, instance, realMaster); err != nil {
204-
return intctrlutil.RequeueE(ctx, err, "")
205-
}
206-
203+
// if err = r.UpdateRedisPodRoleLabel(ctx, instance, realMaster); err != nil {
204+
// return intctrlutil.RequeueE(ctx, err, "")
205+
// }
207206
slaveNodes := k8sutils.GetRedisNodesByRole(ctx, r.K8sClient, instance, "slave")
208207
if realMaster != "" {
209208
monitoring.RedisReplicationConnectedSlavesTotal.WithLabelValues(instance.Namespace, instance.Name).Set(float64(len(slaveNodes)))

internal/k8sutils/redis-agent.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package k8sutils
2+
3+
import (
4+
"fmt"
5+
6+
common "github.com/OT-CONTAINER-KIT/redis-operator/api/common/v1beta2"
7+
"github.com/OT-CONTAINER-KIT/redis-operator/internal/image"
8+
"github.com/OT-CONTAINER-KIT/redis-operator/internal/util"
9+
corev1 "k8s.io/api/core/v1"
10+
"k8s.io/apimachinery/pkg/api/resource"
11+
)
12+
13+
// RedisAgentConfig holds configuration for generating Redis agent sidecar
14+
type RedisAgentConfig struct {
15+
Port *int
16+
ExistingPasswordSecret *common.ExistingPasswordSecret
17+
}
18+
19+
// generateAgentSidecar creates a Redis agent sidecar configuration
20+
// The agent currently performs role detection and may be extended with additional functionality in the future
21+
func generateAgentSidecar(config RedisAgentConfig) common.Sidecar {
22+
operatorImage, _ := util.CoalesceEnv("OPERATOR_IMAGE", image.GetOperatorImage())
23+
redisPort := "6379"
24+
if config.Port != nil {
25+
redisPort = fmt.Sprintf("%d", *config.Port)
26+
}
27+
envVars := []corev1.EnvVar{
28+
{
29+
Name: "POD_NAME",
30+
ValueFrom: &corev1.EnvVarSource{
31+
FieldRef: &corev1.ObjectFieldSelector{
32+
FieldPath: "metadata.name",
33+
},
34+
},
35+
},
36+
{
37+
Name: "POD_NAMESPACE",
38+
ValueFrom: &corev1.EnvVarSource{
39+
FieldRef: &corev1.ObjectFieldSelector{
40+
FieldPath: "metadata.namespace",
41+
},
42+
},
43+
},
44+
}
45+
46+
// Add Redis password environment variable if configured
47+
if config.ExistingPasswordSecret != nil {
48+
envVars = append(envVars, corev1.EnvVar{
49+
Name: "REDIS_PASSWORD",
50+
ValueFrom: &corev1.EnvVarSource{
51+
SecretKeyRef: &corev1.SecretKeySelector{
52+
LocalObjectReference: corev1.LocalObjectReference{
53+
Name: *config.ExistingPasswordSecret.Name,
54+
},
55+
Key: *config.ExistingPasswordSecret.Key,
56+
},
57+
},
58+
})
59+
}
60+
61+
// Default resource requirements for role detector
62+
resources := &corev1.ResourceRequirements{
63+
Requests: corev1.ResourceList{
64+
corev1.ResourceCPU: resource.MustParse("10m"),
65+
corev1.ResourceMemory: resource.MustParse("32Mi"),
66+
},
67+
Limits: corev1.ResourceList{
68+
corev1.ResourceCPU: resource.MustParse("50m"),
69+
corev1.ResourceMemory: resource.MustParse("64Mi"),
70+
},
71+
}
72+
73+
// Build complete command with arguments
74+
command := []string{
75+
"/operator",
76+
"agent",
77+
"server",
78+
"--redis-addr=127.0.0.1:" + redisPort,
79+
"--detect-interval=3s",
80+
}
81+
82+
if config.ExistingPasswordSecret != nil {
83+
command = append(command, "--redis-password=$(REDIS_PASSWORD)")
84+
}
85+
86+
return common.Sidecar{
87+
Name: "agent",
88+
Image: operatorImage,
89+
ImagePullPolicy: corev1.PullIfNotPresent,
90+
Command: command,
91+
EnvVars: &envVars,
92+
Resources: resources,
93+
// SecurityContext can be omitted - the container image already runs as non-root
94+
// and inherits pod-level security context if needed
95+
}
96+
}

internal/k8sutils/redis-cluster.go

Lines changed: 0 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@ package k8sutils
22

33
import (
44
"context"
5-
"fmt"
65
"strconv"
76
"strings"
87

98
common "github.com/OT-CONTAINER-KIT/redis-operator/api/common/v1beta2"
109
rcvb2 "github.com/OT-CONTAINER-KIT/redis-operator/api/rediscluster/v1beta2"
11-
"github.com/OT-CONTAINER-KIT/redis-operator/internal/image"
1210
"github.com/OT-CONTAINER-KIT/redis-operator/internal/util"
1311
corev1 "k8s.io/api/core/v1"
14-
"k8s.io/apimachinery/pkg/api/resource"
1512
"k8s.io/apimachinery/pkg/util/intstr"
1613
"k8s.io/client-go/kubernetes"
1714
"k8s.io/utils/ptr"
@@ -288,15 +285,10 @@ func (service RedisClusterSTS) CreateRedisClusterSetup(ctx context.Context, cr *
288285
annotations := generateStatefulSetsAnots(cr.ObjectMeta, cr.Spec.KubernetesConfig.IgnoreAnnotations)
289286
objectMetaInfo := generateObjectMetaInformation(stateFulName, cr.Namespace, labels, annotations)
290287

291-
// Prepare sidecars: combine user-defined sidecars with automatic role detector
292288
sidecars := []common.Sidecar{}
293289
if cr.Spec.Sidecars != nil {
294290
sidecars = append(sidecars, *cr.Spec.Sidecars...)
295291
}
296-
// Always add Redis agent sidecar for Redis Cluster
297-
redisAgentSidecar := generateAgentSidecar(cr)
298-
sidecars = append(sidecars, redisAgentSidecar)
299-
300292
err := CreateOrUpdateStateFul(
301293
ctx,
302294
cl,
@@ -404,82 +396,3 @@ func (service RedisClusterService) createOrUpdateClusterNodePortService(ctx cont
404396
}
405397
return nil
406398
}
407-
408-
// generateAgentSidecar creates a Redis agent sidecar configuration for Redis Cluster
409-
// The agent currently performs role detection and may be extended with additional functionality in the future
410-
func generateAgentSidecar(cr *rcvb2.RedisCluster) common.Sidecar {
411-
operatorImage, _ := util.CoalesceEnv("OPERATOR_IMAGE", image.GetOperatorImage())
412-
redisPort := "6379"
413-
if cr.Spec.Port != nil {
414-
redisPort = fmt.Sprintf("%d", *cr.Spec.Port)
415-
}
416-
envVars := []corev1.EnvVar{
417-
{
418-
Name: "POD_NAME",
419-
ValueFrom: &corev1.EnvVarSource{
420-
FieldRef: &corev1.ObjectFieldSelector{
421-
FieldPath: "metadata.name",
422-
},
423-
},
424-
},
425-
{
426-
Name: "POD_NAMESPACE",
427-
ValueFrom: &corev1.EnvVarSource{
428-
FieldRef: &corev1.ObjectFieldSelector{
429-
FieldPath: "metadata.namespace",
430-
},
431-
},
432-
},
433-
}
434-
435-
// Add Redis password environment variable if configured
436-
if cr.Spec.KubernetesConfig.ExistingPasswordSecret != nil {
437-
envVars = append(envVars, corev1.EnvVar{
438-
Name: "REDIS_PASSWORD",
439-
ValueFrom: &corev1.EnvVarSource{
440-
SecretKeyRef: &corev1.SecretKeySelector{
441-
LocalObjectReference: corev1.LocalObjectReference{
442-
Name: *cr.Spec.KubernetesConfig.ExistingPasswordSecret.Name,
443-
},
444-
Key: *cr.Spec.KubernetesConfig.ExistingPasswordSecret.Key,
445-
},
446-
},
447-
})
448-
}
449-
450-
// Default resource requirements for role detector
451-
resources := &corev1.ResourceRequirements{
452-
Requests: corev1.ResourceList{
453-
corev1.ResourceCPU: resource.MustParse("10m"),
454-
corev1.ResourceMemory: resource.MustParse("32Mi"),
455-
},
456-
Limits: corev1.ResourceList{
457-
corev1.ResourceCPU: resource.MustParse("50m"),
458-
corev1.ResourceMemory: resource.MustParse("64Mi"),
459-
},
460-
}
461-
462-
// Build complete command with arguments
463-
command := []string{
464-
"/operator",
465-
"agent",
466-
"server",
467-
"--redis-addr=127.0.0.1:" + redisPort,
468-
"--detect-interval=10s",
469-
}
470-
471-
if cr.Spec.KubernetesConfig.ExistingPasswordSecret != nil {
472-
command = append(command, "--redis-password=$(REDIS_PASSWORD)")
473-
}
474-
475-
return common.Sidecar{
476-
Name: "agent",
477-
Image: operatorImage,
478-
ImagePullPolicy: corev1.PullIfNotPresent,
479-
Command: command,
480-
EnvVars: &envVars,
481-
Resources: resources,
482-
// SecurityContext can be omitted - the container image already runs as non-root
483-
// and inherits pod-level security context if needed
484-
}
485-
}

internal/k8sutils/redis-replication.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package k8sutils
33
import (
44
"context"
55

6+
common "github.com/OT-CONTAINER-KIT/redis-operator/api/common/v1beta2"
67
rrvb2 "github.com/OT-CONTAINER-KIT/redis-operator/api/redisreplication/v1beta2"
78
rsvb2 "github.com/OT-CONTAINER-KIT/redis-operator/api/redissentinel/v1beta2"
89
"github.com/OT-CONTAINER-KIT/redis-operator/internal/util"
@@ -68,6 +69,16 @@ func CreateReplicationRedis(ctx context.Context, cr *rrvb2.RedisReplication, cl
6869
annotations := generateStatefulSetsAnots(cr.ObjectMeta, cr.Spec.KubernetesConfig.IgnoreAnnotations)
6970
objectMetaInfo := generateObjectMetaInformation(stateFulName, cr.Namespace, labels, annotations)
7071

72+
sidecars := []common.Sidecar{}
73+
if cr.Spec.Sidecars != nil {
74+
sidecars = append(sidecars, *cr.Spec.Sidecars...)
75+
}
76+
redisAgentSidecar := generateAgentSidecar(RedisAgentConfig{
77+
Port: ptr.To(redisPort),
78+
ExistingPasswordSecret: cr.Spec.KubernetesConfig.ExistingPasswordSecret,
79+
})
80+
sidecars = append(sidecars, redisAgentSidecar)
81+
7182
err := CreateOrUpdateStateFul(
7283
ctx,
7384
cl,
@@ -77,7 +88,7 @@ func CreateReplicationRedis(ctx context.Context, cr *rrvb2.RedisReplication, cl
7788
redisReplicationAsOwner(cr),
7889
generateRedisReplicationInitContainerParams(cr),
7990
generateRedisReplicationContainerParams(cr),
80-
cr.Spec.Sidecars,
91+
&sidecars,
8192
)
8293
if err != nil {
8394
log.FromContext(ctx).Error(err, "Cannot create replication statefulset for Redis")

0 commit comments

Comments
 (0)