首页 > 其他分享 >Pod 概念

Pod 概念

时间:2023-02-07 15:58:29浏览次数:34  
标签:容器 RS 一个 创建 我们 概念 Pod pod

那上节课呢给大家讲了一些我们k8s的组件的一些相关的功能,包括它的一些原理性介绍,对吧?那这节课呢大家去看一下我们k8s中最重要的一些技术概念,比如我们的pod的是怎样的?比如我们的网络是怎样去构建的?对吧?这还是很重要的。这个如果不理解的话,在后面我们进行k8s构建的话,你是很难理解的。那今天的内容呢主要分为两个章节,第一个就是我们的pod的概念,什么是pod的?

 

 

 pod这个概念

pod这个概念是开发之中特有的一个新的概念。原来我们是没有接触过的,对吧?所以接下来呢我们要去详细的讲一下什么是pod。以及第二个网络通讯的方式,到底在k8s中pod与pod之间是怎样通讯的?与外部是怎样通讯的?我们都需要把它解决。那我们先看第一个知识点,也就是pod的概念。其实对于pod来说它是有一定的分类的,当然官方并不是这样分类的,在国外的一个博主里面写过这么一句话,就是pod可以分为两种,一个是自主式pod,一个是控制器管理的pod,我觉得他的想法挺不错的,就拿过来去演示了。

那自主式pod的含义,简单来说。就是不是被控制器管理的好的。另一种就是被控制器管理的pod,那如果不是被控制器管理的pod被创建以后,你会发现他一旦死亡的话,就没有人会把他给拉起来,就重启一下,不会也不会把它比如这个pod一旦死了以后,它的副本数是不是就达不到期望值了,也不会有人去创建出来一个新的pod满足他的期望值,这都是就是自主式pod一个缺憾。那第二种是我们的控制器管理的pod那不管怎么说,其实我们现在对pod的概念没有一个太深的认识,那接下来呢我们去带大家去给pod做一下详细的讲解。

 

首先我去创建一个我们的PPT,在传统情况下,比如我们在我们的传统的docker里,在我们的主题上,我去运行一个容器的话,每一个容器都是独立存在的,对吧?通过我们的名称空间进行隔离,每一个容器都有自己的IP地址,每一个容器都有自己的美根,每一个容器都可能有自己的挂载券等等。但在进行K8s移植的时候就不太容易了,比如我想把一个没有在我们呢容器运行过的一个环境,把它转移到或叫迁移到我们的k8s上,就比较难迁移。

 

因为有些软件,比如我们的fpm fpm和我们的PHP之间呢可能有联系,那如果把它给分开了,它两个是不同的地址,我还得去配他的反向代理。比较费劲对吧?那我想给大家描述一种怎样的状态,就是有些组件他们应该在一起,并且还能够直接互相见面,也就是通过localhost的方式可以访问到。但是如果采用的是标准的容器方案的话,你会发现不可以这样做,除非你把两个不同的进程封装在同一个容器内部,或者是这个容器采用了这个容器的网络栈,也可以做到,但是安全性是不是会有隐患?

K 8s呢给我们建立一个新的概念叫pod,pod是怎样实现的?首先我要定义一个pod,那它会先启动第一个容器,这个容器需要注意一下,只要你运行了这个pod这个周期就会被启动,这种就叫pausa听清楚了。只要是有pod这个容器就要被启动。那这个容器启动成功以后,假设我在这个 pod里定义了两个容器,也就是一个pod里会封装很多个容器,一个两个,甚至还可能有3个4个,当然也也可能只有1个,明白我意思吗?

也就是大于=1。然后这两个pod呢会共用 pausa的网络栈,共用它的存储券。我们先讲第一个共用它的网络栈,也就意味着这两个pod没有自己独立的IP地址,它有的都是pausa的,或者说有的只是这个 pausa的地址,他俩之间呢尾根隔离,但是他们的进程不合理,也就意味着如果这里运行的是PHP fpm,这个运行呢是我们nginx,如果nginx的想反向代理到PHP fpm的话,只需要写localhost的冒号9000即可,不需要写什么他的IP地址要加映射啊什么什么乱七八糟一堆,不需要直接localhost就可以访问到他。

 

 


 

