k8s创建pod和service的过程

一、创建pod

1、用户通过Kubectl提交一个创建RC的请求,该请求通过APIServer被写入etcd中,

2、此时Controller Manager通过API Server的监听资源变化的接口监听到这个RC事件,
分析之后,发现当前集群中还没有它所对应的Pod实例,
于是根据RC里的Pod模板定义生成一个Pod对象,通过APIServer写入etcd,

3、此事件被Scheduler发现,它立即执行一个复杂的调度流程,
为这个新Pod选定一个落户的Node,然后通过API Server讲这一结果写入到etcd中,

4、目标Node上运行的Kubelet进程通过APIServer监测到这个“新生的”Pod,
并按照它的定义,启动该Pod并任劳任怨地负责它的下半生,直到Pod的生命结束。

二、创建service

1、随后,我们通过Kubectl提交一个新的映射到该Pod的Service的创建请求

2、ControllerManager会通过Label标签查询到相关联的Pod实例,然后生成Service的Endpoints信息,并通过APIServer写入到etcd中,

3、接下来,所有Node上运行的Proxy进程通过APIServer查询并监听Service对象与其对应的Endpoints信息,建立一个软件方式的负载均衡器来实现Service访问到后端Pod的流量转发功能。

三、

1、Master:Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd。

1.1、APIServer: APIServer负责对外提供RESTful的Kubernetes API服务,
它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给
APIServer处理后再提交给etcd。如架构图中所示,kubectl(Kubernetes提供的客户端工具,
该工具内部就是对Kubernetes API的调用)是直接和APIServer交互的。

1.2、schedule: scheduler的职责很明确,就是负责调度pod到合适的Node上。如果把scheduler看成一个黑匣子,
那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定,即将这个pod部署到这个Node上。
Kubernetes目前提供了调度算法,但是同样也保留了接口,用户可以根据自己的需求定义自己的调度算法。
controller manager: 如果说APIServer做的是“前台”的工作的话,那controller manager就是负责“后台”的。
每个资源一般都对应有一个控制器,而controller manager就是负责管理这些控制器的。比如我们通过APIServer
创建一个pod,当这个pod创建成功后,APIServer的任务就算完成了。而后面保证Pod的状态始终和我们预期的一样
的重任就由controller manager去保证了。

1.3、etcd: etcd是一个高可用的键值存储系统,Kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。

2、Node:每个Node节点主要由三个模块组成:kubelet、kube-proxy、runtime。

2.1、runtime
runtime指的是容器运行环境,目前Kubernetes支持docker和rkt两种容器。

2.2、kube-proxy
该模块实现了Kubernetes中的服务发现和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP连接转发,默认基于Round
Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,
kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,
从而保证了后端pod的IP变化不会对访问者造成影响。另外kube-proxy还支持session affinity。

2.3、kubelet
Kubelet是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上面的所有容器,
但是如果容器不是通过Kubernetes创建的,它并不会管理。本质上,它负责使Pod得运行状态与期望的状态一致。

至此,Kubernetes的Master和Node就简单介绍完了。下面我们来看Kubernetes中的各种资源/对象。

猜你喜欢

转载自www.cnblogs.com/lexiaofei/p/11078532.html