一、Pod核心原理

1. Pod是什么?

Pod的特点:封装docker容器的容器

  • 1、有自己的IP地址
  • 2、有自己的hostname

Pod实际上也相当于是一个独立的容器(虚拟机器),而这个pod容器内部封装的是由docker引擎所创建的容器,可以理解为pod就是一个虚拟化分组,pod内部可以存储一个或者多个容器。

2. Pod作用

Pod内部封装的是容器,容器内部运行是开发的应用程序。Pod管理上线的运行的应用程序
定义:在通常情况下,在服务上线部署的时候,pod通常被用来部署一组相关的服务。(什么一组相关的服务?

C:container,容器
Fluentd:日志

一组相关服务: 在一个请求链路上的服务,叫做一组相关服务。通常情况下,这一组相关的服务在调用链路上处于上下游的关系。

经验来说:(可维护的角度)
建议一个pod内部只允许部署一个容器(一个服务)。

日志收集的容器例外

3. 服务集群

问题:服务集群该如何部署????(pod内部运行就是容器,容器中运行的就是服务)

使用kubernetes构建服务集群,只需要创建多个部署了相同服务的pod即可。也就是说k8s可以实现一键式部署,一键式扩容

4. Pod原理

Pod底层核心原理:

  • 1、数据存储
  • 2、网络

POD容器内有一个基础容器 pause容器,它是和pod容器一起创建的
pause容器会构建一个虚拟网卡、挂载一个数据卷
POD中所有容器和pause容器会共享 这个虚拟网卡、和数据卷

在使用了pause容器创建共享网卡后,pod内部容器之间访问就使用localhost访问,就相当于本地访问一样,因此性能非常高。

注意: 一个pod不能分裂存储在多个node节点,但是多个pod副本可以随机分配到不同的node节点进行存储。

二、核心组件原理

1. RC[控制器]

ReplicationController — 副本控制器

用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代,而如果异常多出的容器也会自动回收。

在新版本的 Kubernetes 中建议使用ReplicaSet 来取代ReplicationController

副本控制器作用:永远保证服务数量和预期的数量保持一致。也就是说服务永远不会宕机,服务永不停机,服务永远处于高可用状态。

如果pod全部宕机:全部重新创建

注意:在新版本的 Kubernetes 中建议使用ReplicaSet 来取代ReplicationController

2. RS[控制器]

ReplicaSet

RS 控制器和pod控制架构—副本控制器是如何控制pod副本的??

RS 和 RC 副本控制器到底有和区别?? 为什么要是有RS,不使用RC呢??

  • 1、RC只支持单个标签的选择器
  • 2、RS不仅支持单个标签选择器,还支持复合选择器。

Labels: 标签,是用来唯一标识一个组件的,k8s中所有的资源对象都可以被标签类进行标识。通过标签标识后,方便,灵活的查询到这个组件。

查询一组相同业务pod:
app = MyAPP 此标签可以查询出下面4个pod.这4个pod是一组相关副本的pod. 标签相同,说明是同一个服务部署了多个副本。

标签选择器:

  • 根据标签 key=value 查询与之对应的匹配的资源对象(pod,rs, deployment……)
  • 标签选择器 – 标签 – 选择资源对象 (唯一定位一个资源对象)

复合选择器:支持多个标签选择器
  Selector:
    app = MyApp
    release = stable

注意: 如果单独使用rs,就不支持滚动更新。(在企业中,产品经理不停提出新的需求,项目版本不停的迭代…如何实现不停机更新??)

虽然ReplicaSet可以独立使用,但一般还是建议使用Deployment来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet 不支持 rolling-update 但 Deployment支持)

3. Deployment

Deployment为Pod和ReplicaSet 提供了一个 声明式定义方法,用来替代以前的 ReplicationController 来方便的管理应用。

典型的应用场景:

  • 1、定义Deployment 来创建 Pod 和 ReplicaSet
  • 2、滚动升级和回滚应用
  • 3、扩容和索容
  • 4、暂停和继续 Deployment

