In Kubernetes, health checks are defined using Liveness, Readiness, and Startup Probes. A
kubelet runs the probes. For example, in an HTTP or HTTPS probe, the kubelet makes
HTTP calls to the given address mentioned in the probe configured. Generally, the
address of the application container running inside the pod is used.
Figure 1. Health Checks Part I
In Service Mesh, the operator alters the HTTP probes to the proxy container which
performs proxy health checks in addition to application health checks.
Figure 2. Health Checks with Service Mesh Part II
Currently, Service Mesh only supports HTTP connections from the kubelet to the proxy.
If the original probe is HTTPS or TCP, Service Mesh rewrites the probe to use HTTP
from the kubelet to the proxy container. Based on the original probe settings, the
proxy supports HTTP and HTTPS health checks from the proxy to the destination
endpoint. If other types of probes are found (for example,
tcpSocket, grpc) they are ignored silently.
The proxy continues to perform proxy related health checks and any
application-related health checks.
Health Check Examples
Example: Configure HTTP Liveness and Startup Probes 🔗
Health check probes are defined at spec:template:spec:livenessProbe
and spec:template:spec:startupProbe. Make sure to define the ports
used in this spec for health check endpoints in the virtual deployment listener as
well.
The host name is not defined for the probes in the httpHeaders field
or host field or under the httpGet field.
Therefore, the request defaults to the IP address of the pod where the
ratings-v1 container is running. The kubelet tries to reach
http://podipaddress:9080/health during startup. Because of the
startupProbe configured here, the application has a maximum of
150 (30*5) seconds to be ready. If the startup probe never succeeds, the container
is killed after 150 seconds subject to the pod's restartPolicy.
Since startupProbe is defined, livenessProbe stays
disabled during startup until the http://podipaddress:9080/health
endpoint returns a 2xx response. Post a successful startup and the
liveness probe becomes active and keeps checking for a 2xx response
every 5 seconds from the http://podipaddress:9080/health endpoint
after an initial delay of 2 seconds. If the health check fails, the kubelet kills
and restarts the container.
In a meshified scenario, the request flows from kubelet to Proxy container to
Application container. Both the probes use the HTTP scheme by default as no scheme
is defined.
Example: Configure an HTTPS livenessProbe for the ratings Container 🔗
livenessProbe:
initialDelaySeconds: 2
periodSeconds: 5
httpGet:
host: ratings # Defaults to podIpaddress, Can be defined in httpHeaders field as well
path: /health # Defaults to /
port: 9080
scheme: https # Defaults to http if not defined
httpHeaders:
- name: Accept
value: application/json
With this configuration, the kubelet tries to reach the
https://ratings:9080/health endpoint. As described in the
health check diagram, mesh proxy intercepts this request and changes the scheme to
HTTP. Further, the proxy initiates an HTTPS request from proxy to destination
endpoint. In short, kubelet to Proxy container is HTTP. Proxy container to
ratings container is HTTPS. If this probe succeeds, the pod is
marked as live. A similar rewrite of the probe scheme happens if the request is a
TCP probe, kubelet to Proxy container is HTTP.
Example: Configure a GRPC livenessProbe for the ratings Container
Probes using the GRPC protocol or `exec` aren't modified by Service Mesh. Therefore, these probes may not work
as expected when the virtual service uses a STRICT TLS mode after
you meshify an application. Currently, Service Mesh
only supports HTTP connections from the kubelet to the proxy.