什么是pod

Pod 是 K8s 系统的基础单元,是由用户创建或部署的最小组件,也是 K8s 系统上运行容器化应用的资源对象。

K8s 集群中其他资源对象都是为 pod 这个资源对象做支撑来实现 K8s 管理应用服务的目的。

K8s 集群组件主要包括主节点组件API Server、Controller Manager、Scheduler 以及子节点组件 kubelet、container Runtime(如docker)、kube-proxy 等。

Pod 生命周期中的几种不同状态包括pending、running、succeeded、failed、Unknown

k8s的框架

**加粗样式**
APISERVER:所有服务访问统一入口
CrontrollerManager:维持副本期望数目
Scheduler:负责介绍任务,选择合适的节点进行分配任务
ETCD::键值对数据库 储存K8S集群所有重要信息(持久化)
Kubelet: 直接跟容器引擎交互实现容器的生命周期管理
Kube-proxy:负责写入规则至IPTABLES、 IPVS实现服务映射访问的

pod创建过程

kubectl与API Server交互

kubectl 向 k8s api server 发起一个create pod 请求(即我们使用Kubectl敲一个create pod命令) 。

k8s api server接收到pod创建请求后,不会去直接创建pod;而是生成一个包含创建信息的yaml。

kubectl
api server

将yaml信息写入etcd数据库

apiserver 将刚才的yaml信息写入etcd数据库。到此为止仅仅是在etcd中添加了一条记录, 还没有任何的实质性进展。

api server
etcd

scheduler 查看 k8s api 并写入etcd

scheduler 查看 k8s api
首先判断:pod.spec.Node == null?
若为null,表示这个Pod请求是新来的,需要创建;因此先进行调度计算,找到最“闲”的node。
然后将信息在etcd数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点)
同样上述操作的各种信息也要写到etcd数据库中。

监测
写入
scheduler
api server
etcd

创建container

kubelet 通过监测etcd数据库(即不停地看etcd中的记录),发现 k8s api server 中有了个新的Node;
如果这条记录中的Node与自己的编号相同(即这个Pod由scheduler分配给自己了);
则调用node中的docker api,创建container。

不停查看
发现相同编号
创建
kubelet
etcd
container

调度计算

过滤主机 (调度预选):调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。

主机打分(调度优选):对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把容一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等。

合适的节点选择

总结来说就是:
1.满足Pod资源要求
2.满足Pod的特殊关系要求
3.满足Node限制要求
4.做到集群资源合理利用

Logo

开源、云原生的融合云平台

更多推荐