k8s创建pod和service的过程
一、概念介绍
更详细的参见:https://www.kubernetes.org.cn/5335.html
1、K8s
K8s 是一种用于在一组主机上运行和协同容器化应用程序的系统,提供应用部署、规划、更新维护的机制。
应用运行在 K8s 集群之上,借助服务扩容、缩容,执行滚动更新在不同版本的应用程序之间调度流量以测试功能或回滚有问题的部署。
K8s 实现管理服务的各项功能是通过定义各种类型的资源来实现的,如 deployment、pod、service、volume 等。
2、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
二、Pod的创建、运行、销毁等生命周期
1、创建pod
1.1、与API Server交互
API Server 提供了集群与外部交互的接口,通过 kubectl 命令或者其他 API 客户端提交 pod spec 给 API Server 作为pod创建的起始。
Pod 与 API Server 交互的主要流程如下:
用户通过Kubectl提交一个创建RC的请求,该请求通过APIServer被写入etcd中,此时Controller Manager通过API Server的监听资源变化的接口监听到这个RC事件,
分析之后,发现当前集群中还没有它所对应的Pod实例,于是根据RC里的Pod模板定义生成一个Pod对象,通过APIServer写入etcd
至此,API Server 创建过程完成,剩下的由 scheduler 和 kubelet 来完成,此时 pod 处于 pending 状态。
1.2、与scheduler交互
此事件被Scheduler发现,它立即执行一个复杂的调度流程,为这个新Pod选定一个落户的Node,然后通过API Server讲这一结果写入到etcd中,
目标Node上运行的Kubelet进程通过APIServer监测到这个“新生的”Pod,并按照它的定义,启动该Pod并任劳任怨地负责它的下半生,直到Pod的生命结束。
1.3、kubelet 在所选定的节点上启动 pod。
Kubelet组件启动podkubelet 组件的作用不单单是创建 pod,另外还包括节点管理、cAdvisor 资源监控管理、容器健康检查等功能。
2、创建service
2.1、随后,我们通过Kubectl提交一个新的映射到该Pod的Service的创建请求
2.2、ControllerManager会通过Label标签查询到相关联的Pod实例,然后生成Service的Endpoints信息,并通过APIServer写入到etcd中,
2.3、接下来,所有Node上运行的Proxy进程通过APIServer查询并监听Service对象与其对应的Endpoints信息,建立一个软件方式的负载均衡器来实现Service访问到后端Pod的流量转发功能。
三、master和node
1、Master:Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd。
1.1、APIServer: APIServer负责对外提供RESTful的K8s API服务,
它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给
APIServer处理后再提交给etcd。如架构图中所示,kubectl(K8s提供的客户端工具,
该工具内部就是对K8s API的调用)是直接和APIServer交互的。
1.2、schedule: scheduler的职责很明确,就是负责调度pod到合适的Node上。如果把scheduler看成一个黑匣子,
那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定,即将这个pod部署到这个Node上。
K8s目前提供了调度算法,但是同样也保留了接口,用户可以根据自己的需求定义自己的调度算法。
controller manager: 如果说APIServer做的是“前台”的工作的话,那controller manager就是负责“后台”的。
每个资源一般都对应有一个控制器,而controller manager就是负责管理这些控制器的。比如我们通过APIServer
创建一个pod,当这个pod创建成功后,APIServer的任务就算完成了。而后面保证Pod的状态始终和我们预期的一样
的重任就由controller manager去保证了。
1.3、etcd: etcd是一个高可用的键值存储系统,K8s使用它来存储各个资源的状态,从而实现了Restful的API。
2、Node:每个Node节点主要由三个模块组成:kubelet、kube-proxy、runtime。
2.1、runtime
runtime指的是容器运行环境,目前K8s支持docker和rkt两种容器。
2.2、kube-proxy
该模块实现了K8s中的服务发现和反向代理功能。反向代理方面: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上面的所有容器,
但是如果容器不是通过K8s创建的,它并不会管理。本质上,它负责使Pod得运行状态与期望的状态一致。
至此,K8s的Master和Node就简单介绍完了。下面我们来看K8s中的各种资源/对象。
k8s创建pod和service的过程的更多相关文章
- K8s创建pod yaml文件详解
kubernetes创建pod的yaml文件,参数说明 apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 ...
- k8s创建pod流程
kubernetes 创建Pod 的 工作流: step.1 kubectl 向 k8s api server 发起一个create pod 请求(即我们使用Kubectl敲一个create pod命 ...
- CentOS 7 yum安装 k8s 创建Pod一直处于ContainerCreating状态 问题解决
问题描述 使用CentOS7的 yum 包管理器安装了 Kubernetes 集群,使用 kubectl 创建服务成功后,执行 kubectl get pods,发现AGE虽然在不断增加,但状态始终不 ...
- pod(一):Kubernetes(k8s)创建pod的两种方式
目录 一.系统环境 二.前言 三.pod 四.创建pod 4.1 环境介绍 4.2 使用命令行的方式创建pod 4.2.1 创建最简单的pod 4.2.2 创建pod,指定镜像下载策略 4.2.3 创 ...
- k8s的认证和service account简述
k8s的认证: 与API server通信的客户端大致有两类: 1.集群客户端工具(kubectl.kubeadm.kubelet等) 2.集群内pod. 任何客户端访问k8s时的过程: 1.认 ...
- kubernetes/k8s CRI分析-kubelet创建pod分析
先来简单回顾上一篇博客<kubernetes/k8s CRI 分析-容器运行时接口分析>的内容. 上篇博文先对 CRI 做了介绍,然后对 kubelet CRI 相关源码包括 kubele ...
- 12.深入k8s:kubelet创建pod流程源码分析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 在上一篇中,我们知道在kubelet中,工作核心就是围绕着整个syn ...
- k8s中ingress,service,depoyment,pod如何关联
k8s中pod通过label标签名称来识别关联,它们的label name一定是一样的.ingress,service,depoyment通过selector 中app:name来关联 1.查询发布 ...
- k8s组件通信或者创建pod生命周期
Kubernetes 多组件之间的通信原理: apiserver 负责 etcd 存储的所有操作,且只有 apiserver 才直接操作 etcd 集群 apiserver 对内(集群中的其他组件)和 ...
随机推荐
- Fundebug前端JavaScript插件更新至1.8.2,修复2个小BUG
摘要: 修复2个BUG,请大家及时更新. Fundebug前端异常监控服务 Fundebug是专业的程序异常监控平台,我们JavaScript插件可以提供全方位的异常监控,可以帮助开发者第一时间定位各 ...
- 高并发&高可用系统的常见应对策略
解耦神器:MQ MQ是分布式架构中的解耦神器,应用非常普遍.有些分布式事务也是利用MQ来做的.由于其高吞吐量,在一些业务比较复杂的情况,可以先做基本的数据验证,然后将数据放入MQ,由消费者异步去处理后 ...
- poi坑点(springboot)
工作上需要写了一个将数据库数据生成excel表的接口,在此过程中遇到了一些坑点,现在此纪录 PS:一部分可能是因为我没用明白 1. 样式问题 自动调整尽量不要使用,部分列留白过多,空列列宽过窄,可能是 ...
- 【前端_React】npm常用命令
安装模块(包): //全局安装 $ npm install 模块名 -g //本地安装 $ npm install 模块名 //一次性安装多个 $ npm install 模块1 模块2 模块n -- ...
- 使用fio命令查看磁盘iops
具体命令: fio -filename=./localhost.2019-05-08.log -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psy ...
- k8s集群搭建(一)
k8s简介 kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写.是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简 ...
- 字符串比较==和equals的区别
<Stack Overflow 上 370万浏览量的一个问题:如何比较 Java 的字符串?> 比较详细的比较了==和equals方法的区别. 那借此机会,我就来梳理一下 Stack Ov ...
- 复制excel表中的数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- sublime text3中Package Control的安装
手动安装Package Control,亲测有效成功 1.点击https://github.com/wbond/package_control去github下载Package Control安装包下载 ...
- Windbg Register(寄存器)窗口的使用
寄存器是位于在 CPU 的小易失性内存单位. 许多寄存器专用于特定用途,并可用于用户模式应用程序使用的其他寄存器. 基于 x86 和基于 x64 的处理器在有可用的寄存器的不同集合. 如何打开寄存器窗 ...