Skip to content

Commit 3a8ef42

Browse files
committed
feat: add MySQLLivenessProbe MySQLReadinessProbe SidecarReadinessProbe ExporterLivenessProbe in .Spec.PodSpec to allow the user special probe
1 parent f0a0d6e commit 3a8ef42

File tree

8 files changed

+837
-38
lines changed

8 files changed

+837
-38
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
1212
* `MysqlDatabase` `MysqlUser` Add delete policy
1313
* Add `PtHeartbeatResources` in `.Spec.PodSpec` to allow the user specifying resources for pt-heartbeat.
1414
* Set `MysqlCluter.Spec.BackupSchedule` to empty string to disable recurrent backups
15+
* Add `MySQLLivenessProbe` `MySQLReadinessProbe` `SidecarReadinessProbe` `ExporterLivenessProbe` in `.Spec.PodSpec` to allow the user special probe
1516

1617
### Changed
1718

config/crd/bases/mysql.presslabs.org_mysqlclusters.yaml

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

deploy/charts/mysql-cluster/values.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ appDatabase: ""
1919
# appSecretAnnotations: {}
2020

2121
podSpec:
22+
# mysqlReadinessProbe:
23+
# mysqlLivenessProbe:
24+
# sidecarReadinessProbe:
25+
# exporterLivenessProbe:
2226
mysqlConf:
2327
volumeSpec:
2428

deploy/charts/mysql-operator/crds/mysql.presslabs.org_mysqlclusters.yaml

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

examples/example-cluster.yaml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,48 @@ spec:
5555
# exec:
5656
# command:
5757
# - /scripts/demote-if-master
58+
# mysqlReadinessProbe:
59+
# exec:
60+
# command:
61+
# - /bin/sh
62+
# - -c
63+
# - test $(mysql --defaults-file=/etc/mysql/client.conf -NB -e 'SELECT COUNT(*) FROM sys_operator.status WHERE name="configured" AND value="1"') -eq 1
64+
# failureThreshold: 3
65+
# initialDelaySeconds: 5
66+
# periodSeconds: 2
67+
# successThreshold: 1
68+
# timeoutSeconds: 5
69+
# mysqlLivenessProbe:
70+
# exec:
71+
# command:
72+
# - mysqladmin
73+
# - --defaults-file=/etc/mysql/client.conf
74+
# - ping
75+
# failureThreshold: 3
76+
# initialDelaySeconds: 600
77+
# periodSeconds: 5
78+
# successThreshold: 1
79+
# timeoutSeconds: 5
80+
# sidecarReadinessProbe:
81+
# failureThreshold: 3
82+
# httpGet:
83+
# path: /health
84+
# port: 8080
85+
# scheme: HTTP
86+
# initialDelaySeconds: 30
87+
# periodSeconds: 5
88+
# successThreshold: 1
89+
# timeoutSeconds: 5
90+
# exporterLivenessProbe:
91+
# failureThreshold: 3
92+
# httpGet:
93+
# path: /metrics
94+
# port: 9125
95+
# scheme: HTTP
96+
# initialDelaySeconds: 30
97+
# periodSeconds: 30
98+
# successThreshold: 1
99+
# timeoutSeconds: 30
58100
# nodeSelector: {}
59101
# resources:
60102
# requests:

