版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Kubernetes现在,就让我们登录到一台Linux机器里,执行一条如下所示令代码1$pstree-代码代码123456789|`-|`-|`- |-{in:imuxsock)S|`-{rs:main||||它的进程组ID(ProcessGroupID,PGID)比如,这里有一个叫作rsyslogd的程序,它负责的是Linux操作系统里的日志处理。可以看这些进程相互协作,共同完成rsyslogd程序的职责。对于操作系统来说,这样的进程组更方便管理。举个例子,LinuxKubernetesKubernetes项目之所以要这么做的原因,我面介绍Kubernetes和Borg的关系时曾经提到过:在Borg项目的开发和实践过程中,公司的工程师们发现,他们部署的应用,往我还是以前面的rsyslogd为例子。已知rsyslogd由三个进程组成:一个imklog模块,一个imuxsockrsyslogdmain器上,否则,它们之间基于Socket的通信和文件交换,都会出现问题。须被分别制作成三个不同的容器。而在这三个容器运行的时候,它们设置的内存都是1而是指容器没有管理多个进程的能力。这是因为容器里PID=1的进程就是应用本身,其他的进程都是这个PID=1进程的子进程。可是,用户编写的应用,并不能够像正常操作系统里的init进程或者systemd你的应用是一个JavaWeb程序(PID=1),然后你执行dockerexec在启Nginx(PID=3)Nginx假设我们的Kubernetes集群上有两个节点:node-13GB可用内存,node-22.5DockerSwarmrsyslogd同一台机器上,我就必须在另外两个容器上设置一个affinity=main(与main容器有亲密性)的约束,即:它们俩必须和main容器运行在同一台机器上。然后,我顺序执行:“dockerrunmain”“dockerrunimklog”和“dockerSwarmmainimklog队并被调度到了node-2上(这个情况是完全有可能的)。imuxsockSwarm:node-20.5GBimuxsockaffinity=mainimuxsock器又只能运行在node-2上。比如,Mesos(resourcehoarding)的机制,会在所有设置了约束的任务都达到时,才开始对它们统一进行调度。而在 KubernetesPodKubernetes度单位。这就意味着,KubernetesPodimklog、imuxsockmain函数主进程这样的三个容器,正是一个典型的由三个容Pod。Kubernetes3GBnode-1点进行绑定,而根本不会考虑node-2。特征包括但不限于:互相之间会发生直接的文件交换、使用localhost或者Socket文件进行本地通信、会发生非常频繁的调用、需要共享某些LinuxNamespace(比如,一个容器要加入另一个容器的NetworkNamespace)等等。这也就意味着,并不是所有有“关系”的容器都属于同一个Pod。比如,PHP应用容器和两个Pod。对于初学者来说,一般都是先学会了用Docker这种单容器的工具,才会开始接触Pod。Pod没错,如果只是处理“超亲密关系”这样的调度问题,有Borg和 Kubernetes为了理解这一层含义,我就必须先给你介绍一下Pod的实现原理。PodCgroups,而并不存在一个所谓的Pod的边界或者环境那么,Pod一个Volume。A、BPod,不就是等同于一个容器(A)共享另外一个容器(容器B)的网络和Volume的玩儿法么?这好像通过dockerrun--net--volumes-from这样令就能实现嘛,比如代码1$dockerrun--net=B--volumes-from=B--name=Aimage-ABAPodKubernetesPodInfra在这个Pod中,Infra容器都是第一个被创建的容器,而其他用户定义的容器,则通过JoinNetworkNamespace的方式,与Infra容器关联在一起。这样的组织关系,可以用下面Pod里有两个用户容器AB,还有一个Infra的容器,解压后的大小也只有100~200KB左右。InfraHoldNetworkNamespaceInfra这也就意味着,对于Pod里的容器ABlocalhostInfraPodIPPodNetworkNamespaceIP地址;当然,其他的所有网络资源,都是一个Pod一份,并且被该Pod中的所有容器共享;Pod的生命周期只跟Infra容器一致,而与容器A和B无关。而对于同一个Pod里面的所有用户容器来说,它们的进出流量,也可以认为都是通过Infra容PodNetworkNamespace,而不是每一个用户容器如何使用你的网络Infra容器镜像的rootfs里几乎什么都没有,没有你随意发挥的空间。当然,这同时也意味着你的网络插件完全不必关心用户容器的启动与否,而只需要关注如何配置Pod,也就是Infra的NetworkNamespace即可。VolumeKubernetesVolume都设计在Pod层级即可。这样,一个Volume对应的宿主机 对于Pod来说就只有一个,Pod里的容器只要挂载这个Volume,就一定可以共享这个Volume对应的宿主机 代码代码123456789apiVersion:kind:Podname:two-:-name:shared-path:/data--name:nginx-image:nginxname:shared-mountPath:/usr/share/nginx/htmlname:debian-containerimage:debianname:shared-datamountPath:/pod-datacommand:args:["-c",ofromthedebian>/pod-在这个例子中,debian-container和nginx-container都挂载了shared-data这个Volume。而shared-data是hostPath类型。所以,它对应在宿主机上的 这就是为什么,nginx-container可以从它的/usr/share/nginx/html container生成的index.html文件的原因。Pod能并不相关的应用时,应该优先考虑它们是不是更应该被描述成一个Pod里的多个容器。第一个最典型的例子是:WAR包与Web服务器。我们现在有一个JavaWeb应用的WAR包,它需要被放在Tomcat的webapps Docker法是,把WAR包直接放在Tomcat镜像的webapps下,做成一个新的镜像运WARTomcat另法是,你压根儿不管WAR包,只发布一个Tomcat容器。不过,这个容器的webapps,就必须一个hostPath类型的Volume,从而把宿主机上的WAR包挂载进Tomcat容器当中运行起来。不过,这样你就必须要解决一个问题,即:如何让每一台宿主机,都预先准备好这个有WAR包的呢?这样来看,你只能独立一套分布实际上,有了Pod之后,这样的问题就很容易解决了。我们可以把WAR包和Tomcat分别做PodPod代码代码apiVersion:kind:name:javaweb--image:name:command:["cp","/sample.war",-mountPath:name:app-volume-image:name: mountPath:/root/apache-tomcat-7.0.42-v2/webappsname:app-volumecontainerPort:hostPort:8001-name:app-emptyDir:Podgeektime/sample:v2,这个镜像里只有一个WAR包(sample.war)放在根下。而第二个容器则使用的是一个标准的Tomcat镜像。不过,你可能已经注意到,WAR包容器的类型不再是一个普通容器,而是一个Init在Pod中,所有InitContainer定义的容器,都会比spec.containers定义的用户容器先启InitContainerWARcp/app",把应用的WAR包拷贝到 而后这个 ,就挂载了一个名叫app-volume的VolumeTomcatwebappssample.warWARVolumeVolumeWARTomcatPodTomcatWARWARInitContainerWAR包容器,扮演了一个sidecar的角色。比如,我现在有一个应用,需要不断地把日志文件输出到容器的/var/log 这时,我就可以把一个Pod里的Volume挂载到应用容器的/var/log 然后,我在这个Pod里同时运行一个sidecar容器,它也挂载同一个Volume到自己 日志文件,转发到MongoDB或者Elasticsearch中起来。这样,一个最基本的日志收集sidecarVolume但记,Pod的另一个重要特性是,它的所有容器都共享同一个NetworkNamespace。这就使得很多与Pod网络相关的配置和管理,也都可以交给sidecar完成,而完全无须用户容器。这里最典型的例子莫过于Istio这个微服务治理项目了。总在本篇文章中我重点了Kubernetes项目中Pod的实现原理实际上,一个运行在虚拟机里的应用,哪怕再简单,也是被管理在systemd或者supervisordPod然后,你就可以把整个虚拟机想象成为一个Pod,把这些进程分别做成容器镜像,把有顺序关InitContainer。这才是更加合理的、松耦合的容器编排诀窍,也是从传统应注意:Pod这个概念,提供的是一种编排思想,而不是具体的技术方案。所以,Pod行在这个虚拟机里。比如,Mirantis公司的virtlet项目就在干这个事情。甚至,你可以去实现一个带有Init进程的容器项目,来模拟传统应用的运行方式。这些工作,在Kubernetes中都是非常轻松的,也是我们后面讲解CRI时会提到的内DockerInDocker思考NetworkNamespacePodNamespace这些Namesapce的具体应用场景吗?归科技所有 痛快,每一篇都鞭辟入里。
精选留言
段帅 这文章读起来像吃脆苹果,爽,这是我订阅专栏中写的最好的,没有之一作者回复这是我见过最形象的评论…… 重要理解了这个概念,透透透!不但解决了我前几天war和tocat做一起,完成镜像的频繁打包问题,而且还想到怎么用pppeteer做一个ntcotaner,然后注入到odejs主容器,从而解决chroehedess太大不容易安装的问题,爽爽爽!刘 好专栏啊,再写成书继续支持小新是 war包跟tomcat这个栗子举得恰到好处啊虎虎❤ 讲的真的用心,水平也高。被圈粉,希望一直能出专栏。您一定有一票粉丝支持和跟随的!继续加油。 容器不能管理多进程那块,能不能每个容器都默认搬一套系统的nt过去,而不要让普通应用进程做进程1,这样是不是就可以支持容器里面管理多进程了?作者回复对。不过我们现在讲的古典互联网技术不太建议这么做,这是原始互联网时代的思路。 pod是一个小家庭,它把密不可分的家庭成员(container)聚在一起,Infracontainer则是家长, 容器与容器是的,只是有些容器更加——超亲密关系的 读老师您的文章有种海边拾宝的感觉,时不时蹦出来个好看的贝壳,让人兴奋不已IOVE.- 请问,sdecar这种用itcotner的方式和后面讲到的sttelset的改变拓扑状态,有什么区别么?作者回复没什 在ode节点上一直看到有这个镜像,搞不懂是干嘛的如今一看豁然开朗北 如果把war独立出来做一个镜像的话,应该用什么做基础镜像呢?我现在做镜像的时候通常都是用debian做基础镜像,但如果只是为了这个.war包的话,作者回复市面上的小镜像多的很啊,Eddie 此专栏追到现在,老师用通俗的语言阐述了k8s的原理的同时也极力推崇k8s。我在学习使用的过程中也确实体会到了其各种优势。但是反过来想,老师是否可以简单举两个例子说下k8s目前为止依然存在的一些缺陷和不足呢?方便我们在应用过程中加以注意。作者回复不足之处肯定要在具体剖析特性的时候才会讲到。另外,这Kbenetes可不是推崇的问题,你会觉得我在推崇Lux吗? 以前看博客文章,都是哎呀妈呀脑瓜疼脑瓜疼,现在终于不疼了不疼了 非常好,请教一个问题,你之前说比如HP和MySL最好分在不同的pod,很可能就是不同的ode上了,那么对于atency非常敏感的比如cace,像redis和一个webserver是不是做成不同的cotaner部署在一个pod里面合适呢?作者回复取决于1.高可用考虑2.别的pod是不是也要用这个择 偶像,那pod有和虚拟机在类比时又有什么不同呢,还是没什么不同?作者回复只是 关于升级ar和toct那块,也是先修改yl?然后benertes执行升级命令,pod会重新启动,生产也是按照这种方式吗?作者回复对,initcontainer就是干这个的 关于部署ar包和toct,在升级ar的时候,先修改yl,然后bernets会重启整个pod,然后按照定义好的容器启动顺序流程走下去?正常生产是按照这种方式进行升级的吗?假装 张老师,数据库和war包是单独的pod,那么应用的数据库是否可以动态配置呢作者回复仔细看,是单独的容器…… 刚下班不久,看到张老师的文章很是开心,文章从“设计思想/理念”上来剖析为何k8s要引 cetos7benetescrcontnedatutie,经过实践,在一个pod中有两个业务容器,两个业务容器会共享use容器除了daepace外所有名空间 为什么说“DockerinDocker”这种方式在生产环境后患无穷呀?作者回复因为是坑的二次方 对于war包这个例子还有点不明白,war包这个 ,就挂载了一个名叫app-难道可以创建一个没有任何对应的volume么作者回复任何volume对应的都是宿主机啊IOVE.- 老师,咨询个事情。现在哪些地方能考CKA呢?费用是多少呢?有年限限制的么作者回复
架构指 醍醐灌顶J.P. 看了不少k8s的,学习这个课程后终于清晰薛定谔的指南 两个例子都非常经典,尤其是tocat和ar包的例子,感觉看完了以后容器技术立马涨了一大截,赞王亚 不得不说,真是良心之作。作者回复 讲的 在与大家交流时,会听到pod的两种发音(“破的”,“怕的”),有时实在尴尬,不清除到底谁读错了。查过字典之后,实际是英美的区别(英pɒdp:d]),我听作者也是以英式发音,作者在与海外开发者接触的时候,他们也都是以英式发音为主吗?作者回复这个按自己喜欢的方式就好,比如etcd的读法 不好意思,还是我,您的回复我没看懂。我的问题有两一个Pod里是否可以只有initcontainer,没有用户容器?作者回复是。不可以。建议重新理解一下我之前的回复蜗 war包的例子并没有解决频发打包的问题吧?wa包变动后,geektime/sample:v2包仍然需要重新打吧.这和东西一股脑装在tomcat中后,重新打tomcat并没有差太多吧?作者回复你忽略了Tomcat的镜像也是会变更的啊。另外,我只提供了一个最佳实践的思路给你,具体的方案应该你自己根据需求自己设计。比如,如果你的toct镜像从来就几乎没更新过,那干脆 老师好,对于"第二个例子initcontainer必须早于用户容器启动,而且必须要完成并退出后才会启动用户容器。如果属于,那它必须要等sidecar容器运行完成并退出后才能会运行应用容器,接着产生新的日志。而此时sdecar容器已经停止运行,如何能把新的日志转发出去呢?如果不属于,也是initcontainer,那么启动顺序是先启动产生日志的容器,再运行转发日志的一个Pod是否可以没有用户容器,只有init作者回复pod里的容器当然没有顺序关系了,需要的话要在启动命令里做前置检查。米斯特. 确实深入浅出,除了学习技术本身以外,老师讲解的技术的方式方法也很值得学习天 非常洛子 完美解决war和tomcat做一起,完成镜像的频繁打包问题!而且占据空间太大 作者回复不能球场 讲的很清楚。 我在工作中pod下都是同一种类型的容器,只是启动多个实际,需求上没有用到在一个pod上 思路清晰,重点突出,生动形象!买了容器与容器云这本书,配合专栏一起看!w 请教下,“比如,Mesos中就有一个资源囤积(resourcehoarding)的机制,会在所有设置了Affinity约束的任务都达到时,才开始对它们统一进行调度”中的任务都达到是什么意思,不大明白这是个怎样的机制。提到的死锁又会在什么情况下发生。作者回复从调度队列出队啊。比如一个容器始终没出现杨孔 老师,帮忙看下,我按照官网和den:User\"system:anonymous\";也按照上面blog的方案将添加到个人,但证书提示没有足够的信息无法验证该;不知道有什么替代的方案,也试过--anonymous-auth=false,但如blob的作者所说,的确会造成api-server的不稳定杨孔 求助下,哪位大神可以帮忙看下,我按照官网和 04hetcd-kiehls51/1Running04hkube-apiserver-kiehls51/1Running035mkube-flannel-ds-6rrkn1/1Running03hkube-flannel-ds-f8t5p1/1Running04h -6xgmn1/1Running03h -rm2vr1/1Running03h -sqprf1/1Running04hkube-scheduler-kiehls51/1Running34hmonitoring-grafana-69d5b8cc5-knw8z1/1Running03hmonitoring-influxdb-5fdb58bd4b-fjwjs1/1Running0 者B了,k8s怎么收到failuremessage并且重新去部署Pod呢作者回复不需要什么message,请关注后续的控制器模式 Pod里的容器还可以共享PIDNamespace,IPCasdf100 动。并且,InitContainer容器会按顺序逐一启动,而直到它们都启动并且退出了,用户容器这里的initContainer容器是在启用完后,【会被自作者回复 所谓一个容器就是一个进程,意思是说我们在容器化某个应用时应该针对一个进程封装为一个容器镜像,然后以pod方式组织起来,这是推荐的容器化应用的实现方式。然而我们也可以将一个容器当做一个虚拟机来使用,将该应用的所有组件打包为一个复杂的容器镜像然后在kbenets里通过pod方式启动,只不过这样的话应用的组件之间耦合性太高,不好,例如,当我们要升级某个组件时必须重新制作这个复杂的镜像;如果要只对应用的某个组件扩容也是不可能实现的。我的理解没错吧 从事Linux运维工作多年,有一点一直有点不明白,这里到底谁挂载到谁上面-mountpath:/app文中有有这句话说"而后这个 ,就挂载了一个名叫app-volume的 ---Tomecat容器同样了挂载app-volume到自己的 mount-txxfssrc_dir比如:mount-txfs/dev/sda/opt/app上面的挂载的app-volume到底是设备还是文件,或者是去的一个别名?作者回复volume的挂载是bindmount,不是设备,它的功能就是把文件或绑定挂载在一起,所以你这里的纠结谁在谁上面是没有意义的……唯一需要明确的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 加工课课件教学课件
- 幼师课件用电教学课件
- 2024年国际旅游开发与合作合同
- 2024年广州市二手房交易合同(标准版)
- 2024年度智能制造设备采购合同
- 2024年度物业公司居民关系协调服务合同
- 2024年大数据中心合作运营合同
- 2024年工程质量检验与确认合同
- 鱼罐头课件教学课件
- 2024年库房租赁与健身器材存放合同
- 香菇种植示范基地项目可行性策划实施方案
- 混凝土硫酸盐侵蚀基本机理研究
- 《机械设计基础A》机械电子 教学大纲
- 水工岩石分级及围岩分类
- 基因扩增实验室常用仪器使用课件
- 斜井敷设电缆措施
- 施工机械设备租赁实施方案
- 牙膏产品知识课件
- 液化气站人员劳动合同范本
- 第一章 教育政策学概述
- 常见土源性寄生虫演示文稿
评论
0/150
提交评论