Pod的类型有如下两个:
以下是Pod的控制器类型:
假设我们创建了一个Deployment,它会去创建一个ReplicaSet,也就意味着这个ReplicaSet并不是我们自己定义的,它是由Deployment定义的,那ReplicaSet再去创建我们对应的Pod,先创建3个Pod,如果有一天跟Deployment说,把镜像给我更新成v2版,它会怎么做呢?

它会创建一个ReplicaSet,它会先启动第一个容器,镜像为v2版,然后退出一个v1版的容器,启动第二个容器v2版,会退出一个v1版的容器,启动第三个容器v2版,退出一个v1版的容器,达到滚动更新。

并且还可以回滚,比如v2版本有一些bug,它会去新建老旧版的v1版,然后删除新版的v2,依次类推,当回滚的时候,它并不会把老旧版本删掉,而是禁用,回滚的时候会启用老旧版本,达到回滚的目的。

例如,我现在运行了一个ReplicaSet,ReplicaSet下面管理了两个Pod,然后我再定义一个HPA(HPA也是一个对象,需要被定义),HPA定义的是基于ReplicaSet去定义的,当我们的CPU大于80的时候,那就进行扩展,最大值是10个,最小值是2个,这是一种描述方式,cpu > 80;Max 10;Min 2。也就意味着HPA会去监控当前Pod的资源利用率,当CPU利用率达到80的时候,它会去新建Pod,直到达到它的最大值,当然,它创建了3个Pod的CPU利用率已经达不到80%了,它就不会创建了,当每创建一个时,它如果还是大于80%,它才会去创建,一旦Pod的CPU利用率变低了以后,Pod就会被回收,保持到最小值,所以这就达到了一个水平扩展的效果。

客户端想要去访问一组Pod,记住是一组Pod,如果这些Pod不相干的话,是不能通过我们的service去代理的,那Pod必须要有相关性,比如说是我们的ReplicaSet、ReplicationController、Deployment创建的或者说有同一组标签,那都可以被我们的service所收集到,这些又衍生出来一个含义,service去收集这些Pod是通过我们的标签去选择到的。选择到以后,service会有自己的一个IP+端口,那我们访问service的IP+端口就会间接的访问到我们的Pod服务,并且这里是有一个RR(轮询)算法存在的,访问Pod1、Pod2、Pod3依次类推。


假如我有一套上面架构图的集群,也就意味着,首先我要构建一个apache的集群,再构建一个mysql的集群,再构建一个squid的集群,然后再构建一个LVS,如果我想把这个架构放在K8S里运行的话,我们来看一下需要几步:第一步:mysql要先运行成一个Pod,当然我们mysql现在放在我们K8S中,放在我们的StatefullSet控制器里是可以做到的,但是集群化的话,不是那么方便,mysql封装完以后。
我们还有apache+fpm,既然有这么多节点,我们之前学过控制器,我们是不是可以在Deployment上去创建,也就是说我创建一个Deployment,Deployment会指定它的副本数目,指定3个副本,那这样的话就有三个不同的apache+fpm的Pod的存在了。
再往上会有三个squid,那么squid是不是也可以把它封装成Pod,通过控制器把它给控制,那LVS就可以靠我们集群本身的一个功能把它负载调度,那这样的话,会出现一种结构,你会发现不太好写,squid要写反向代理的话需要写三台机器,并且我们之前说过一个概念,Pod在退出以后,在重新建立以后,这个IP地址会变换对吧,除非你采用的是StatefullSet,但是在php-fpm里面是不是没有意义啊,所以怎么办呢?我们就可以在前端,在前面加一个service,这个service就是php-fpm的service,它会绑定php-fpm的标签,选择进行绑定,那squid想要进行反向代理的话就不需要去写php-fpm这3台php-fpm的地址了,因为我们一直在强调这个概念,php-fpm一旦死亡以后,我们控制器也会把它维持在3个副本,它会创建一个新的副本来取代死亡的副本,那取代它的副本跟现在的副本,它的IP是不一样的,那squid在里面填写的是它的目标IP的话,那就会出现问题,副本一换的话,我们squid里面的配置是不是得重新写,要重新修改,重启服务,这样不太友好,所以我们的squid里面写的是service php-fpm的地址,那这样的话,squid只需要指定到我们的service即可,并且php-fpm是一个Pod,mysql也是一个Pod,它们之间肯定会出现一定的关联,比如我们把我们的mysql部署在StatefullSet里面,那它的名称是不是就不会变啊,那我可以通过它的名称,去固定到我们对应的Pod上面,因为我之前提到过,K8S内部是一个扁平化的网络,那容器之间是能够互相访问的,所以这样我php-fpm里面写它的地址信息是没有问题的,那对于这三台squid来说,外网用户要访问对吧,我可以创建个service,已知绑定squid,通过去判断我们的squid的一些标签进行确定,那这样的话我们只需要把service暴露到外部即可,service其中有一种暴露模式叫NodePort,比如还可以通过我们的Ingrees等一些方案都可以做到,那这样的话我们就可以把这个架构完整的部署在我们的K8S集群中了,这也是我们的Pod与Pod的通讯方案,可以这么去做。
Kubernetes的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,Kubernetes假定这个网络已经存在。而在私有云里搭建Kubernetes集群,就不能假定这个网络已经存在。我们需要自己实现这个网络假设,将不同节点的Docker容器之间的互相访问先打通,然后运行Kubernetes。
同一个Pod内的多个容器之间:localhost
各Pod之间的通讯:Overlay Network
Pod与Service之间的通讯:各节点的IP tables格则
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。而且它还能再这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动地传递到目标容器内。

