2、副本机制和控制器部署托管Pod
当需要pod能够自动保持运行,并且保持健康时,通常会创建ReplicationController或Deployment这样的资源来托管Pod,接着由它们来创建并管理实际的pod。
当创建未托管的pod时 ,会选择一个集群节点来运行pod, 然后在该节点上运行容器。Kubemetes会监控这些容器, 并且在它们失败的时候自动重新启动它们。 **但是如果整个节点失败,那么节点上的pod会丢失,并且不会被新节点替换。**除非这些pod被控制器托管。
2.1 保持Pod健康
在K8s中,只要将 pod 调度到某个节点, 该节点上的 Kubelet 就会运行 pod 的容器, 从此只要该 pod 存在, 就会保持运行。 如果容器的主进程崩溃, Kubelet 将重启容器。 如果应用程序中有一个导致它每隔一段时间就会崩溃的 bug, Kubemetes 会自动重启应用程序, 所以即使应用程序本身没有做任何特殊的事, 在 Kubemetes 中运行也能自动获得自我修复的能力。
但有时进程没有崩溃,仍需要停止工作,例如发生OOM时,JVM进程会一直运行,此时需要程序向k8s发出信号,告诉k8s运行异常并重新启动此程序。
2.1.1 存活探针
k8s可以通过存活探针来检查容器是否还在运行,可以为每个pod中的每个容器单独制定存货探针,如果探测失败,k8s会重新启动容器。
K8有以下三种探测容器的机制:
- HTTP GET探针对容器的 IP 地址(你指定的端口和路径)执行 HTTP GET 请求。
- 如果探测器收到响应,并且响应状态码不代表错误(换句话说,如果HTTP 响应状态码是2xx或3xx), 则认为探测成功。如果服务器返回错误响应状态 码或者根本没有响应,那么探测就被认为是失败的,容器将被重新启动。
- TCP套接字探针尝试与容器指定端口建立TCP连接。如果连接成功建立则探测成功,否则重启容器。
- Exec探针在容器内执行任意命令,并检查命令的退出状态码。如果状态码是0, 则探测成功。所有其他状态码都被认为失败。
2.1.2 创建HTTP存活探针
将存活探针添加到pod:
该pod的描述文件定义了一个httpGet存活探针,该探针告诉Kubernetes定期在端口8080路径上执行HTTPGET请求,以确定该容器是否健康。
可以通过kubectl describe的内容查看具体的内容:
可以看到容器现在正在运行,但之前由于错误而终止。退出代码为137。数字137是两个数字的总和: 128+x, 其中x是终止进程的信号编号。在这个例子中,x等于9, 这是