Deployment不仅仅可以滚动更新,而且可以进行回滚,如果发现升级到V2版本后,发现服务不可用,可以回滚到V1版本。

Deployment和rs结合使用,支持滚动更新。(发新版,不停机更新)

Deployment管理着RS,RS控制着Pod

滚动更新:新创建的RS,每创建一个新版本的pod会将原来旧的pod删除(更新过程中新旧pod会维持一个比例,最终会全部更新完),最终全更新完后, 旧的RS也是不会删除的,可以用来回滚操作!!旧版本的镜像还是在的。

RS之间的感知,由Deployment控制

资源对象组成关系:

  • 1、deployment部署资源对象,管理rs ,支持滚动更新,更新模式就是新创建一个新的rs,然后由rs创建新的版本的pod.
  • 2、rs副本控制器,控制pod的数量与预期的数量保持一致,rs副本控制器就是来管理pod.

注意:RS是怎么知道哪几个pod受它控制?rs通过标签选择器选择受rs所管理的资源对象。

4. HPA

HPA(HorizontalPodAutoScale) — 自动扩容

Horizontal Pod Autoscaling 仅适用于 Deployment 和 ReplicaSet,在V1版本中仅支持根据Pod的CPU利用率扩容,在vlalpha版本中,支持根据内存和用户自定义的metric扩缩容

HPA也是一个资源对象

5. StatefullSet

Deployment ,StatefulSet都是用来部署服务的。

  • 1、但是deployment被用来部署无状态服务,不适合部署有状态服务。
  • 2、statefulset是用来部署有状态服务的。

StatefullSet 是为了解决有状态服务的问题(对应Deployments 和 ReplicaSets 是为无状态服务而设计),其应用场景包括:

  • 1、稳定的持久化存储,即Pod重新调度后还是能访问的相同持久化数据,基于PVC来实现
  • 2、稳定的网络标志,及Pod重新调度后其 PodName 和 HostName 不变,基于Headlesss Service(即没有 Cluster IP 的 Service)来实现。
  • 3、有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行(即从 0 到 N-1,在下一个Pod运行之前所有之前的Pod必须都是Running 和 Ready 状态),基于 init containers 来实现。
  • 4、有序收缩,有序删除(即从N-1 到 0)

无状态:

  • 1、没有实时的数据需要存储
  • 2、在服务集群网络中,把其中一个服务抽离出去,过一段时间在加入进来,对服务集群没有任何影响。

例如一些业务逻辑服务:

有状态:

  • 1、有实时数据需要存储
  • 2、在服务集群网络中,把其中一个服务抽离出去,过一段时间在加入进来,对服务集群有影响。

ES/MYSQL/Mongodb/……………等都是有状态服务

为什么有状态服务的pod,必须使用statefulSet来进行部署????

前提(本质原因): 副本创建,滚动更新,扩容 ,都是创建一个新的pod。当一个pod宕机后,会重新创建一个新的pod.这个新的pod如何共享之前数据?如果不做任何处理,此时这个新的pod就会丢失之前的数据,对于有状态服务来说,就是灾难。

每个pod都对应一个自己的volum,数据卷
有状态的pod挂了,新创建的pod,它还能找到原来挂掉的pod的数据卷

Statefulset部署有状态服务网络拓扑结构:

Statefulset模式下,pod的数据卷就不是volume,而是两个持久化存储资源对象PVC和PV,PVC下面挂载PV
PV挂载了一个文件服务器,例如nfs文件服务器

即数据是挂载在网络存储上的,当然本地也能存储但是不推荐
PersistentVolumeClaim(持久化卷申明/存储)
PersistentVolume(持久化数据卷)

Statefulset保证数据不丢失根据pod的名称来挂载数据的,也就是说可以让pod的名称永远保持不变,在pod宕机,重新创建后,根据名称找回数据。

6. DaemonSet