上述的图中,分别是以IP为192.168.66.11/24和192.168.66.12/24的两台主机,两台主机各运行了两个Pod,首先在我们真实的主机上会去安装一个Flanneld的守护进程,这个进程会去监听一个端口,这个端口就是用于后期转发数据包以及接收数据包的服务端口,一旦Flanneld这个进程启动以后,它会开启一个监听端口,Flannel0,这个Flannel0专门去收集Docker0转发出来的数据报文,Docker0会分配自己的IP到对应的Pod上。
如果是同一台主机不同的Pod访问的话,它走的是Docker0的网桥,因为Pod在同一个网桥下,不同的子IP,也就是在真实的服务器中已经完成了一次数据包转换。
如何通过跨主机还可以通过对方的IP到达呢?首先假设Web app2想把数据包发送到Backend,它的数据包要写自己源地址10.1.15.2/24,目标要写10.1.20.3/24,因为目标网段跟我不是同一个网段,所以10.1.15.2.24发送到自己的网段Docker0,Docker0会有自己对应的钩子函数,会把数据包抓到Flannel0里面,Flannel0里面会有一堆的路由表记录,是从ETCD数据库里面获取到的,写入到我们当前的路由表里,判断到底路由到哪台机器,因为Flannel0是Flanneld的一个进程,所以数据包会转发到Flanneld,到Flanneld它会对数据报文进行封装,下面解释如何封装:

Mac部分到我们的三层,三层写的是源是192.168.66.11,目标写的是192.168.66.12,下一层封装的是udp的数据报文,也就意味着Flanneld它使用的是udp的数据报文,去转发这些数据包的,因为更快,毕竟在同一个局域网内部,在下一层又封装了一层新的三层信息,源是10.1.15.2,目标是10.1.20.3,封装到这一层以后,外面封装了一个数据包实体Payload,然后转发到192.168.66.12/24。
所以数据包是肯定能够到192.168.66.12/24的,并且它的目标端口是Flanneld的端口,所以这个数据包会被Flanneld所截获,截获以后它会拆封,它知道这个是干嘛的,会进行拆封,拆封完以后会被转发到Flannel0,Flannel0会转发到docker0,docker0自然而然会转发到Backend,并且数据包是经过二次解封的,第一层的信息,docker0是看不见的,docker0看的是第二层信息,所以docker0一看源是10.1.15.2/24的机器发过来的,目标找的是我自己下面的机器地址,这样的话就可以实现跨主机的扁平化网络。
Etcd在这里的作用,为Flannel提供说明:
网络通讯方式总结

