Skip to content

Commit 67c9c31

Browse files
committed
Enhance RedisCluster CRD with additional configuration fields
- Add exporter configuration with resource settings - Add support for imagePullPolicy and imagePullSecrets - Add securityContext, nodeSelector, tolerations, and affinity settings - Improve pod creation with new configuration options Signed-off-by: jaehanbyun <[email protected]>
1 parent a0dac69 commit 67c9c31

File tree

3 files changed

+199
-40
lines changed

3 files changed

+199
-40
lines changed

api/v1beta1/rediscluster_types.go

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,38 @@ import (
2424
// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
2525
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
2626

27+
// ExporterSpec defines the configuration for Redis metrics exporter
28+
type ExporterSpec struct {
29+
Enabled bool `json:"enabled"`
30+
Image string `json:"image,omitempty"`
31+
Tag string `json:"tag,omitempty"`
32+
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
33+
}
34+
35+
// PersistenceSpec defines the persistence configuration
36+
type PersistenceSpec struct {
37+
Enabled bool `json:"enabled"`
38+
StorageClass string `json:"storageClass,omitempty"`
39+
Size string `json:"size,omitempty"`
40+
}
41+
2742
// RedisClusterSpec defines the desired state of RedisCluster
2843
type RedisClusterSpec struct {
29-
Image string `json:"image"`
30-
Masters int32 `json:"masters"`
31-
Replicas int32 `json:"replicas"`
32-
BasePort int32 `json:"basePort"`
33-
Maxmemory string `json:"maxMemory"`
34-
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
35-
ExporterResources *corev1.ResourceRequirements `json:"exporterResources,omitempty"`
44+
Image string `json:"image"`
45+
Tag string `json:"tag,omitempty"`
46+
ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"`
47+
ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets,omitempty"`
48+
Masters int32 `json:"masters"`
49+
Replicas int32 `json:"replicas"`
50+
BasePort int32 `json:"basePort"`
51+
Maxmemory string `json:"maxMemory"`
52+
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
53+
SecurityContext *corev1.PodSecurityContext `json:"securityContext,omitempty"`
54+
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
55+
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
56+
Affinity *corev1.Affinity `json:"affinity,omitempty"`
57+
Persistence *PersistenceSpec `json:"persistence,omitempty"`
58+
Exporter *ExporterSpec `json:"exporter,omitempty"`
3659
}
3760

3861
// RedisClusterStatus defines the observed state of RedisCluster

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 86 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

k8sutils/utils.go

Lines changed: 83 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ func UpdatePodLabelWithRedisID(ctx context.Context, k8scl kubernetes.Interface,
191191
func GenerateRedisPodDef(redisCluster *redisv1beta1.RedisCluster, port int32, matchMasterNodeID string) *corev1.Pod {
192192
podName := fmt.Sprintf("rediscluster-%s-%d", redisCluster.Name, port)
193193

194+
image := redisCluster.Spec.Image
195+
if redisCluster.Spec.Tag != "" {
196+
image = fmt.Sprintf("%s:%s", redisCluster.Spec.Image, redisCluster.Spec.Tag)
197+
}
198+
194199
pod := &corev1.Pod{
195200
ObjectMeta: metav1.ObjectMeta{
196201
Name: podName,
@@ -205,8 +210,9 @@ func GenerateRedisPodDef(redisCluster *redisv1beta1.RedisCluster, port int32, ma
205210
HostNetwork: true, // Enable HostNetwork
206211
Containers: []corev1.Container{
207212
{
208-
Name: "redis",
209-
Image: redisCluster.Spec.Image,
213+
Name: "redis",
214+
Image: image,
215+
ImagePullPolicy: redisCluster.Spec.ImagePullPolicy,
210216
Ports: []corev1.ContainerPort{
211217
{
212218
ContainerPort: port,
@@ -224,58 +230,105 @@ func GenerateRedisPodDef(redisCluster *redisv1beta1.RedisCluster, port int32, ma
224230
"--cluster-port", fmt.Sprintf("%d", port+10000),
225231
"--cluster-node-timeout", "5000",
226232
"--maxmemory", redisCluster.Spec.Maxmemory,
233+
"--protected-mode", "no",
227234
},
228235
ReadinessProbe: GenerateRedisProbe(port),
229236
LivenessProbe: GenerateRedisProbe(port),
230237
},
238+
},
239+
},
240+
}
241+
242+
// Add exporter container if enabled
243+
if redisCluster.Spec.Exporter != nil && redisCluster.Spec.Exporter.Enabled {
244+
exporterImage := "oliver006/redis_exporter:latest"
245+
if redisCluster.Spec.Exporter.Image != "" {
246+
exporterImage = redisCluster.Spec.Exporter.Image
247+
if redisCluster.Spec.Exporter.Tag != "" {
248+
exporterImage = fmt.Sprintf("%s:%s", redisCluster.Spec.Exporter.Image, redisCluster.Spec.Exporter.Tag)
249+
}
250+
}
251+
252+
exporterContainer := corev1.Container{
253+
Name: "redis-exporter",
254+
Image: exporterImage,
255+
Ports: []corev1.ContainerPort{
231256
{
232-
Name: "redis-exporter",
233-
Image: "oliver006/redis_exporter:latest",
234-
Ports: []corev1.ContainerPort{
235-
{
236-
ContainerPort: port + 5000,
237-
Name: "redis-exporter",
238-
},
239-
},
240-
Args: []string{
241-
"--web.listen-address", fmt.Sprintf(":%d", port+5000),
242-
"--redis.addr", fmt.Sprintf("localhost:%d", port),
243-
},
257+
ContainerPort: port + 5000,
258+
Name: "redis-exporter",
244259
},
245260
},
246-
},
261+
Args: []string{
262+
"--web.listen-address", fmt.Sprintf(":%d", port+5000),
263+
"--redis.addr", fmt.Sprintf("localhost:%d", port),
264+
},
265+
}
266+
267+
// Apply RedisExporter resource settings if provided
268+
if redisCluster.Spec.Exporter.Resources != nil {
269+
exporterContainer.Resources = *redisCluster.Spec.Exporter.Resources
270+
}
271+
272+
pod.Spec.Containers = append(pod.Spec.Containers, exporterContainer)
247273
}
248274

249275
// Apply Redis resource settings if provided
250276
if redisCluster.Spec.Resources != nil {
251277
pod.Spec.Containers[0].Resources = *redisCluster.Spec.Resources
252278
}
253279

254-
// Apply RedisExporter resource settings if provided
255-
if redisCluster.Spec.ExporterResources != nil {
256-
pod.Spec.Containers[1].Resources = *redisCluster.Spec.ExporterResources
280+
// Add imagePullSecrets if specified
281+
if len(redisCluster.Spec.ImagePullSecrets) > 0 {
282+
pod.Spec.ImagePullSecrets = redisCluster.Spec.ImagePullSecrets
283+
}
284+
285+
// Add securityContext if specified
286+
if redisCluster.Spec.SecurityContext != nil {
287+
pod.Spec.SecurityContext = redisCluster.Spec.SecurityContext
257288
}
258289

290+
// Add nodeSelector if specified
291+
if redisCluster.Spec.NodeSelector != nil {
292+
pod.Spec.NodeSelector = redisCluster.Spec.NodeSelector
293+
}
294+
295+
// Add tolerations if specified
296+
if len(redisCluster.Spec.Tolerations) > 0 {
297+
pod.Spec.Tolerations = redisCluster.Spec.Tolerations
298+
}
299+
300+
// TODO: Implement volume mounts for persistence
301+
// Add persistence if enabled
302+
// if redisCluster.Spec.Persistence != nil && redisCluster.Spec.Persistence.Enabled {
303+
// fmt.Println("Persistence is enabled but not yet implemented")
304+
// }
305+
259306
// If matchMasterNodeID is provided, set PodAntiAffinity
260307
if matchMasterNodeID != "" {
261-
pod.Spec.Affinity = &corev1.Affinity{
262-
PodAntiAffinity: &corev1.PodAntiAffinity{
263-
RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{
264-
{
265-
LabelSelector: &metav1.LabelSelector{
266-
MatchExpressions: []metav1.LabelSelectorRequirement{
267-
{
268-
Key: "redisNodeID",
269-
Operator: metav1.LabelSelectorOpIn,
270-
Values: []string{matchMasterNodeID},
308+
if redisCluster.Spec.Affinity != nil {
309+
pod.Spec.Affinity = redisCluster.Spec.Affinity
310+
} else {
311+
pod.Spec.Affinity = &corev1.Affinity{
312+
PodAntiAffinity: &corev1.PodAntiAffinity{
313+
RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{
314+
{
315+
LabelSelector: &metav1.LabelSelector{
316+
MatchExpressions: []metav1.LabelSelectorRequirement{
317+
{
318+
Key: "redisNodeID",
319+
Operator: metav1.LabelSelectorOpIn,
320+
Values: []string{matchMasterNodeID},
321+
},
271322
},
272323
},
324+
TopologyKey: "kubernetes.io/hostname",
273325
},
274-
TopologyKey: "kubernetes.io/hostname",
275326
},
276327
},
277-
},
328+
}
278329
}
330+
} else if redisCluster.Spec.Affinity != nil {
331+
pod.Spec.Affinity = redisCluster.Spec.Affinity
279332
}
280333

281334
return pod

0 commit comments

Comments
 (0)