pkg/apis/mysql/v1alpha1/mysqlcluster_types.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -179,15 +179,19 @@ type PodSpec struct {
179179
ImagePullPolicy core.PullPolicy `json:"imagePullPolicy,omitempty"`
180180
ImagePullSecrets []core.LocalObjectReference `json:"imagePullSecrets,omitempty"`
181181

182-
Labels map[string]string `json:"labels,omitempty"`
183-
Annotations map[string]string `json:"annotations,omitempty"`
184-
Resources core.ResourceRequirements `json:"resources,omitempty"`
185-
Affinity *core.Affinity `json:"affinity,omitempty"`
186-
MysqlLifecycle *core.Lifecycle `json:"mysqlLifecycle,omitempty"`
187-
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
188-
PriorityClassName string `json:"priorityClassName,omitempty"`
189-
Tolerations []core.Toleration `json:"tolerations,omitempty"`
190-
ServiceAccountName string `json:"serviceAccountName,omitempty"`
182+
Labels map[string]string `json:"labels,omitempty"`
183+
Annotations map[string]string `json:"annotations,omitempty"`
184+
Resources core.ResourceRequirements `json:"resources,omitempty"`
185+
Affinity *core.Affinity `json:"affinity,omitempty"`
186+
MysqlLifecycle *core.Lifecycle `json:"mysqlLifecycle,omitempty"`
187+
MySQLReadinessProbe *core.Probe `json:"mysqlReadinessProbe,omitempty"`
188+
MySQLLivenessProbe *core.Probe `json:"mysqlLivenessProbe,omitempty"`
189+
SidecarReadinessProbe *core.Probe `json:"sidecarReadinessProbe,omitempty"`
190+
ExporterLivenessProbe *core.Probe `json:"exporterLivenessProbe,omitempty"`
191+
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
192+
PriorityClassName string `json:"priorityClassName,omitempty"`
193+
Tolerations []core.Toleration `json:"tolerations,omitempty"`
194+
ServiceAccountName string `json:"serviceAccountName,omitempty"`
191195

192196
BackupAffinity *core.Affinity `json:"backupAffinity,omitempty"`
193197
BackupNodeSelector map[string]string `json:"backupNodeSelector,omitempty"`

pkg/apis/mysql/v1alpha1/zz_generated.deepcopy.go

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

pkg/controller/mysqlcluster/internal/syncer/statefullset.go

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -376,15 +376,19 @@ func (s *sfsSyncer) ensureContainersSpec() []core.Container {
376376
ContainerPort: MysqlPort,
377377
})
378378
mysql.Resources = s.ensureResources(containerMysqlName)
379-
mysql.LivenessProbe = ensureProbe(60, 5, 5, core.Handler{
380-
Exec: &core.ExecAction{
381-
Command: []string{
382-
"mysqladmin",
383-
fmt.Sprintf("--defaults-file=%s", confClientPath),
384-
"ping",
379+
if probe := s.cluster.Spec.PodSpec.MySQLLivenessProbe; probe == nil {
380+
mysql.LivenessProbe = ensureProbe(60, 5, 5, core.Handler{
381+
Exec: &core.ExecAction{
382+
Command: []string{
383+
"mysqladmin",
384+
fmt.Sprintf("--defaults-file=%s", confClientPath),
385+
"ping",
386+
},
385387
},
386-
},
387-
})
388+
})
389+
} else {
390+
mysql.LivenessProbe = probe
391+
}
388392

389393
// set lifecycle hook on MySQL container
390394
if s.cluster.Spec.PodSpec.MysqlLifecycle != nil {
@@ -404,14 +408,18 @@ func (s *sfsSyncer) ensureContainersSpec() []core.Container {
404408
confClientPath, constants.OperatorDbName, constants.OperatorStatusTableName)
405409

406410
// we have to know ASAP when server is not ready to remove it from endpoints
407-
mysql.ReadinessProbe = ensureProbe(5, 5, 2, core.Handler{
408-
Exec: &core.ExecAction{
409-
Command: []string{
410-
"/bin/sh", "-c",
411-
fmt.Sprintf(`test $(%s) -eq 1`, mysqlTestCmd),
411+
if probe := s.cluster.Spec.PodSpec.MySQLReadinessProbe; probe == nil {
412+
mysql.ReadinessProbe = ensureProbe(5, 5, 2, core.Handler{
413+
Exec: &core.ExecAction{
414+
Command: []string{
415+
"/bin/sh", "-c",
416+
fmt.Sprintf(`test $(%s) -eq 1`, mysqlTestCmd),
417+
},
412418
},
413-
},
414-
})
419+
})
420+
} else {
421+
mysql.ReadinessProbe = probe
422+
}
415423

416424
// SIDECAR container
417425
sidecar := s.ensureContainer(containerSidecarName,
@@ -423,13 +431,17 @@ func (s *sfsSyncer) ensureContainersSpec() []core.Container {
423431
ContainerPort: SidecarServerPort,
424432
})
425433
sidecar.Resources = s.ensureResources(containerSidecarName)
426-
sidecar.ReadinessProbe = ensureProbe(30, 5, 5, core.Handler{
427-
HTTPGet: &core.HTTPGetAction{
428-
Path: SidecarServerProbePath,
429-
Port: intstr.FromInt(SidecarServerPort),
430-
Scheme: core.URISchemeHTTP,
431-
},
432-
})
434+
if probe := s.cluster.Spec.PodSpec.SidecarReadinessProbe; probe == nil {
435+
sidecar.ReadinessProbe = ensureProbe(30, 5, 5, core.Handler{
436+
HTTPGet: &core.HTTPGetAction{
437+
Path: SidecarServerProbePath,
438+
Port: intstr.FromInt(SidecarServerPort),
439+
Scheme: core.URISchemeHTTP,
440+
},
441+
})
442+
} else {
443+
sidecar.ReadinessProbe = probe
444+
}
433445

434446
// METRICS container
435447
exporterCommand := []string{
@@ -455,13 +467,17 @@ func (s *sfsSyncer) ensureContainersSpec() []core.Container {
455467

456468
exporter.Resources = s.ensureResources(containerExporterName)
457469

458-
exporter.LivenessProbe = ensureProbe(30, 30, 30, core.Handler{
459-
HTTPGet: &core.HTTPGetAction{
460-
Path: ExporterPath,
461-
Port: ExporterTargetPort,
462-
Scheme: core.URISchemeHTTP,
463-
},
464-
})
470+
if probe := s.cluster.Spec.PodSpec.ExporterLivenessProbe; probe == nil {
471+
exporter.LivenessProbe = ensureProbe(30, 30, 30, core.Handler{
472+
HTTPGet: &core.HTTPGetAction{
473+
Path: ExporterPath,
474+
Port: ExporterTargetPort,
475+
Scheme: core.URISchemeHTTP,
476+
},
477+
})
478+
} else {
479+
exporter.LivenessProbe = probe
480+
}
465481

466482
// PT-HEARTBEAT container
467483
heartbeat := s.ensureContainer(containerHeartBeatName,

0 commit comments

Comments
 (0)