k8s的工作负载pod
什么是wordloads呢?
工作负载是运行在k8s上的一个应用程序,一个应用很复杂,可能由单个组件或者多个组件共同完成。无论怎么样,可以用一组pod来表示一个工作负载(应用程序)。
什么是pod呢?
pod是一组容器(Containers),多个容器组成的。一个pod至少包含三种容器。
根/pause容器:基础容器
边车容器:从业务角度来说,也是属于应用程序的容器,在isitio里面它是服务网格服务治理那块会剥离出一个容器,这个叫做边车/数据面容器。
应用容器:应用程序的容器
临时容器:调试bug用的一种容器,需要在api-server.yaml开启门禁
pod是一种资源,可以独立使用,是没有调度的,不具备副本管理的能力
简单的Pod资源的例子:
apiVersion: v1kind: Podmetadata: name: my-pod spec: containers: - name: hello image: busybox:latest command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600'] restartPolicy: OnFailure
结果如下:kubectl logs -f 容器名:类似tail -f的方式来查看日志
Pod的生命周期,从大的方向,分为两个节点
第一个阶段初始化容器:比方说有三个初始化容器,这时Pause根容器先把它的活做完,然后初始化容器执行,串行执行。
第二个阶段是运行主容器:标准的容器
每个pod都有一个特殊的被称为根容器(父容器)/pause容器。
为什么会存在pause容器呢?
在同一个pod的多个容器是共享命名空间的:共享网络通讯的命名空间,比方说通过localhost,不用ip,这种是容器的标准功能。容器在创建的时候,网络空间是隔离的,localhost是无法访问的,但是pod要打破这种壁垒。
pause容器的职责:
①、它作为pod中共享Linux名称空间的基础容器
②、启用PID进程ID名称空间共享后,它作为每个pod的PID为1的根进程,并回收僵尸进程。
③、共享Pause融国企挂载的持久化卷,这样简化了业务容器之间的通信问题,也解决了容器之间的文件共享问题。
④、共享Pause容器分配的网络资源或者网络命名空间,共享整个Pod的其他容器,其他所有容器都会通过join Namespace的方式加入到根容器的命名空间中。
pasue容器是一个非常小的镜像,大概700KB左右,是一个C语言写的,永远处于暂停状态。注意:进程ID的命名空间没有共享,启动的时候,其他所有容器可以共享存储命名空间和网络共享命名空间。开始启用一下,之后就暂停了。
下面的都是pasue容器:
pod健康检查的探针机制
在启动业务容器的之前会调用start钩子方法,然后会调用容器的存活探测:liveness probe和就绪性探测:readiness probe。这两个探测机制也可以同时,也可以自己配置什么时候调用。然后容器的存活性探测会不断的探测是否死亡,如果死亡的话会开启二次调度,然后再停止业务容器之前会调用stop钩子方法。
总之,Pod启动过程中的要点是:
①、pod启动,会先依次执行所有的初始化容器,有一个失败,则Pod不能启动。
②、接下来启动所有的应用容器(每一个应用容器都必须能一直运行起来),Pod开始正式工作,一个启动失败就会尝试重启pod内的这个容器,pod只要NotReady,pod就不对外提供服务了。