Skip to content

Commit

Permalink
feat: readiness probe support for PD, TiKV and TiDB (pingcap#126)
Browse files Browse the repository at this point in the history
  • Loading branch information
csuzhangxc authored Oct 23, 2024
1 parent e337f1e commit 13c496c
Show file tree
Hide file tree
Showing 14 changed files with 1,278 additions and 6 deletions.
8 changes: 8 additions & 0 deletions apis/core/v1alpha1/pd_types.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package v1alpha1

import (
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
Expand Down Expand Up @@ -234,6 +235,7 @@ type PDTemplate struct {
type PDTemplateSpec struct {
// Server defines server config for PD
Server PDServer `json:"server,omitempty"`
Probes PDProbes `json:"probes,omitempty"`
Resources ResourceRequirements `json:"resources,omitempty"`
// Config defines config file of PD
Config ConfigFile `json:"config"`
Expand All @@ -256,6 +258,12 @@ type PDPorts struct {
Peer *Port `json:"peer,omitempty"`
}

type PDProbes struct {
// Readiness defines the readiness probe of PD.
// The default handler is a TCP socket on the client port.
Readiness *corev1.Probe `json:"readiness,omitempty"`
}

type PDGroupStatus struct {
CommonStatus `json:",inline"`
GroupStatus `json:",inline"`
Expand Down
24 changes: 24 additions & 0 deletions apis/core/v1alpha1/tidb_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ const (
DefaultTiDBPortStatus = 10080
)

const (
// TCPProbeType represents the readiness prob method with TCP.
TCPProbeType string = "tcp"
// CommandProbeType represents the readiness prob method with arbitrary unix `exec` call format commands.
CommandProbeType string = "command"
)

const (
// TiDBServerTLSVolumeName is the volume name for the TLS secret used by TLS communication between TiDB server and MySQL client.
TiDBServerTLSVolumeName = NamePrefix + "tidb-server-tls"
Expand Down Expand Up @@ -252,6 +259,8 @@ type TiDBTemplate struct {
type TiDBTemplateSpec struct {
// Server defines the server configuration of TiDB.
Server TiDBServer `json:"server,omitempty"`
// Probes defines probes for TiDB.
Probes TiDBProbes `json:"probes,omitempty"`
// Resources defines resource required by TiDB.
Resources ResourceRequirements `json:"resources,omitempty"`
// Config defines config file of TiDB.
Expand Down Expand Up @@ -280,6 +289,21 @@ type TiDBPorts struct {
Status *Port `json:"status,omitempty"`
}

type TiDBProbes struct {
// Readiness defines the readiness probe for TiDB.
// The default handler is a TCP socket on the client port.
Readiness *TiDBProb `json:"readiness,omitempty"`
}

type TiDBProb struct {
// "tcp" will use TCP socket to connect component port.
// "command" will probe the status api of tidb.
// +kubebuilder:validation:Enum=tcp;command
Type *string `json:"type,omitempty"`

corev1.Probe `json:",inline"`
}

// TiDBService defines some fields used to override the default service.
// TODO: refine the fields, also ref #36
type TiDBService struct {
Expand Down
9 changes: 9 additions & 0 deletions apis/core/v1alpha1/tikv_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package v1alpha1

import (
"k8s.io/apimachinery/pkg/api/meta"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/utils/ptr"
Expand Down Expand Up @@ -239,6 +240,8 @@ type TiKVTemplate struct {
type TiKVTemplateSpec struct {
// Server defines the server config of TiKV
Server TiKVServer `json:"server,omitempty"`
// Probes defines probes for TiKV
Probes TiKVProbes `json:"probes,omitempty"`
// Resources defines resource required by TiKV
Resources ResourceRequirements `json:"resources,omitempty"`
// Config defines config file of TiKV
Expand All @@ -262,6 +265,12 @@ type TiKVPorts struct {
Status *Port `json:"peer,omitempty"`
}

type TiKVProbes struct {
// Readiess defines readiness probe for tikv.
// The default handler is a TCP socket on the client port.
Readiness *corev1.Probe `json:"readiness,omitempty"`
}

type TiKVGroupStatus struct {
CommonStatus `json:",inline"`
GroupStatus `json:",inline"`
Expand Down
88 changes: 88 additions & 0 deletions apis/core/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

159 changes: 159 additions & 0 deletions manifests/crd/core.pingcap.com_pdgroups.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8563,6 +8563,165 @@ spec:
type: object
type: array
type: object
probes:
properties:
readiness:
description: |-
Readiness defines the readiness probe of PD.
The default handler is a TCP socket on the client port.
properties:
exec:
description: Exec specifies the action to take.
properties:
command:
description: |-
Command is the command line to execute inside the container, the working directory for the
command is root ('/') in the container's filesystem. The command is simply exec'd, it is
not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use
a shell, you need to explicitly call out to that shell.
Exit status of 0 is treated as live/healthy and non-zero is unhealthy.
items:
type: string
type: array
x-kubernetes-list-type: atomic
type: object
failureThreshold:
description: |-
Minimum consecutive failures for the probe to be considered failed after having succeeded.
Defaults to 3. Minimum value is 1.
format: int32
type: integer
grpc:
description: GRPC specifies an action involving a
GRPC port.
properties:
port:
description: Port number of the gRPC service.
Number must be in the range 1 to 65535.
format: int32
type: integer
service:
default: ""
description: |-
Service is the name of the service to place in the gRPC HealthCheckRequest
(see https://github.com/grpc/grpc/blob/master/doc/health-checking.md).

If this is not specified, the default behavior is defined by gRPC.
type: string
required:
- port
type: object
httpGet:
description: HTTPGet specifies the http request to
perform.
properties:
host:
description: |-
Host name to connect to, defaults to the pod IP. You probably want to set
"Host" in httpHeaders instead.
type: string
httpHeaders:
description: Custom headers to set in the request.
HTTP allows repeated headers.
items:
description: HTTPHeader describes a custom header
to be used in HTTP probes
properties:
name:
description: |-
The header field name.
This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
type: string
required:
- name
- value
type: object
type: array
x-kubernetes-list-type: atomic
path:
description: Path to access on the HTTP server.
type: string
port:
anyOf:
- type: integer
- type: string
description: |-
Name or number of the port to access on the container.
Number must be in the range 1 to 65535.
Name must be an IANA_SVC_NAME.
x-kubernetes-int-or-string: true
scheme:
description: |-
Scheme to use for connecting to the host.
Defaults to HTTP.
type: string
required:
- port
type: object
initialDelaySeconds:
description: |-
Number of seconds after the container has started before liveness probes are initiated.
More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
format: int32
type: integer
periodSeconds:
description: |-
How often (in seconds) to perform the probe.
Default to 10 seconds. Minimum value is 1.
format: int32
type: integer
successThreshold:
description: |-
Minimum consecutive successes for the probe to be considered successful after having failed.
Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.
format: int32
type: integer
tcpSocket:
description: TCPSocket specifies an action involving
a TCP port.
properties:
host:
description: 'Optional: Host name to connect to,
defaults to the pod IP.'
type: string
port:
anyOf:
- type: integer
- type: string
description: |-
Number or name of the port to access on the container.
Number must be in the range 1 to 65535.
Name must be an IANA_SVC_NAME.
x-kubernetes-int-or-string: true
required:
- port
type: object
terminationGracePeriodSeconds:
description: |-
Optional duration in seconds the pod needs to terminate gracefully upon probe failure.
The grace period is the duration in seconds after the processes running in the pod are sent
a termination signal and the time when the processes are forcibly halted with a kill signal.
Set this value longer than the expected cleanup time for your process.
If this value is nil, the pod's terminationGracePeriodSeconds will be used. Otherwise, this
value overrides the value provided by the pod spec.
Value must be non-negative integer. The value zero indicates stop immediately via
the kill signal (no opportunity to shut down).
This is a beta field and requires enabling ProbeTerminationGracePeriod feature gate.
Minimum value is 1. spec.terminationGracePeriodSeconds is used if unset.
format: int64
type: integer
timeoutSeconds:
description: |-
Number of seconds after which the probe times out.
Defaults to 1 second. Minimum value is 1.
More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
format: int32
type: integer
type: object
type: object
resources:
description: |-
ResourceRequirements describes the compute resource requirements.
Expand Down
Loading

0 comments on commit 13c496c

Please sign in to comment.