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。