在 Kubernetes 中,Pod 是最小的部署单元,它包含一个或多个容器。在实际部署中,我们需要确保容器能够正常运行,以保证应用程序的稳定性。Kubernetes 提供了两个探测机制来确保容器的健康状态:livenessProbe 和 readinessProbe。
livenessProbe
livenessProbe 主要用于检测容器是否存活。如果容器未能通过 livenessProbe 的检测,Kubernetes 将会杀死该容器并重新启动它。livenessProbe 可以通过三种方式进行检测:
HTTP 探测
通过发送 HTTP 请求来检测容器是否存活。以下是一个示例:
livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 15 periodSeconds: 20
在上面的示例中,容器的健康状态将通过发送一个 HTTP GET 请求到端口 8080 上的 /healthz 路径来进行检测。如果容器在初始延迟时间(initialDelaySeconds)之后未能响应请求,Kubernetes 将会认为容器失败,并根据 periodSeconds 指定的时间间隔进行重试。
TCP 探测
通过发送 TCP 请求来检测容器是否存活。以下是一个示例:
livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 15 periodSeconds: 20
在上面的示例中,容器的健康状态将通过发送一个 TCP 请求到端口 8080 来进行检测。如果容器在初始延迟时间(initialDelaySeconds)之后未能响应请求,Kubernetes 将会认为容器失败,并根据 periodSeconds 指定的时间间隔进行重试。
执行命令
通过执行一个命令来检测容器是否存活。以下是一个示例:
livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 15 periodSeconds: 20
在上面的示例中,容器的健康状态将通过执行 cat /tmp/healthy 命令来进行检测。如果命令执行成功,则容器被认为是健康的。如果命令执行失败,则容器被认为是不健康的。
readinessProbe
readinessProbe 主要用于检测容器是否准备好接受流量。如果容器未能通过 readinessProbe 的检测,Kubernetes 将不会将流量路由到该容器。readinessProbe 可以通过与 livenessProbe 相同的三种方式进行检测。
以下是一个示例:
readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 10
在上面的示例中,容器将通过发送一个 HTTP GET 请求到端口 8080 上的 /ready 路径来进行检测。如果容器在初始延迟时间(initialDelaySeconds)之后未能响应请求,Kubernetes 将不会将流量路由到该容器,并根据 periodSeconds 指定的时间间隔进行重试。
总结
livenessProbe 和 readinessProbe 是 Kubernetes 中非常重要的机制,它们可以确保容器的健康状态,并控制流量的路由。在实际部署中,我们需要根据应用程序的实际情况来选择适当的探测方式,并设置合适的参数。在设置探测时,我们需要考虑容器的启动时间、健康检查的时间间隔、以及容器的重启策略等因素。只有合理地设置探测机制,才能保证应用程序的稳定性。
示例代码
以下是一个 Node.js 应用程序的示例代码,它包含一个 HTTP 服务器和一个 TCP 服务器,以及一个 livenessProbe 和一个 readinessProbe:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- --- - --------------- ----- ---- - ---------------- -- ----- ----- ------ - ----------------------- ---- -- - ------------------ - --------------- ------------ --- --------------- ----------- --- ------------------- -- -- - ----------------- ------ --------- -- ---- ---------- --- ----- --------- - ------------------------- -- - ------------------ ------------- -------------------- --- ---------------------- -- -- - ---------------- ------ --------- -- ---- ------- --- -- ------------- -------------- -- - ----------------------------- -- ------ -- -------------- --- ----- - ------ ------------- -- - ---------------------- ----- - ----- -- ------ ----- --------------- - ----------------------- ---- -- - -- ------- - ------------------ - --------------- ------------ --- -------------------- - ---- - ------------------ - --------------- ------------ --- ------------ ----------- - --- ---------------------------- -- -- - --------------------------- ------ --------- -- ---- ------- ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65754b16d2f5e1655de739c6