Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。

        一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。

        Docker是Kubernetes Pod中最常见的runtime ,Pods也支持其他容器runtimes。

        Kubernetes中的Pod使用可分两种主要方式:

  • Pod中运行一个容器。“one-container-per-Pod”模式是Kubernetes最常见的用法; 在这种情况下,你可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。
  • Pods中运行多个需要一起工作的容器。Pod可以封装紧密耦合的应用,它们需要由多个容器组成,它们之间能够共享资源(IP 、网络、cpu、mem、挂载目录等),这些容器可以形成一个单一的内部service单位 ——一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。

 

第一步:kubectl   create  po

      首先进行认证后,kubectl会调用master  api创建对象的接口,然后向k8s  apiserver发出创建pod的命令

第二步:k8s  apiserver

        apiserver收到请求后,并非直接创建pod,而是先创建一个包含pod创建信息的yaml文件,并将文件信息写入到etcd中(如果此处是用yaml文件创建pod,则这两步就可以忽略)

第三步:controller  manager

        创建Pod的yaml信息会交给controller  manager ,controller  manager根据配置信息将要创建的资源对象(pod)放到等待队列中。

第四步:scheduler

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

        分配过程需要两层调度:预选调度和优选调度

(1)预选调度:一般根据资源对象的配置信息进行筛选。例如NodeSelector、HostSelector和节点亲和性等。

(2)优选调度:根据资源对象需要的资源和node节点资源的使用情况,为每个节点打分,然后选出最优的节点创建资源对象(pod)。

第四步:kubelet

目标节点node2上的kubelet进程通过API Server,查看etcd数据库(kubelet通过API Server的WATCH接口监听Pod信息,如果监听到新的pod副本被调度绑定到本节点)监听到kube-scheduler产生的Pod绑定事件后获取对应的Pod清单,然后调用node1本机中的docker  api初始化volume、分配IP、下载image镜像,创建容器并启动服务

第五步:controller  manager

controller  manager会通过API Server提供的接口实时监控资源对象的当前状态,当发生各种故障导致系统状态发生变化时,会尝试将其状态修复到“期望状态”

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