Skip to content

Commit fe87b6c

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 fe87b6c

File tree

3 files changed

+198
-40
lines changed

3 files changed

+198
-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: 82 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,
@@ -228,54 +234,100 @@ func GenerateRedisPodDef(redisCluster *redisv1beta1.RedisCluster, port int32, ma
228234
ReadinessProbe: GenerateRedisProbe(port),
229235
LivenessProbe: GenerateRedisProbe(port),
230236
},
237+
},
238+
},
239+
}
240+
241+
// Add exporter container if enabled
242+
if redisCluster.Spec.Exporter != nil && redisCluster.Spec.Exporter.Enabled {
243+
exporterImage := "oliver006/redis_exporter:latest"
244+
if redisCluster.Spec.Exporter.Image != "" {
245+
exporterImage = redisCluster.Spec.Exporter.Image
246+
if redisCluster.Spec.Exporter.Tag != "" {
247+
exporterImage = fmt.Sprintf("%s:%s", redisCluster.Spec.Exporter.Image, redisCluster.Spec.Exporter.Tag)
248+
}
249+
}
250+
251+
exporterContainer := corev1.Container{
252+
Name: "redis-exporter",
253+
Image: exporterImage,
254+
Ports: []corev1.ContainerPort{
231255
{
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-
},
256+
ContainerPort: port + 5000,
257+
Name: "redis-exporter",
244258
},
245259
},
246-
},
260+
Args: []string{
261+
"--web.listen-address", fmt.Sprintf(":%d", port+5000),
262+
"--redis.addr", fmt.Sprintf("localhost:%d", port),
263+
},
264+
}
265+
266+
// Apply RedisExporter resource settings if provided
267+
if redisCluster.Spec.Exporter.Resources != nil {
268+
exporterContainer.Resources = *redisCluster.Spec.Exporter.Resources
269+
}
270+
271+
pod.Spec.Containers = append(pod.Spec.Containers, exporterContainer)
247272
}
248273

249274
// Apply Redis resource settings if provided
250275
if redisCluster.Spec.Resources != nil {
251276
pod.Spec.Containers[0].Resources = *redisCluster.Spec.Resources
252277
}
253278

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

289+
// Add nodeSelector if specified
290+
if redisCluster.Spec.NodeSelector != nil {
291+
pod.Spec.NodeSelector = redisCluster.Spec.NodeSelector
292+
}
293+
294+
// Add tolerations if specified
295+
if len(redisCluster.Spec.Tolerations) > 0 {
296+
pod.Spec.Tolerations = redisCluster.Spec.Tolerations
297+
}
298+
299+
// TODO: Implement volume mounts for persistence
300+
// Add persistence if enabled
301+
// if redisCluster.Spec.Persistence != nil && redisCluster.Spec.Persistence.Enabled {
302+
// fmt.Println("Persistence is enabled but not yet implemented")
303+
// }
304+
259305
// If matchMasterNodeID is provided, set PodAntiAffinity
260306
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},
307+
if redisCluster.Spec.Affinity != nil {
308+
pod.Spec.Affinity = redisCluster.Spec.Affinity
309+
} else {
310+
pod.Spec.Affinity = &corev1.Affinity{
311+
PodAntiAffinity: &corev1.PodAntiAffinity{
312+
RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{
313+
{
314+
LabelSelector: &metav1.LabelSelector{
315+
MatchExpressions: []metav1.LabelSelectorRequirement{
316+
{
317+
Key: "redisNodeID",
318+
Operator: metav1.LabelSelectorOpIn,
319+
Values: []string{matchMasterNodeID},
320+
},
271321
},
272322
},
323+
TopologyKey: "kubernetes.io/hostname",
273324
},
274-
TopologyKey: "kubernetes.io/hostname",
275325
},
276326
},
277-
},
327+
}
278328
}
329+
} else if redisCluster.Spec.Affinity != nil {
330+
pod.Spec.Affinity = redisCluster.Spec.Affinity
279331
}
280332

281333
return pod

0 commit comments

Comments
 (0)