ReplicationController、ReplicaSet和Deployment都是Kubernetes中Pod的控制器
ReplicationController和ReplicaSet
RC(ReplicationController)主要是用来确保容器应用的副本数始终保持在用户定义的副本数,也就是说容器异常退出,RC会自动创建新的Pod来替代。官方建议使用RS(ReplicaSet)来取代RC
RS(ReplicaSet)跟RC没有本质的区别,只是RS支持集合式的selector
应用 nginx.yaml
我们定义了3个副本的RS控制器的nginx Pod,具有app=nginx的标签
apiVersion: apps/v1 |
删除Pod,RS会自动创建新的Pod代替他们
查看Pod标签
我们给nginx-6462b修改标签,RS通过matchLabel匹配app=nginx标签关联的Pod副本数变成2个了,又会重新创建一个新的Pod
当我们删除RS时,可以看到,标签app=test-nginx的Pod没有被删除
Deployment
虽然RS可以独立使用,但是一般还是建议使用Deployment来管理RS,主要是Deployment还支持滚动更新、回滚等操作
当我们创建一组deployment控制器类型的Pod时,deployment并不是直接管理Pod的,而是通过replicaset管理这组Pod,当使用deployment滚动更新时,deployment会创建一个新的replicaset:v2,然后replicaset:v2创建第一个pod:v2,当第一个pod:v2成功running后,replicaset:v1会销毁一个pod:v1;接着replicaset:v2会创建第二个pod:v2,待第二个pod:v2成功running后,replicaset:v1会销毁第二个pod:v1,依次按照这样子更新,直到replicaset:v2维持期望的副本数,这时,replicaset:v1维护的Pod副本数已经全部销毁,但是replicaset:v1控制器并不会销毁,而是处于一种停止状态,这是为了后续的回滚操作。
回滚和滚动更新类似,replicaset从v2版本回滚到v1版本,首先会创建第一个pod:v1,成功运行后,销毁一个pod:v2,然后创建第二个pod:v1,成功运行后,销毁另一个pod:v2。
创建一组deployment控制器类型的nginx Pod
应用 nginx.yaml
apiVersion: apps/v1 |
可以看到deployment关联着RS控制器管理Pod
将nginx镜像更新为nginx:1.7.9
# deployment指deployment控制器 nginx指deployment的名称 nginx=nginx:1.7.9指将原来nginx name名称的容器更新为nginx:1.7.9 --record参数可以记录当前版本的Deployment都执行哪些命令 |
可以看到有个新的RS生成了
你也可以通过下面命令暂停和开始更新
#暂停更新 |
待更新完成,查看Pod和RS,之前的RS并不会被销毁
查看更新后的镜像
查看滚动更新历史
回滚上个版本
kubectl rollout undo deployment nginx |
回滚到指定版本
kubectl rollout undo deployment nginx --to-revision=1 |