原因是这两个容器都共享的是 pausa的网络战。那既然是共享他的那他俩是不是都见面了?也就意味着另一个概念,就是在同一个pod里,容器之间的端口不能冲突,你别这里搞了一个80,这个容器也是80,那这个pod肯定是起不来的,或者是起来以后无限重启,你要知道原因是为什么,能理解我的意思吗?好,这是第一个共享。第二共享,共享的是我们的网络站,假设这个pod挂载了一个存储,pod的挂载的一个存储,那这两个是不是都想去访问到这个网页存储?

 

同理,这个pod也会共享pausa的网页存储,nginx也会共享它的存储,也就意味着在同一个框里,既共享网络,又共享存储券,需要大家注意一下,这就是一个pod的基本概念。

控制器

控制器管理的pod的概念,也就意味着控制器是不是要整理一下?每个控制器有什么特点,他管理的pod有什么特点?那这样的话你在了解每一种以后,你是不是才可能再去做对应的一些选项的时候才才会去做比较匹配的方案。

 

 

 

很好理解,对吧?好,我们先看第一种,replication Controller 简称RC。replicaset 简称rs,deployment.这其实是三种,并不是一种那为什么会把这三种放在一起讲,原因是他们有一定的重合性。我们过来看一下。

 

第一个,replication Controller也就是RC,用来确保容器的应用副本数始终保持在用户定义的部分数上。即如果有容器异常退出,会自动创建新的pod来代替。

讲白了说就是我之前说的那个期望值的概念,假设有一天有个一个pod的死了,那我会创建一个新的pod来满足这个期望值。为什么说是期望值?万一我们现在的资源不够用了,他创建不出来是不是也没办法?对吧?所以说是期望值,而如果异常多出来的容器也会被自动回收,你不能少,但是你也不能多.要刚刚好满足我的期望。在新版本中的k8s建议使用replicaset取代replication Controller。原因是什么?

 

 

他们没有本质区别说了对吧?只是名字不一样。但是 RS支持集合试的selector。我们在创建pod的时候会被它打标签,打标签,比如APP等于阿帕奇,比如version==v1版本,我们会被他打一堆的标签。那当有一天我想删除我们的容器或者做对应的一些设施的时候,我可以这样去说,我说APP等于阿帕奇,当version==v1时候,我要干嘛干嘛干嘛?Rs就支持这种集合方案,但是R C不支持,所以在大型项目的管理中,RS肯定会比RC更简单,更有效更有意义。

 

所以在新版本中,官方抛弃RC全部专用 RS,需要大家注意一下。这是RS和RC的关系,那还有一个deployment对吧?虽然replicaset可以独立使用,但一般还是建议使用deployment来自动管理replicaset,这样无需担心跟其他的机制不兼容,比如不支持 rolling update。就滚动更新。但development的支持滚动更新还是很有意义的,尤其在生态环境中对吧?比如而我现在运行了,运行了两个pod,这炮都用的镜像版本是v1版,我们现在要把这个镜像版本给它改成V2版,那怎么办?

我可以进行一个滚动更新,他先删除一个pod,或者是先多一个pod,它是V2版,然后呢再把这个老旧pod给删除,第一步创建一个新的,第二步删除它,那再创建一个新的。

 

 

好的。镜像也是V2版,这是第三步,第四步把它删除,那这样的话你会发现最终我是不是就会出现一个最新的这么一个版本状态了,对吧?这就是我们滚动更新的含义。RS不支持滚动更新,但是我们deployment的支持,那他支持就支持,为什么要跟我们的RS放在一起去讲解,原因是 development并不负责我们pod创建,它是通过这种机制达到pod创建的,给大家画一下。假设这是一个我们的deployment,deployment在创建出来以后,他会去创建一个RS,也就意味着这个 Rs并不是我们自己定义的,而是deployment的定义的。

 

那 development呢再去负责去创建我们对应的pod。比如这里创建了三个pod,那如果有一天我说了唉 development,你给我更新一下,把镜像更新成V2版本,我们现在写一个v1,所以所以好那他会怎么做呢?它会新建一个RS,比如这个RS可能是-1了,当然它并并不是以-1去标识的,我这里只是随便写了一个。好,关于那这样的话它会把它给起来,就是启动第一个容器,是第二版的第一个容器,那这里会退出第一个。

 

