k8s架构原理
k8s节点介绍
分为master节点和node节点,master节点负责整个集群的调度,node节点负责应用容器的运行。
k8s组件介绍
kubectl
kubectl 是一个客户端的管理工具,它会监听apiserver,比如有创建pod的事件时,会执行pod创建的相关操作,也会执行探针检测。
kube scheduler
负责资源调度,会根据用户的调度规则分配一个最佳节点来创建pod。
kube-proxy
负责集群外访问集群内pod,管理Cluster IP和endpoint的映射关系,其工作模式有iptables、ipvs、userspace三种方式。
kube-apiserver
所有组件之间通信都需要通过这个组件来实现。
core-dns
用于将svc解析为Cluster IP。
CNI
容器网络接口,通常的实现方式有flannel、calico。
ETCD
k8s所有的数据都保存在etcd中,由apiserver提供统一的访问入口。
Pod创建流程
-
客户端调用apiserver将创建配置清单写入etcd。
-
kube-schedule监听到创建事件时,进行预选和优选选择一个最佳的node节点,同时将调度结果通过apiserver写回到etcd。
-
kubectl监听到写入事件后,如果发现是自己的节点要创建pod时,
3.1 调用/etc/cni/net.d目录下的网络插件配置,由网络插件实现地址分配、接口创建、网络创建等功能 。
3.2 调用容器引擎(通常是docker)创建pod。
Pod关闭流程
- 调用apiserver将Pod 状态置为Terminating。同时将metadata.annotations.deletionTimestamp置为当前时间。
- 与此同时,kube-proxy 会将 Pod 从对应的 service 上摘除。
- 与此同时,针对有 PreStop Hook 的容器,kubelet 会调用每个容器的 PreStop Hook,假如 PreStop Hook 的运行时间超出了 grace period,kubelet 会发送 SIGTERM 并再等 2 秒,如果2s后还未关闭,则发送SIGKILL信号。
- 与此同时,针对没有 PreStop Hook 的容器,kubelet 发送 SIGTERM。如果 达到grace period之后,容器还未终止,则kubelet 发送 SIGKILL 干掉尚未退出的容器。