Kubernetes的调度单元Pod
Posted 水木,年華
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes的调度单元Pod相关的知识,希望对你有一定的参考价值。
Pod的生命周期
●容器阶段Phase
1.Pending (挂起)Pod已被Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待Pod被调度的时间和通过网络下载镜像的时间。
2.Running (运行中)Pod已经绑定到了某个节点,Pod中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。
3.Succeeded(成功)Pod 中的所有容器都已成功终止,并且不会再重启。
4.Failed(失败)Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
5.Unknown(未知)因为某些原因无法取得Pod的状态。这种情况通常是因为与Pod 所在主机通信失败。
●容器状态 Status
一旦调度器将Pod分派给某个节点,kubelet就通过容器运行时开始为Pod创建容器。容器的状态有三种: Waiting (等待)、Running(运行中)和Terminated (已终止)。
kubectl describe pod <pod 名称>
1.Waiting(等待)
如果容器并不处在 Running或Terminated 状态之一,它就处在 Waiting 状态。处于 Waiting 状态的容器仍在运行它完成启动所需要的操作:例如,从某个容器镜像仓库拉取容器镜像,或者向容器应用Secret数据等等。当你使用kubectl来查询包含Waiting 状态的容器的Pod时,你也会看到一个Reason字段,其中给出了容器处于等待状态的原因。
2.Running(运行中)
Running 状态表明容器正在执行状态并且没有问题发生。如果配置了postStart 回调,那么该回调已经执行完成。如果你使用kubectl来查询包含Running 状态的容器的Pod时,你也会看到关于容器进入 Running 状态的信息。
3.Terminated(已终止)
处于Terminated 状态的容器已经开始执行并且或者正常结束或者因为某些原因失败。如果你使用kubectl 来查询包含Terminated 状态的容器的Pod时,你会看到容器迸入此状态的原因、退出代码以及容器执行期间的起止时间。
为容器的生命周期事件设置处理函数
·定义postStart和 preStop 处理函数
创建一个包含一个容器的Pod,该容器为postStart和preStop事件提供对应的处理函数。
在上述配置文件中,可以看到 postStart 命令在容器的/usr/share目录下写入文件message。命令preStop负责优雅地终止nginx服务。当因为失效而导致容器终止时,这一处理方式很有用。
创建Pod:
kubectl apply -f kubeblog/docs/Chapter6/lifecycle-events.yaml
验证Pod中的容器已经运行:
kubectl get pod lifecycle-demo
使用shell连接到你的Pod里的容器:
kubectl exec -it lifecycle-demo -- /bin/bash
在shell中,验证postStart 处理函数创建了message 文件:
root@lifecycle-demo:/# cat /usr/share/message
命令行输出的是postStart处理函数所写入的文本
Hello from the postStart handler
创建包含Init容器的Pod
●理解Init容器
每个 Pod 中可以包含多个容器,应用运行在这些容器里面,同时Pod也可以有一个或多个先于应用容器启动的Init容器。
lnit容器与普通的容器非常像,除了如下两点:
1.它们总是运行到完成。
2.每个都必须在下一个启动之前成功完成。
如果 Pod的Init容器失败,Kubernetes 会不断地重启该Pod,直到 Init容器成功为止。然而,如果Pod对应的restartPolicy值为Never,Kubernetes不会重新启动Pod。
●与普通容器的不同之处
Init容器支持应用容器的全部属性和特性,包括资源限制、数据卷和安全设置。
同时Init容器不支持lifecycle(生命周期)、livenessProbe、readinessProbe和 startupProbe,因为它们必须在Pod就绪之前运行完成。
个
●实战Init Pod
下面的例子定义了一个具有2个Init容器的简单Pod。第一个等待 myservice启动,第二个等待mydb启动。一旦这两个lnit容器都启动完成,Pod将启动spec节中的应用容器。
要启动这个Pod,可以执行如下命令:
kubectl apply -f kubeblog/docs/chapter5/myapp.yaml
·如需查看Pod内Init容器的日志,请执行:
kubectl logs myapp-pod -c init-container 查看第二个Init容器
此时,Init容器将会等待10秒,你将能看到 Init 容器执行完毕,随后my-app 的Pod进入Running 状态:
我们能够看到Init容器完成,并且myapp-pd被创建。
用探针检查Pod的健康性
探针的作用
探针是由kubelet对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的Handler (处理程序)。有三种类型的处理程序:
ExecAction:在容器内执行指定命令。如果命令退出时返回码为0则认为诊断成功。
TCPSocketAction:对容器的IP地址上的指定端口执行TCP检查。如果端口打开,则诊断被认为是成功的。
HTTPGetAction:对容器的IP地址上指定端口和路径执行HTTP Get请求。如果响应的状态码大于等于200且小于400,则诊断被认为是成功的。
每次探测都将获得以下三种结果之一:
Success(成功)︰容器通过了诊断。
Failure (失败)︰容器未通过诊断。
Unknown(未知)︰诊断失败,因此不会采取任何行动。
以上是关于Kubernetes的调度单元Pod的主要内容,如果未能解决你的问题,请参考以下文章