启动第二个容器,这里会退出一个。启动第三个容器,这里会退出一个达到滚动更新的状态,能理解我的意思吧?这样就滚动更新了,并且还可以回滚,什么叫回滚?我如果发现更新到V2版本有一定小bug了,我可以回滚,直接我们的rolling out,唉他就回去了。他会去新建一个老旧版本的v1,v2要删了,以此类推,原因是什么能回滚,原因是deployment在滚动更新以后,这个Rs并不会被删除,而是被停用。

 

当你回滚的时候,他就会把这个老旧版本的RS给它启用。逐渐达到他想要达到的预期状态,这是deployment它的原理。他需要去创建Rs达到创建pod能力,这个需要大家理解一下。我们继续。

hpa

下一个叫hpa简单来说就是我们的平滑的pod,平滑扩散对吧?根据我们的利用率。仅适用于和deployment和RS,在vlalpha版本中支持根据pod的CPU利用率所扩容,也就意味着什么?

 

 

用PPT画,我运行了一个RS,Rs下面管理了两个pod,然后我再定义一个hpa hpa 也是一个对象,需要被定义,那hpa 定义的是基于这个rs去定义了,他怎么写的?当我们的 CPU大于80的时候,那就进行扩展,扩展的最大值是10个,最小值是两个,有这么一种描述方式,也就意味着他会去监控这些pod的当前的资源利用率。

 

 

当他的CPU达到80的时候,他会去新建出来新的pod,直到达到它的最大值。当然如果你建三个pod以后,他的CPU平均利用率已经达到80了,就不会再进行继续创建了。能理解我的意思吧?当创第三个的时候,还在大于等于80,他才会继续向下去创建。一定要理解这里的概念,一旦它的利用率变低以后,这里pod就会被回收,来上一个上一个。但他不能继续少了,因为这里说了最小为2,所以在这种情况下,他就可以给我们达成一个水平自动扩展的这么一个目的。

这也是hpa 可以去实现的。那在我们的阿尔法版中呢还可以根据内存或用户的自定义的一些阀值去进行我们的所谓的扩容说现在还不是一个稳定版,需要大家注意一下。好,在不久的将来我们就可以这样去用了,对吧?那我们继续往后看HPa。

statefullset

 

 

 

下一个叫statefullset。statefullset主要解决的是我们有状态服务问题,为什么说是为了解决有状态服务问题?我们想一下,在刚开始给大家讲docker的时候,我们就知道了,docker它主要面对的是我们的无状态服务,对吧?

我们一直在讲这个概念就是 docker主要面对的是无状态服务,无状态的服务的含义就是没有对应到存储需要去实时的保留,或者是我们把它摘出来以后,那经过一段时间运行以后,我再把它放回去,他依然能够正常访问工作。

 

无状态服务典型的有哪些?比如我们的阿帕奇服务,对吧?比如我们的一些iOS负载均衡调度器,那这些都是无状态服务,那有状态服务更多了,比如mysql,它就是典型的有状态服务,比如mongoDB,他们都需要实时的进行数据的更新以及存储,把它抽离出集群以后,再把他放回来,他就没法正常工作了。这是不是典型的有状态服务?那statefullset就是为了解决我们有状态服务去诞生出来的。它主要有哪些可以去帮我们做到了,第一个叫做稳定的持久化存储,稳定的持续化存储,就是我们pod去死亡以后,我们再调度回来,在调度一个新的pod把它给取代的时候,它的存储依然用到的还是之前的存储,并不会变,并且里面的数据也不会丢失。

 

第二叫稳定的网络标识,之前的pod叫什么,现在pod还叫什么?之前的主机名叫什么?现在的主机名还叫什么?不会变化,防止我们在集群里面对吧?定了一个pod的名称去调用,结果出现了一个新的pod的把它顶替以后,唉名字变了,我需要重新去写入。不需要。它会实时的稳定这么一个网络标识。

第三个有序部署,有序部署会分为扩展和回收阶段,叫有序部署和有序回收。那什么叫有序部署呢?只有当前一个前一个的pod的处于running 和 Ready的状态,就是运行和准备已经就绪了状态。