在我们K8S里面,它有三层网络:
需要注意的是真实的物理的网络只有一个就是节点网络,也就意味着我们在构建服务器的时候,只需要一张网卡就可以去实现,并不是说多张网卡不行,一张网卡就可以实现,Pod网络是一个虚拟网络,Service网络也是一个虚拟网络,这里可以理解为是一个内部网络,所有的Pod都会在这个扁平化的网络中进行通讯,如果想访问Service的话,那就需要在Service的网络中去访问,Service在去跟后端的Pod通过对应的IP tables或者说通过LVS的转换去达到,最新版会用到LVS转换,这样效率会更高。
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于
我在更新到最新版本0.32.1后运行sudopodinstall命令时发现了一个问题。早些时候它工作得很好。当我尝试使用旧的cocoapods安装pod时,它要求我更新到最新的cocoapods版本,即0.32.1。在我通过cocoapodsgem更新后,我无法在我的Xcode项目中执行sudopodinstall。它给了我以下错误。±sudopodinstallruby-1.9.3-p0Password:/Users/username/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/gems/1.9.1/gems/claide-0.5.0/lib/claide/
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我是一个喜欢视觉的人,想知道是否有关于Ruby的不错的大概览。你知道,就像一张引用海报,带有对象层次结构,最常用的方法等等,都是彩色的,布局清晰明了...对于像我这样的初学者来说,这会很棒......有没有你使用或偶然发现的类似东西?
使用sudogeminstallcocoapods安装cocoapods后,尝试运行“podsetup”会返回此错误:Couldnotfind'cocoapods'(>=0)among22totalgem(s)(Gem::LoadError)“pod设置”的输出:/Users/Kevin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:313:in`to_specs':Couldnotfind'cocoapods'(>=0)among22totalgem(s)(Gem::LoadEr
rubygems/dependency.rb:296:in`to_specs':在总共35个gem中找不到'cocoapods'(>=0)(Gem::LoadError)来自/Users/divyam.shukla/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/rubygems/dependency.rb:307:in`to_spec'from/Users/user/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/rubygems/core_ext/kernel_gem.rb:47:in`gem'from/U
最近我尝试做podsetup但我得到这个错误:-bash:/usr/local/bin/pod:/usr/local/opt/ruby/bin/ruby:badinterpreter:Nosuchfileordirectory我按照RayWenderlich的指南安装CocoaPods,但遇到了这个问题,所以我不知道发生了什么。 最佳答案 我在升级到MacOSHighSierra时遇到了这个问题。这是我的修复:sudogeminstallcocoapods我在theCocoaPodsissuelistonGithub上找到了这个答案
VisualStudio2015接缝勾勒出所有多行javascript代码。我有一个像这样的简单代码:$(document).ready(function(){varx={test1:1,test2:2};if(1==1){//thisisatest}});当我按下Ctrl+k,Ctrl+O时,VisualStudio2015会这样概括它:是否可以关闭函数内的大纲?我只想要功能级别的大纲。 最佳答案 不,你做不到,但有优秀的WebEssentials可以在javascript中勾勒出区域!你在像这样的评论之后创建一个区域//#reg
一、常用命令首先列出Pod排查过程中我这边的常用命令:查看Pod状态:kubectlgetpodpodname-owide查看Pod的yaml配置:kubectlgetpodspodname-oyaml查看pod事件:kubectldescribepodspodname查看容器日志:kubectllogspodsname-ccontainer-name二、Pod状态Error:Pod启动过程中发生错误NodeLost:Pod所在节点失联Unkown:Pod所在节点失联或其它未知异常Waiting:Pod等待启动Pending:Pod等待被调度ContainerCreating:Pod容器正在被
我希望显示每个小部件类别的概览,以便在选择该小部件类别时显示在过滤结果上方。我假设这将需要一个ng-show指令,因此可能也需要一些Controller代码。但是任何关于将选择下拉菜单与我的ng-repeat链接起来以及与ng-show链接起来的任何指示都会很棒。这是我的目标:之前之后SelectWidgetRange1WidgetRange2WidgetRange3ProductName:{{product.name}}Quantity:{{product.quantity}}Price:£{{product.price}}https://plnkr.co/edit/0WrinKY2
这是我在àpp/pods中的结构:|-application|-index|-error|-user||-index||-view||-edit发生错误时,ember不会加载error路由。相反,它会尝试加载像index_error或user_error这样的子路由,但这些都不存在。我如何强制Ember在出现任何错误时加载根error路由?Emberv2.1Ember-Cliv1.13.8 最佳答案 您提供的结构实际上应该完全符合您所描述的要求。看看thistwiddle看一个例子。单击“查看用户”将转换到user.view路由,但