Skip to content

Commit e0892b4

Browse files
[Development][Add] Added custom probe capability (#178)
* Added probe feature in redis operator Signed-off-by: iamabhishek-dubey <abhishekbhardwaj510@gmail.com> * Added examples for probes Signed-off-by: iamabhishek-dubey <abhishekbhardwaj510@gmail.com>
1 parent c8a7356 commit e0892b4

File tree

11 files changed

+1584
-13
lines changed

11 files changed

+1584
-13
lines changed

api/v1beta1/redis_types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ type RedisSpec struct {
3535
PriorityClassName string `json:"priorityClassName,omitempty"`
3636
Affinity *corev1.Affinity `json:"affinity,omitempty"`
3737
Tolerations *[]corev1.Toleration `json:"tolerations,omitempty"`
38+
ReadinessProbe *corev1.Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"`
39+
LivenessProbe *corev1.Probe `json:"livenessProbe,omitempty" protobuf:"bytes,11,opt,name=livenessProbe"`
3840
}
3941

4042
// RedisStatus defines the observed state of Redis

api/v1beta1/rediscluster_types.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,20 @@ type RedisClusterSpec struct {
4040
// RedisLeader interface will have the redis leader configuration
4141
type RedisLeader struct {
4242
// +kubebuilder:validation:Minimum=3
43-
Replicas *int32 `json:"replicas,omitempty"`
44-
RedisConfig *RedisConfig `json:"redisConfig,omitempty"`
45-
Affinity *corev1.Affinity `json:"affinity,omitempty"`
43+
Replicas *int32 `json:"replicas,omitempty"`
44+
RedisConfig *RedisConfig `json:"redisConfig,omitempty"`
45+
Affinity *corev1.Affinity `json:"affinity,omitempty"`
46+
ReadinessProbe *corev1.Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"`
47+
LivenessProbe *corev1.Probe `json:"livenessProbe,omitempty" protobuf:"bytes,11,opt,name=livenessProbe"`
4648
}
4749

4850
// RedisFollower interface will have the redis follower configuration
4951
type RedisFollower struct {
50-
Replicas *int32 `json:"replicas,omitempty"`
51-
RedisConfig *RedisConfig `json:"redisConfig,omitempty"`
52-
Affinity *corev1.Affinity `json:"affinity,omitempty"`
52+
Replicas *int32 `json:"replicas,omitempty"`
53+
RedisConfig *RedisConfig `json:"redisConfig,omitempty"`
54+
Affinity *corev1.Affinity `json:"affinity,omitempty"`
55+
ReadinessProbe *corev1.Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"`
56+
LivenessProbe *corev1.Probe `json:"livenessProbe,omitempty" protobuf:"bytes,11,opt,name=livenessProbe"`
5357
}
5458

5559
// RedisClusterStatus defines the observed state of RedisCluster

api/v1beta1/zz_generated.deepcopy.go

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

config/crd/bases/redis.redis.opstreelabs.in_redis.yaml

Lines changed: 456 additions & 0 deletions
Large diffs are not rendered by default.

config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml

Lines changed: 935 additions & 3 deletions
Large diffs are not rendered by default.

config/rbac/role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ rules:
4040
resources:
4141
- secrets
4242
- pods/exec
43+
- pods
4344
- services
4445
- configmaps
4546
verbs:

example/probes/cluster.yaml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
---
2+
apiVersion: redis.redis.opstreelabs.in/v1beta1
3+
kind: RedisCluster
4+
metadata:
5+
name: redis-cluster
6+
spec:
7+
clusterSize: 3
8+
kubernetesConfig:
9+
image: quay.io/opstree/redis:v6.2.5
10+
imagePullPolicy: IfNotPresent
11+
resources:
12+
requests:
13+
cpu: 101m
14+
memory: 128Mi
15+
limits:
16+
cpu: 101m
17+
memory: 128Mi
18+
redisExporter:
19+
enabled: false
20+
image: quay.io/opstree/redis-exporter:1.0
21+
redisLeader:
22+
readinessProbe:
23+
exec:
24+
command:
25+
- bash
26+
- /usr/bin/healthcheck.sh
27+
failureThreshold: 5
28+
initialDelaySeconds: 15
29+
periodSeconds: 15
30+
successThreshold: 1
31+
timeoutSeconds: 5
32+
livenessProbe:
33+
exec:
34+
command:
35+
- bash
36+
- /usr/bin/healthcheck.sh
37+
failureThreshold: 5
38+
initialDelaySeconds: 15
39+
periodSeconds: 15
40+
successThreshold: 1
41+
timeoutSeconds: 5
42+
redisFollower:
43+
readinessProbe:
44+
exec:
45+
command:
46+
- bash
47+
- /usr/bin/healthcheck.sh
48+
failureThreshold: 5
49+
initialDelaySeconds: 15
50+
periodSeconds: 15
51+
successThreshold: 1
52+
timeoutSeconds: 5
53+
livenessProbe:
54+
exec:
55+
command:
56+
- bash
57+
- /usr/bin/healthcheck.sh
58+
failureThreshold: 5
59+
initialDelaySeconds: 15
60+
periodSeconds: 15
61+
successThreshold: 1
62+
timeoutSeconds: 5
63+
storage:
64+
volumeClaimTemplate:
65+
spec:
66+
# storageClassName: standard
67+
accessModes: ["ReadWriteOnce"]
68+
resources:
69+
requests:
70+
storage: 1Gi

example/probes/standalone.yaml

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
---
2+
apiVersion: redis.redis.opstreelabs.in/v1beta1
3+
kind: Redis
4+
metadata:
5+
name: redis-standalone
6+
spec:
7+
kubernetesConfig:
8+
image: quay.io/opstree/redis:v6.2.5
9+
imagePullPolicy: IfNotPresent
10+
resources:
11+
requests:
12+
cpu: 101m
13+
memory: 128Mi
14+
limits:
15+
cpu: 101m
16+
memory: 128Mi
17+
storage:
18+
volumeClaimTemplate:
19+
spec:
20+
# storageClassName: standard
21+
accessModes: ["ReadWriteOnce"]
22+
resources:
23+
requests:
24+
storage: 1Gi
25+
redisExporter:
26+
enabled: false
27+
image: quay.io/opstree/redis-exporter:1.0
28+
readinessProbe:
29+
exec:
30+
command:
31+
- bash
32+
- /usr/bin/healthcheck.sh
33+
failureThreshold: 5
34+
initialDelaySeconds: 15
35+
periodSeconds: 15
36+
successThreshold: 1
37+
timeoutSeconds: 5
38+
livenessProbe:
39+
exec:
40+
command:
41+
- bash
42+
- /usr/bin/healthcheck.sh
43+
failureThreshold: 5
44+
initialDelaySeconds: 15
45+
periodSeconds: 15
46+
successThreshold: 1
47+
timeoutSeconds: 5

k8sutils/redis-cluster.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ type RedisClusterSTS struct {
1010
RedisStateFulType string
1111
ExternalConfig *string
1212
Affinity *corev1.Affinity `json:"affinity,omitempty"`
13+
ReadinessProbe *corev1.Probe
14+
LivenessProbe *corev1.Probe
1315
}
1416

1517
// RedisClusterService is a interface to call Redis Service function
@@ -43,7 +45,7 @@ func generateRedisClusterParams(cr *redisv1beta1.RedisCluster, replicas *int32,
4345
}
4446

4547
// generateRedisStandaloneContainerParams generates Redis container information
46-
func generateRedisClusterContainerParams(cr *redisv1beta1.RedisCluster) containerParameters {
48+
func generateRedisClusterContainerParams(cr *redisv1beta1.RedisCluster, readinessProbeDef *corev1.Probe, livenessProbeDef *corev1.Probe) containerParameters {
4749
trueProperty := true
4850
falseProperty := false
4951
containerProp := containerParameters{
@@ -72,6 +74,12 @@ func generateRedisClusterContainerParams(cr *redisv1beta1.RedisCluster) containe
7274
}
7375

7476
}
77+
if readinessProbeDef != nil {
78+
containerProp.ReadinessProbe = readinessProbeDef
79+
}
80+
if livenessProbeDef != nil {
81+
containerProp.LivenessProbe = livenessProbeDef
82+
}
7583
if cr.Spec.Storage != nil {
7684
containerProp.PersistenceEnabled = &trueProperty
7785
}
@@ -83,6 +91,8 @@ func CreateRedisLeader(cr *redisv1beta1.RedisCluster) error {
8391
prop := RedisClusterSTS{
8492
RedisStateFulType: "leader",
8593
Affinity: cr.Spec.RedisLeader.Affinity,
94+
ReadinessProbe: cr.Spec.RedisLeader.ReadinessProbe,
95+
LivenessProbe: cr.Spec.RedisLeader.LivenessProbe,
8696
}
8797
if cr.Spec.RedisLeader.RedisConfig != nil {
8898
prop.ExternalConfig = cr.Spec.RedisLeader.RedisConfig.AdditionalRedisConfig
@@ -95,6 +105,8 @@ func CreateRedisFollower(cr *redisv1beta1.RedisCluster) error {
95105
prop := RedisClusterSTS{
96106
RedisStateFulType: "follower",
97107
Affinity: cr.Spec.RedisFollower.Affinity,
108+
ReadinessProbe: cr.Spec.RedisFollower.ReadinessProbe,
109+
LivenessProbe: cr.Spec.RedisFollower.LivenessProbe,
98110
}
99111
if cr.Spec.RedisFollower.RedisConfig != nil {
100112
prop.ExternalConfig = cr.Spec.RedisFollower.RedisConfig.AdditionalRedisConfig
@@ -145,7 +157,7 @@ func (service RedisClusterSTS) CreateRedisClusterSetup(cr *redisv1beta1.RedisClu
145157
labels,
146158
generateRedisClusterParams(cr, service.getReplicaCount(cr), service.ExternalConfig, service.Affinity),
147159
redisClusterAsOwner(cr),
148-
generateRedisClusterContainerParams(cr),
160+
generateRedisClusterContainerParams(cr, service.ReadinessProbe, service.LivenessProbe),
149161
)
150162
if err != nil {
151163
logger.Error(err, "Cannot create statefulset for Redis", "Setup.Type", service.RedisStateFulType)

k8sutils/redis-standalone.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@ func generateRedisStandaloneContainerParams(cr *redisv1beta1.Redis) containerPar
106106
}
107107

108108
}
109+
if cr.Spec.ReadinessProbe != nil {
110+
containerProp.ReadinessProbe = cr.Spec.ReadinessProbe
111+
}
112+
if cr.Spec.LivenessProbe != nil {
113+
containerProp.LivenessProbe = cr.Spec.LivenessProbe
114+
}
109115
if cr.Spec.Storage != nil {
110116
containerProp.PersistenceEnabled = &trueProperty
111117
}

0 commit comments

Comments
 (0)