DaemonSet确保全部(或者一些 [ node打上污点(可以想象成一个标签),pod如果不定义容忍这个污点,那么pod就不会被调度器分配到这个node ])Node上运行一个Pod的副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除他创建的所有Pod,使用DaemonSet 的一些典型用法:

  • 1、运行集群存储daemon,例如在每个Node上运行glustered,ceph
  • 2、在每个Node上运行日志收集Daemon,例如:fluentd、logstash.
  • 3、在每个Node上运行监控Daemon,例如:Prometheus Node Exporter

Daemonset就是让每一个node节点都运行一个相同的pod.

例如:

7. Job

Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束

Cron Job管理基于时间Job,即:

  • 在给定时间点只运行一次
  • 周期性地在给定时间点运行

8. Volume

数据卷,共享Pod中容器使用的数据。

9. Label

标签用于区分对象(比如Pod、Service),键/值对存在;每个对象可以有多个标签,通过标签关联对象。

Kubernetes中任意API对象都是通过Label进行标识,Label的实质是一系列的Key/Value键值对,其中key于value由用户自己指定。

Label可以附加在各种资源对象上,如Node、Pod、Service、RC等,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。

Label是Replication Controller和Service运行的基础,二者通过Label来进行关联Node上运行的Pod。

我们可以通过给指定的资源对象捆绑一个或者多个不同的Label来实现多维度的资源分组管理功能,以便于灵活、方便的进行资源分配、调度、配置等管理工作。

一些常用的Label如下:(规范,也可以随意定义)

  • 版本标签:“release”:“stable”,“release”:“canary”…
  • 环境标签:“environment”:“dev”,“environment”:“qa”,“environment”:“production”
  • 架构标签:“tier”:“frontend”,“tier”:“backend”,“tier”:“middleware”
  • 分区标签:“partition”:“customerA”,“partition”:“customerB”
  • 质量管控标签:“track”:“daily”,“track”:“weekly”

Label相当于我们熟悉的标签,给某个资源对象定义一个Label就相当于给它大了一个标签,随后可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象,Kubernetes通过这种方式实现了类似SQL的简单又通用的对象查询机制。

Label Selector在Kubernetes中重要使用场景如下:

  • kube-Controller进程通过资源对象RC上定义Label Selector来筛选要监控的Pod副本的数量,从而实现副本数量始终符合预期设定的全自动控制流程;
  • kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立起每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡;
  • 通过对某些Node定义特定的Label,并且在Pod定义文件中使用Nodeselector这种标签调度策略,kuber-scheduler进程可以实现Pod”定向调度“的特性;

各种组件之间的关系,例如 StatefullSet怎么知道自己要管理哪些 ReplicaSet,ReplicaSet怎么知道自己要管理哪些POD,这些都是通过标签、标签选择器 实现的