第二个才可以被创建。为什么这样说?或者为什么需要这种?原因是比如我们去构建一个集群化,比如一个nginx,阿帕奇 mysql。他们的启动顺序的关系应该是先起mysql。在阿帕奇 再nginx,原因是如果我要去先起的是nginx,他是不是反向代理到你的后端阿帕奇,他会判断唉阿帕奇怎么不在,那如果再起阿帕奇的话,他会判断唉mysql怎么不在,所以这里在大型环境中是有一定的启动顺序的,是这个意思吧?那既然有启动顺序,我是不是要定义有序部署?

他第一个起他第二个起,他第三个起,并且在回收的时候,在删除的时候是不是也一样?

 

我们应该先删谁?先删最上层的nginx再删阿帕奇,再删mysql,所以叫有序部署或叫有序回收,这都是statefullset给我们带来的一个特点。当然他只是给我们带来了这些特点,你要真正想去解决有状态服务的话,还需要自己去制定一些功能,那这个过程其实是非常之难的。哪怕到今天为止mysql还不太能够正常的在我们的 k 8s集群,稳定的运行,或者说跟我们在传统的虚拟化里面去运行的话,还是有一定的缺憾的。

 

标签:容器,RS,一个,创建,我们,概念,Pod,pod
From: https://www.cnblogs.com/cj8357475/p/17098635.html

相关文章

  • iOS/OS X内存管理(一):基本概念与原理
    在Objective-C的内存管理中,其实就是引用计数(referencecount)的管理。内存管理就是在程序需要时程序员分配一段内存空间,而当使用完之后将它释放。如果程序员对内存资源使用......
  • Redux 教程2 概述和概念吖
    需要两个插件吖,ReactDevToolsExtensionforChrome和ReduxDevToolsExtensionforChrome(还有forFireFox版本捏)action纯纯对象reducer纯纯函数土木er纯纯......
  • QML概念及框架--继承JavaScript
    QML推荐使用属性绑定和现有的QML元素来创建界面。为了允许执行更高级的行为,QML紧密集成了必要的JavaScript代码。QML中提供的JavaScript环境比在网页浏览器中的更严格。在Q......
  • 理解「业务」与「技术」概念
    技术也好,业务也罢;01【什么是业务?】对于那些久经职场的人,也很难一句话说明白;业务,作为工作中绝对的核心点,即便在一个公司待的足够久,对业务足够熟悉,也很难简单直接的说......
  • Kubernetes:如何实现跨集群节点均匀调度分布Pod(Pod拓扑分布约束)
    写在前面分享一些k8s跨集群节点均匀调度分布Pod的笔记博文内容涉及:pod调度&&拓扑分布约束简单介绍跨节点均匀分布podDemo&&相关配置字段说明多个拓扑分......
  • RBAC模型的概念及技术实现
    RBAC是Role-BasedAccessControl的缩写,含义为基于角色的访问控制模型,此模型是20世纪90年代在美国第十五届全国计算机安全大会上提出的,后逐步被业界广泛使用,至2004年形成了A......
  • Windows安装podman报错:Error: the WSL import of guest OS failed: exit status 0xfff
     执行podmanmachineinit报错: Error:theWSLimportofguestOSfailed:exitstatus0xffffffff 更新下wsl服务https://yvioo.lanzouw.com/iOus30mrzpid下......
  • AJAX概念以及使用
    一、介绍AJAX1.AJAX全称为AsynchronousjavaScriptAndXML就是异步的JS和xml通过AJAX可以在浏览器中向服务器发送异步请求,最大优化:无刷新获取数据二、介绍XML(拓展XM......
  • 3.9.1Cache的基本概念和原理
    @目录一、引子二、工作原理三、局部性原理(1)空间局部性(2)时间局部性(3)总结四、性能分析(1)方案一(2)方案二(3)考题五、块(1)主存(2)Cache(3)补充说明1.术语2.有待解决的问题六、回顾一、......
  • Kubernetes的 pod 重启策略、Pod状态、生命周期
    Pod的重启策略Pod的重启策略指的是当Pod中的容器终止退出后,重启容器的策略。需要注意的是,因为Docker容器的轻量级,重启容器的做法实际上是直接重建容器,所以容器中的数据将会......