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
kind: ReplicaSet
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80

删除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
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80

可以看到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都执行哪些命令
kubectl set image deployment nginx nginx=nginx:1.7.9 --record

可以看到有个新的RS生成了

你也可以通过下面命令暂停和开始更新

#暂停更新
kubectl rollout pause deployments nginx
#查看更新过程中的状态信息
kubectl rollout status deployments nginx
#继续之前的更新
kubectl rollout resume deployments nginx

待更新完成,查看Pod和RS,之前的RS并不会被销毁

查看更新后的镜像

查看滚动更新历史

回滚上个版本

kubectl rollout undo deployment nginx

回滚到指定版本

kubectl rollout undo deployment nginx --to-revision=1