深入剖析kubernetes 13我们需要_第1页
深入剖析kubernetes 13我们需要_第2页
深入剖析kubernetes 13我们需要_第3页
深入剖析kubernetes 13我们需要_第4页
深入剖析kubernetes 13我们需要_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

讲 深入剖析 文章详13|为什 |0:0/ 需要Pod0 详细介绍了在Kube es里部署一个应用的过程。在这些讲解中, 了这样一个知识点:Pod,是Kube es项目中最小的API对象。如果换一个更专业的说0法 可以这样描述:Pod,是 相信你在学习和使用Kube 会需要Pod?是啊,面已经花了很多精力去解读Linux容器的原理、分析了Docker容器的本质,终于,“Namespace做,Cgroups做限制,rootfs做文件系统”这样的“三句箴言”可以朗朗上口了,为什么Kubees项目又突然搞出一个Pod来呢? es 登录到一台Linux机器里,执行一条如下所示令1$pstree-123456789 |`-|-)|`-|-|-|`-||-{in:imuxsock)S|`-{rs:main|||||-|-|-|-它的进程组ID(ProcessGroupID,PGID)比如,这里有一个叫作rsyslogd的程序,它负责的是Linux操作系统里的日志处理。可以看到,rsyslogdmainimklog1632这些进程相互协作,共同完成rsyslogd程序的职责。对于操作系统来说,这样的进程组更方便管理。举个例子,Linux而Kubees项目所做的,其实就是将“进程组”的概念映射到了容器技术中,并使其成为了Kubees项目之所以要这么做的,面介绍Kubees和Borg的关系时曾经提到过:在Borg项目的开发和实践过程中,公司的工程师们发现,他们部署的应用,往还是以前面的rsyslogd为例子。已知rsyslogd由三个进程组成:一个imklog模块,一个imuxsockrsyslogdmain器上,否则,它们之间基于Socket的通信和文件交换,都会出现问题。 须被分别制作成三个不同的容器。而在这三个容器运行的时候,它们设置的内存都是1而是指容器没有管理多个进程的能力。这是因为容器里PID=1的进程就是应用本身,其他的进程都是这个PID=1进程的子进程。可是,用户编写的应用,并不能够像正常操作系统里的init进程或者systemd那样拥有进程管理的功能。比如,你的应用是一个JavaWeb程序(PID=1),然后你执行dockerexec在启动了一个Nginx进程(PID=3)。可是,当这个Nginx进程异常的时候,你假设的Kubees集群上有两个节点:node-13GB可用内存,node-22.5这时,假设要用DockerSwarmrsyslogd程序。为了能够让这三个容器都运行在同一台机器上,就必须在另外两个容器上设置一个affinity=main(与main容器有亲密性)的约束,即:它们俩必须和main容器运行在同一台机器上。然后 顺序执行:“dockerrunmain”“dockerrunimklog”和“dockerSwarmmainimklog队并被调度到了node-2上(这个情况是完全有可能的)。imuxsock,Swarmnode-20.5GBimuxsockaffinity=mainimuxsock器又只能运行在node-2上。比如,Mesos中就有一个资源囤积(resourcehoarding)的机制,会在所有设置了Affinity约束的任务都达到时,才开始对它们统一进行调度。而在Omega 但是,到了Kubees项目里,这样的问题就迎刃而解了:Pod是Kubees里的原子调度单位。这就意味着,Kubees项目的调度器,是统一按照Pod而非容器的资源需求进行imklog、imuxsockmainPod。Kubees3GBnode-1点进行绑定,而根本不会考虑node-2。像这样容器间的紧密协作,可以称为“超亲密关系”。这些具有“超亲密关系”容器的典型特征包括但不限于:互相之间会发生直接的文件交换、使用localhost或者Socket文件进行本地通信、会发生非常频繁的调用、需要共享某些LinuxNamespace(比如,一个容器要加入另一个容器workNamespace)等等。这也就意味着,并不是所有有“关系”的容器都属于同一个Pod。比如,PHP应用容器和两个Pod。对于初学者来说,一般都是先学会了用Docker这种单容器的工具,才会开始接触Pod。而如果Pod的设计只是出于调度上的考虑,那么Kube Pod es不过,Pod在Kube 就必须先给你介绍一下Pod的实现原理。Pod也就是说 Cgroups,而并不存在一个所谓的Pod的边界或者环境一个Volume。A、BPod,不就是等同于一个容器(A)共享另外一个容器(容器B)的网络和Volume的玩儿法么?这好像通过docker --volumes-from这样令就能实现嘛,比如1$docker=B--volumes-from=B--name=Aimage-ABAPod所以,在Kube es项目里,Pod的实现需要使用一个中间容器,这个容器叫作Infra容器。在这个Pod中,Infra容器都是第一个被创建的容器,而其他用户定义的容器,则通过 workNamespaceInfra如上图所示,这个PodAB,还有一个Infra 的容器,解压后的大小也只有100~200KB左右。而在Infra容器“HoldworkNamespace后,用户容器就可以加入到Infra容器(这个Namespace文件的路径, PodABInfra一个Pod只有一个IP地址,也就是这个PodworkNamespace对应的IP地址;当然,其他的所有网络资源,都是一个Pod一份,并且被该Pod中的所有容器共享;Pod的生命周期只跟Infra容器一致,而与容器A和B无关。而对于同一个Pod里面的所有用户容器来说,它们的进出流量,也可以认为都是通过Infra容Kubees虑的是如何配置这个PodworkNamespace,而不是每一个用户容器如何使用你的网络Infra容器镜像的rootfs里几乎什么都没有,没有你随意发挥的空间。当然,这同时也意味着你的网络插件完全不必关心用户容器的启动与否,而只需要关注如何配置Pod,也就是Infra容器workNamespace即可。有了这个设计,共享Volume就简单多了:Kube es项目只要把所有Volume的定义都设计在Pod层级即可。这样,一个Volume对应的宿主机 对于Pod来说就只有一个,Pod里的容器只要挂载这个Volume,就一定可以共享这个Volume对应的宿主机 123456789apiVersion:kind:Podname:two-:-name:shared-path:/data--name:nginx-image:name:shared-mountPath:/usr/share/nginx/htmlname:debian-containerimage:debian name:shared-datamountPath:/pod-datacommand:args:["-c",ofromthedebiancontainer>/pod-在这个例子中,debian-container和nginx-container都挂载了shared-data这个Volume。而shared-data是hostPath类型。所以,它对应在宿主机上的 这就是为什么,nginx-container可以从它的/usr/share/nginx/html 中,到debian-container生成的index.html文件的。明白了Pod的实现原理后 能并不相关的应用时,应该优先考虑它们是不是更应该被描述成一个Pod里的多个容器。第一个最典型的例子是:WAR包与Web服务器。现在有一个JavaWeb应用的WAR包,它需要被放在Tomcat的webapps 法是,把WAR包直接放在Tomcat镜像的webapps下,做成一个新的镜像运WARTomcat另法是,你压根儿不管WAR包,只发布一个Tomcat容器。不过,这个容器的webapps,就必须一个hostPath类型的Volume,从而把宿主机上的WAR包挂载进Tomcat容器当中运行起来。不过,这样你就必须要解决一个问题,即:如何让每一台宿主机,都预先准备好这个有WAR包的呢?这样来看,你只能独立一套分布实际上,有了Pod,这样的问题就很容易解决了。可以把WAR包和Tomcat分别做PodPodapiVersion: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:在这个Pod中,定义了两个容器,第一个容器使用的镜像是geektime/sample:v2,这个镜像里只有一个WAR包(sample.war)放在根下。而第二个容器则使用的是一个标准的Tomcat镜像。不过,你可能已经注意到,WAR包容器的类型不再是一个普通容器,而是一个Init在Pod中,所有InitContainer定义的容器,都会比spec.containers定义的用户容器先启所以,这个InitContainer类型的WAR包容器启动后 执行了一句"cp/app",把应用的WAR包拷贝到 而后这个 ,就挂载了一个名叫app-volume的VolumeTomcatwebappssample.warWARVolumeVolume 就用一种“组合”方式,解决了WAR包与Tomcat容器之间耦合关系的问题。顾名思义,sidecar指的就是 比如,在的这个应用Pod,Tomcat容器是要使用的主容器,而WAR包容器的存WARInitContainerWAR包容器,扮演了一个sidecar的角色。 现在有一个应用,需要不断地把日志文件输出到容器的/var/log 就可以把一个Pod里的Volume挂载到应用容器的/var/log 在这个Pod里同时运行一个sidecar容器,它也挂载同一个Volume到自己 日志文件,转发到MongoDB或者Elasticsearch中起来。这样,一个最基本的日志收集sidecarVolume但记,Pod的另一个重要特性是,它的所有容器都共享同一workNamespace。这就使得很多与Pod网络相关的配置和管理,也都可以交给sidecar完成,而完全无须用户容器。这里最典型的例子莫过于Istio这个微服务治理项目了。Istiosidecar备注:Kubees在本篇文章 重点了 es项目中Pod的实现原理Pod是Kube 实际上,一个运行在虚拟机里的应用,哪怕再简单,也是被管理在systemd或者supervisord什么,从物理机到虚拟机之间的应用迁移,往往并不。Pod然后,你就可以把整个虚拟机想象成为一个Pod,把这些进程分别做成容器镜像,把有顺序关InitContainer。这才是更加合理的、松耦合的容器编排诀窍,也是从传统应注意:Pod这个概念,提供的是一种编排思想,而不是具体的技术方案。所以,Pod行在这个虚拟机里。比如,Mir公司的virtlet项目就在干这个事情。甚至,你可以去实现一个带有Init进程的容器项目,来模拟传统应用的运行方式。这些工作,在Kubees中都是非常轻松的,也是后面讲解CRI时会提到的内DockerInDocker除workNamespace外,Pod里的容器还可以共享哪些Namespace呢?你能说出共享这些Namesapce的具体应用场景吗?

重要理解了这个概念,透透透!不但解决了前几天war和tomcat做一起,完成镜像的频从而解决chromeheadless太大不容易安装的问题,爽爽爽! 8 长,掌管家通资源,家庭成员通过sidecar方式互帮互助,其乐融融~ 如今一看豁然开朗 Eddie 前为止依然存在的一些缺陷和不足呢?方便在应用过程中加以注意。 务容器,两个业务容器会共享Pause容器除了Pi mespace外所有名空间

J.P. 0 底谁读错了。查过字典,实际是英美的区别(英[pɒd],美[pɑ:d]),听作者也是以英 新打吧.这和东西一股脑装在tomcat中后,重新打tomcat并没有差太多吧? w 不大明白这是个怎样的机制。提到的死锁又会在什么情况下发生。 老师,帮忙看下,按照官网和den:User\"system:anonymous\";也按照上面blog的方案将添加到个人,但证th=false,但如blob的作者所说,的确会造成api-server的不稳定 按照官网和 ,使用kubeadm的方式部署了k8s;coredns-78fcdf6894-btftn1/1Running04hetcd-kiehls51/1Running04hkube-apiserver-kiehls51/1Runn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论