保持pod健康
使用 Kubernetes 的一个主要好处是,可以给 Kubernetes -个容器列表来由其保持容器在集群中的运行。可以通过让 Kubernetes 创建 pod 资源,为其选择一个工作节点并在该节点上运行该 pod 的容器来完成此操作。但是,如果其中一个容器终止,或一个 pod 的所有容器都终止,怎么办?
只要将 pod 调度到某个节点,该节点上的 Kubelet 就会运行 pod 的容器, 从此只要该 pod 存在,就会保持运行。如果容器的主进程崩溃,Kubelet 将重启容器。如果应用程序中有一个导致它每隔一段时间就会崩溃的 bug, Kubernetes 会自动重启应用程序,所以即使应用程序本身没有做任何特殊的事,在Kubernetes 中运行也能自动获得自我修复的能力。
即使进程没有崩溃,有时应用程序也会停止正常工作。例如,具有内存泄漏的 Java 应用程序将开始抛出 OutOfMemoryErrors,但 JVM 进程会一直运行。如果有一种方法,能让应用程序向 Kubernetes 发出信号,告诉 Kubernetes 它运行异常并让 Kubernetes 重新启动,那就很棒了。
我们已经说过,一个崩溃的容器会自动重启,所以也许你会想到,可以在应用中捕获这类错误, 并在错误发生时退出该进程。当然可以这样做,但这仍然不能解决所有的问题。
例如,你的应用因为无限循环或死锁而停止响应。为确保应用程序在这种情况下可以重新启动,必须从外部检查应用程序的运行状况,而不是依赖于应用的内部检测。
存活探针
Kubernetes 可以通过存活探针(liveness probe)检查容器是否还在运行。可以为 pod 中的每个容器单独指定存活探针。如果探测失败,Kubernetes 将定期执行探针并重新启动容器。
Kubernetes 有以下三种探测容器的机制:
- HTTP GET 探针对容器的 IP 地址(指定的端口和路径)执行 HTTP GET 请求。如果探测器收到响应,并且响应状态码不代表错误(换句话说,如果 HTTP 响应状态码是 2xx 或 3xx ),则认为探测成功。如果服务器返回错误响应状态码或者根本没有响应,那么探测就被认为是失败的,容器将被重新启动。
- TCP 套接字探针尝试与容器指定端口建立 TCP 连接。如果连接成功建立,则探测成功。 否则,容器重新启动。
- Exec 探针在容器内执行任意命令,并检查命令的退出状态码。如果状态码是 0,则探测成功。所有其他状态码都被认为失败。
创建 HTTP 的存活探针
创建一个包含 HTTP GET 存活探针的新 pod
apiVersion: v1
kind: Pod
metadata:
name: test-nginx-liveness-probe
spec:
containers:
- image: nginx
name: test
## 存活探针
livenessProbe:
## 初始延迟
initiaDelaySeconds: 20
## HTTP GET 存活探针
httpGet:
## HTTP 请求路径
path: /
## 端口
port: 8080
ports:
- containerPort: 80
protocol: TCP
该 pod 的描述文件定义了一个 HTTP Get 存活探针,该探针告诉 Kubernetes 定期在端口 8080 路径上执行 HTTP GET 请求,已确定该容器是否健康,请求在容器运行后立即开始。
上面指定8080,但其实容器没有在8080端口上运行http程序,所以会一直请求失败,Kubernete 会认为探测失败并重启容器。
当容器被强行终止时会创建一个全新的容器,而不是重启原来的容器 。
网友评论