K8S 快速入门(四)Pod原理、核心组件工作原理相关推荐

  1. kubernetes 菜鸟_菜鸟系列k8s——k8s快速入门(1)

    k8s快速入门 1.快速创建k8s集群 点击教程菜单 1. Create a Cluster -> Interactive Tutorial - Creating a Cluster note: ...

  2. 微信小程序快速入门+四个实战小程序(一)——入门准备

    一)系列达成目标介绍 二)小程序创建的准备 1)注册开发者账号 2)下载编译器 ------------------------------------------------------ 一)系列达 ...

  3. kafka分区与分组原理_Kafka工作原理

    Kafka工作原理 Kafka工作原理 4.1. topic和消息 4.2. Producer 4.3. Consumer 4.4. Kafka核心特性 4.5. consumer.consumer ...

  4. bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...

    bootloader功能介绍 初始化开发板上主要硬件(时钟,内存,硬盘), 把操作系统从硬盘拷贝到内存,然后让cpu跳转到内存中执行操作系统. boot阶段 1.关闭影响CPU正常执行的外设 -关闭看 ...

  5. 冯诺依曼原理计算机称为,冯·诺依曼提出的计算机工作原理又称为 工作原理。...

    冯·诺依曼提出的计算机工作原理又称为 工作原理. 更多相关问题 Y211是一种靠液压动力坐封的封隔器,而Y441或Y445是一种靠机械坐封的封隔器. 美容心理诊断对美容医学的意义 肾功能不全的老年患者 ...

  6. 太阳能电池板原理及工作原理

    本文转载于: http://www.go-gddq.com/html/NYLiYHeHuiShou/2013-04/1117691.htm 太阳能电池板原理及工作原理 随着全球能源日趋紧张,太阳能成为 ...

  7. 电热水器工作过程 c语言,电热水器工作原理—电热水器工作原理及使用注意事项介绍...

    电热水器现在已经成为了一种最为受到消费者喜爱的热水设备,而在我们大家购买电热水器的时候,并不是很了解电热水器,所以今天小编就来为大家介绍一下电热水器的一些工作原理及一些使用中的注意事项,希望可以帮助大 ...

  8. 电子邮件服务器的工作原理,电子邮件工作原理 电子邮件有什么特点呢

    电子邮件是交流信息的一种通信方式,可以用来传输文件和图片,还是非常方便的.很多人对电子邮件的工作原理感到好奇,电子邮件工作原理是怎样的?电子邮件有什么特点呢? 电子邮件工作原理 电子邮件工作原理 电子 ...

  9. [JavaScript][AJAX]onreadystatechange事件;AJAX含义及组成部分;AJAX工作原理/HTTP工作原理;一个页面从输入url到呈现网页过程;FormData对象;防抖

    目录 onreadystatechange事件 AJAX含义及组成部分 AJAX工作原理/HTTP工作原理 一个页面从输入url到呈现网页过程 TCP三次握手图示 渲染引擎渲染网页流程图 ​编辑 Fo ...

  10. Kubernetes(k8s)快速入门和环境部署

    目录 1. Kubernetes介绍 1.1 应用部署方式演变 1.2 kubernetes简介 1.3 kubernetes组件 1.4 kubernetes概念 2. kubernetes集群环境 ...

最新文章

  1. Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)
  2. python程序导入import、规范化和封装自己写的.py文件
  3. Hibernate HQL基础 限定查询条件(这里面有各种条件查询)
  4. c++ 优先队列_C/C++数据结构:队列结构最全解析!带你零基础入门队列结构
  5. 封装自定义的redis切库工具类ByteArrayRedisTemplate,读取byte数组反序列化成List<Object>
  6. 又摊上事了!刹车门还没完,特斯拉或将面临10亿元巨额索赔
  7. java linux命令远程执行_java执行远程服务器上的shell命令
  8. 关于: 为什么要写注释----谈一下个人体会
  9. 百度云同盘在计算机显示不出来的,电脑打不开百度网盘里面的视频如何解决
  10. 微信小程序的转发分享功能
  11. 概念二 python3 中子类继承父类
  12. 编译原理 -- 词法分析程序设计
  13. python你好代码-AI人工智能Python实现简单人机对话:你好,人类
  14. Masonry 比例设置multipliedBy与dividedBy区别
  15. 这篇 python 文章,是过去你错过的 python 细节知识点,滚雪球第4季第15篇
  16. wordcloud安装,又给我来安装失败,嚓
  17. 如何在IDEA配置Tomcat
  18. sqlplus连接的三种方式
  19. window 访问samba提示:无任何网络提供程序接受指定的网络路径
  20. Android UI学习组件概述

热门文章

  1. vue-cli3.0移动端使用的轮播插件
  2. CCS导入项目后中文是乱码
  3. 如何用Gitbook制作电子书?
  4. Java 7 使用TWR(Try-with-resources)完成文件copy
  5. 安卓模拟器右边的虚拟键盘消失了,怎样调出来
  6. VoIP(网络电话)
  7. IDEA快速GUI界面
  8. 基于房屋数据的房价相关性分析(含python代码)
  9. 汽车站订票系统mysql实验_数据库课程设计报告-车站售票管理系统
  10. 【无人驾驶系列十】无人驾驶硬件平台设计