这是我参与更文挑战的第2天,活动详情查看: 更文挑战
Pod是什么 Pod就是一个或多个容器的集合。
因为一个Pod里面的所有容器共享该Pod的网络栈(pause)和存储卷积,所以这些容器使用的端口不能冲突,不然会导致Pod起不来或者不停重启。而一个Pod内的容器相互访问直接用localhost即可。
Pod的分类 上一节我们讲到了master中的一个组件:Controller。按照是否被控制器控制,Pod可以被分为如下两类
被控制器控制的Pod 也就是说如果Pod有故障,控制器会自动剔除并起一个新的Pod
不被控制器控制的Pod 这种Pod如果出现故障不会自动被替换
既然说到了控制器,下面我们来看一下到底有多少种控制器。
控制器 Replication Controller/ReplicaSet/Deployment 这里将RC,RS和Deployment放到一起讲,是因为这三个基本是一个东西。
前面说了RC是用来确保容器副本始终保持用户的设定值,如果副本出故障会被新副本替代,有多的副本会被剔除。
RS本质上是和RC一样的,不同的就是RS在选择目标Pod的时候支持集合式的选择。每个Pod会被加上一些标签,例如App=Nginx,Version=v1,RS在选择目标Pod的时候可以将多个条件进行复合考虑,RC只能对单一条件进行考虑。所以新版本的k8s中建议使用RS而不是RC。
RS独立使用是没有任何问题的,不过一般情况下使用Deployment来自动管理RS。也就是说不要自己创建RS,而是通过控制Deployment,让Deployment自动去创建删除RS。这样做的好处就是可以实现滚动更新。
所谓滚动更新就是对多个Pod依次进行更新,例如有3个V1版本的Pod,现在要将3个V1版本都更新到V2。Deployment会创建一个新的RS,然后在底下创建V2版本的Pod,每创建一个V2版本的新Pod,就在原先的RS下面删除一个V1版本的Pod,一直到最后3个V1版本的Pod都被更新为V2版本为止。而因为之前的3个V1版本的Pod并没有被删除,而只是在旧的RS下被停用,所以可以很方便的直接回滚。
说了这个多,结论就是,在生产环境中建议使用Deployment配合RS的方式。