创建Pod的流程
kubernetes是基于list-watch机制
的控制器架构,实现组件间交互的节藕;
简单来说k8s架构类似于微服务的架构,每个组件都有各自的职责,它们都是以Api Server组件为核心
,其它组件都是监控自己负责的资源
,当资源发生变化时,kube-apiserver会通知这些组件,这个过程类似于发布与订阅
的过程;
接下来我们看下从创建pod 到 pod运行都有哪些过程:
[root@k8s-master ~]# kubectl run pod666 --image=nginx
-
kubectl向apiserver发送一个创建pod的请求,apiserver会将数据放到etcd中存储;
-
scheduler收到未绑定pod的资源,通过自身调度算法选择一个合适的node进行绑定,然后响应给apiserver,apiserver再入etcd库;
-
kubelet收到分配自己节点上的pod,调用docker api创建容器,然后将容器状态响应给apiserver;
[root@k8s-master ~]# kubectl get pod
销毁一个Pod的流程
- Pod 设置为Terminating状态,并从所有服务的Endpoints列表中删除
- 此时,Pod停止停止,但是Pod中运行的容器不受影响
- PreStop Hook被执行
- preStop Hook发送容器特殊命令或者Http请求到Pod中,Pod应用程序在接收SIGTERM(该SIGTERM信号是用于导致程序终止的通用信号。不同于SIGKILL,该信号可以被阻止,处理和忽略。这是礼貌地要求程序终止的正常方法),如果使用第三方代码或者管理系统无法控制,则preStop Hook是在不修改应用程序的情况下触发
- SIGTERM信号发送给Pod
- 此时,Kubernetes将向Pod中的容器发送SIGTERM信号,这个信号即通知容器他们很快将进行关闭。
- Kubernetes等待优雅的终止
- 此时,Kubernetes等待指定的时间称为优雅终止宽限期。默认情况下,这是30秒(可以修改),值得注意的是,PreStop Hook和SIGTREM信息是属于并行执行,Kubernetes不会等待PreStop Hook完成。
注:
如果Pod在terminationGracePeriod完成之前推出,Kubernetes将进如释放阶段,如果容器在优雅终止宽限期(terminationGracePeriod限定时间),则会发送SIGKILL信号并强制删除。与此同时,所有的Kubernetes对象也会被清除
大家在上面可以看出未列出的组件,原因如下:
controller-manager:pod是直接由kubelet创建的,没有经过调度器,而controller-manager是负责控制器管理的,例如创建deployment等,才会经过controller-manager;
kube-proxy:负责service网络的实现,访问service时会转发到pod;因为在创建pod时没有创建service 所以kube-proxy在这个架构中也没有干预进来;