pods

版权声明:转载请注明出处 https://blog.csdn.net/Lee_Suoer/article/details/85332393

pod是kubernates最小的单元。

集群中一个pod就是一个进程

pod中封装了容器,存储的资源还有独立的ip,来支配container怎么运行。pod中可能有一个或者多个相互耦合container

通常情况下pod都会有一个container,kubernates直接管理pod而不是container,也可能包含了一组共同协作的container

可以运行多个pod,每个pod运行一个单实例,形成一个集群,也是这个单实例的水平扩展,这一组pod有由controller管理。

pod怎么管理多个容器:

这些container通常在相同的物理机或者虚拟机上,可以相互沟通,相互依赖,相互协调(什么时候终止),

如果这个container相互联系紧密,那么运行在一个pod上会好一些。

pod为容器提供了网络和容器。

pod有独立的ip,containers共享这个ip,有自己的namespace,一个pod内部的container之间进行通信可以用localhost访问,要是和外部通信就得明确还每个container用什么端口了。

pod还提供了存储卷,这些container共享,也可以将container的数据持久化到存储卷上。

通常很少直接创建pod,因为他们周期相对短暂而且比较随意。他会在node中运行,知道运行正常结束,也可能由于资源短缺或者node有问题就会将pod删除。

别把容器重启和pod重启混淆了。pod本身是不运行的,它只是container运行的一个容器。

pod不会自己管理自己。通常由controller来直接管理pod。

controller负责创建管理pod,复制和回滚pod,还有自我保护的能力。比如一个node里的pod挂了,controller会从另一个node里产生一个和原来一样的新的pod

通常controller使用pod 模板来创建pod

pod是一个或者一组container(共享网络和存储),他们被一起定位到,一起被管理。共享一个pod context,运行在一个物理机或者虚拟机里。同一个pod里的容器可以通过localhost来交互,不同pod里的container要用ip地址来访问。

pod里的container共享卷,他由pod创建,是pod的一部分并且会挂在到应用的文件系统上。

pod的生命周期相对短暂,被创建,分配一个独立的id,然后被node管理,知道终止或者被删除。若果node坏了那么pod也就没了。已经运行的pod不会再被其他的node管理了,被删除了之后只会再重新创建一个新的pod来让别的node管理,有一个新的id。pod内部的东西也随着pod一起删除或重新创建。

pod是作为部署,复制和水平扩展的一个单元。pod中的容器之间通信用localhost就可以。他们有相同的ip和不同的端口号,共享网路,可以和其他的物理机交互。container的 hostname  就是 pod  的name

pod主要是能够一起定位和管理程序。

内容管理,数据,文件的加载和本地缓存等

日志,备份,压缩,快照

监听数据变化,日志追踪,日志和监控适配器,事件发布等

代理,桥接

控制,管理,配置,跟新

通常pod里不会运行多个相同的应用实例

一个container不要跑多个程序:透明,解耦,便于使用,高效

pod生命周期是短暂的,并且不会复活,出故障了就删除。一般不会直接创建它,是由controller创建的,controller是可以自我拯救的。(意思就是失败了可以重新启动,而不是有新的controller来代替他)

我们需要让pod优雅关闭,而不是直接kill,当用户发送删除指令的时候,系统会记录一个时间段,然后kill掉pod,同时也会给pod中的容器一个term信号给容器的主进程,一旦这个时间段过了之后,这个kill指令会发送给容器(强制关闭,kill),然后从apiserver来删除pod,如果在这个时间段之内kubelet或者容器的管理器重启了,那么这个终止操作会重试。

1.用户发送删除pod的命令,默认时间段为30s,

2.apiserver认为的pod在超过这个时间后认为这个pod会死了,所以更新pod状态

3.然后客户端显示列出的pod为‘Terminating’

4.kubelet看到pod被标记为Terminating状态了(第二步干的),所以要开始关闭了。

    (1)如果pod有关闭preStop hook,先调用它。

    (2)向pod里的进程发出term的指令

5.pod从service列表中删除,不在提供服务

6.时间段一过,直接杀死pod中所有的进程

7.kubelet 从apiserver中直接删除pod,客户端再也看不见了。

默认所有的时间段都是30s,kubectl delete 命令支持带 --grace-period=<seconds>参数,用户可以指定。0表示强制删除,要带一个--force  参数。

apiserver不会通过kubelet等待确认pod状态直接从apiserver中删除pod,然后立刻创建一个新的同名的pod,node中会经过一小段时间之后强制删除pod

要是StatefulSet pods,强制删除会有潜在的风险,要小心。

SecurityContext中使用privileged  表示给pod中的container开启特权模式。对于要使用linux系统功能的容器是有用的,容器内的进程获得的权限与容器外的进程几乎相同,

pending: 表示pod已经被kubernates系统接收,但是容器镜像还没有下载下来或者被创建出来

running:pod已经绑定到了node上,而且里面有container在运行。

successded: pod中的容器成功的停止了,并且不会被重启。

failed:pod里所有的容器都已经结束,但至少有一个容器以失败结束。(以非0的状态结束,或者被系统kill了)

unknown: 获取不到pod的状态,比如不能和pod进行交互了。

kubelet会定期探测容器,执行探测的时候,kubelet会调用container实现的一个handler,有三种类型:

ExecAction:在container内部执行一个命令。如果以状态0退出,那么认为 是成功的

TCPSocketAction:诊断容器的ip和端口号,如果端口号是打开的,那么认为 是成功的

HTTPGetAction: 发送一个 get 请求到指定ip端口路径,如果返回的状态码   400 > code >= 200 ,认为是成功的

每次探测有三个状态:

success: 诊断容器成功

Failure: 诊断容器失败

Unknown: 未知

kubelet有两种探测方式:

livenessProbe:探测容器是否正在运行,如果没有就杀死,否则默认状态是success

readinessProbe:判断容器是否能接受请求。如果失败了 那么从所有匹配到这个pod的service中删除这个pod的ip。

猜你喜欢

转载自blog.csdn.net/Lee_Suoer/article/details/85332393