在 Kubernetes 中,Liveness 和 Readiness Probe 是两种非常重要的健康检查方式。这两种方式可以帮助我们检测容器是否健康,并且根据检测结果来做出相应的操作。本文将详细介绍 Kubernetes 中的 Liveness 和 Readiness Probe,包括它们的定义、使用场景、配置方法以及示例代码。
Liveness Probe
Liveness Probe 是指在容器运行时检测容器是否存活的一种机制。如果容器不存活,Kubernetes 会自动重启容器。Liveness Probe 通常用于检测容器内部的应用程序是否正常运行。
使用场景
Liveness Probe 适用于以下场景:
- 容器内部的应用程序可能会出现崩溃或死锁,需要及时检测容器是否存活,并进行相应的操作。
- 容器内部的应用程序需要一些时间来启动,需要等待一段时间后才能进行健康检查。
配置方法
在 Kubernetes 中,我们可以通过在 Pod 的配置文件中添加 Liveness Probe 来启用容器的健康检查。下面是一个示例:
// www.javascriptcn.com code example
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-app
image: my-app-image
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 30在上面的示例中,我们在容器中添加了一个 Liveness Probe。这个 Probe 会每隔 30 秒向容器发送一个 HTTP GET 请求,检查容器的健康状态。如果容器在 10 秒内无法响应请求,Kubernetes 就会认为容器已经死亡,并自动重启容器。
在 Liveness Probe 的配置中,我们可以通过以下参数来自定义 Probe 的行为:
httpGet:发送 HTTP GET 请求进行健康检查。exec:执行命令进行健康检查。tcpSocket:检查容器的 TCP 连接是否正常。initialDelaySeconds:容器启动后多少秒开始进行健康检查。periodSeconds:多少秒进行一次健康检查。timeoutSeconds:等待健康检查响应的超时时间。successThreshold:连续多少次健康检查成功后认为容器已经存活。failureThreshold:连续多少次健康检查失败后认为容器已经死亡。
示例代码
下面是一个使用 Liveness Probe 的示例代码:
// www.javascriptcn.com code example
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
});
server.listen(8080, () => {
console.log('Server running at http://localhost:8080/');
});
// Liveness Probe
setInterval(() => {
console.log('Liveness Probe');
}, 5000);在上面的示例中,我们启动了一个 HTTP 服务器,并且每隔 5 秒输出一条日志作为 Liveness Probe。
Readiness Probe
Readiness Probe 是指在容器启动后检测容器是否准备好接收流量的一种机制。如果容器没有准备好接收流量,Kubernetes 就不会将流量发送到这个容器。Readiness Probe 通常用于检测容器内部的应用程序是否已经完成初始化。
使用场景
Readiness Probe 适用于以下场景:
- 容器内部的应用程序需要一些时间来初始化,需要等待一段时间后才能接收流量。
- 容器内部的应用程序需要加载一些数据或配置,需要等待数据或配置加载完成后才能接收流量。
配置方法
在 Kubernetes 中,我们可以通过在 Pod 的配置文件中添加 Readiness Probe 来启用容器的健康检查。下面是一个示例:
// www.javascriptcn.com code example
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-app
image: my-app-image
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 10
periodSeconds: 30在上面的示例中,我们在容器中添加了一个 Readiness Probe。这个 Probe 会每隔 30 秒向容器发送一个 HTTP GET 请求,检查容器是否准备好接收流量。如果容器在 10 秒内无法响应请求,Kubernetes 就会认为容器没有准备好接收流量,并暂停将流量发送到这个容器。
在 Readiness Probe 的配置中,我们可以通过以下参数来自定义 Probe 的行为:
httpGet:发送 HTTP GET 请求进行健康检查。exec:执行命令进行健康检查。tcpSocket:检查容器的 TCP 连接是否正常。initialDelaySeconds:容器启动后多少秒开始进行健康检查。periodSeconds:多少秒进行一次健康检查。timeoutSeconds:等待健康检查响应的超时时间。successThreshold:连续多少次健康检查成功后认为容器已经准备好接收流量。failureThreshold:连续多少次健康检查失败后认为容器没有准备好接收流量。
示例代码
下面是一个使用 Readiness Probe 的示例代码:
// www.javascriptcn.com code example
const http = require('http');
let ready = false;
const server = http.createServer((req, res) => {
if (!ready) {
res.writeHead(503, {'Content-Type': 'text/plain'});
res.end('Service Unavailable\n');
} else {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}
});
server.listen(8080, () => {
console.log('Server running at http://localhost:8080/');
});
// Readiness Probe
setTimeout(() => {
console.log('Readiness Probe');
ready = true;
}, 10000);在上面的示例中,我们启动了一个 HTTP 服务器,并且在 10 秒后将 ready 变量设置为 true,表示容器已经准备好接收流量。在接收到请求时,如果 ready 变量为 false,就返回 503 状态码,表示服务不可用。如果 ready 变量为 true,就返回 200 状态码,表示服务可用。在 10 秒后,输出一条日志作为 Readiness Probe。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d93fbba941bf71340d48ce