Kubernetes---资源控制器之ReplicationController、ReplicaSet和Deployment
1.ReplicationController和ReplicaSet介绍
RC(ReplicationController)主要的作用就是用来确保容器应用的副本数始终保持在用户定义的副本数。即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收Kubernetes
官方建议使用RS(Replicaset)替代RC(ReplicationController)进行部署,RS跟RC没有本质的不同,只是名字不一样,并且RS支持集合式的 selector
⒉ReplicaSet资源文件示例
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3 #有3个副本
selector: #标签选择器
matchLabels:
tier: frontend
template: #模板
metadata:
1abels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
env:
- name: GET_HOSTS_FROM
value:dns
ports:
- containerPort: 80
⒊Deployment介绍
Deployment通过RS去创建和管理对应的pod及不同的RS交替去完成滚动更新。
Deployment为Pod 和Replicaset 提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController 来方便的管理应用。典型的应用场景包括:
·定义Deployment来创建Pod和ReplicaSet
·滚动升级和回滚应用
·扩容和缩容
·暂停和继续Deployment
⒋Deployment示例
1.资源清单
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
2.创建
kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record ## --record参数可以记录命令,我们可以很方便的查看每次 revision 的变化 更新的时候可以记录状态,每一步是使用什么命令进行更新的
3.扩容
kubectl scale deployment nginx-deployment --replicas 10
4.如果集群支持horizontal pod autoscaling的话,还可以为Deployment设置自动扩展
kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80
5.更新容器中的镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
6.回滚
kubectl rollout undo deployment/nginx-deployment
7.使用edit命令编辑Deployment
kubectl edit deployment/nginx-deployment
8.查看rollout的状态
kubectl rollout status deployment/nginx-deployment
9.查看历史RS
kubectl get rs
⒌Deployment 更新策略【如果我们需要更新时将会创建出两个RS,其中旧的RS一次减少25%的pod而新的RS一次创建25%的pod 】
Deployment 可以保证在升级时只有一定数量的Pod是down的。默认的,它会确保至少有比期望的Pod数量少一个是up状态(最多一个不可用)
Deployment同时也可以确保只创建出超过期望数量的一定数量的Pod。默认的,它会确保最多比期望的Pod数量多一个的Pod是up的(最多1个surge)
未来的Kuberentes 版本中,将从1-1变成25%-25%$kubect1 describe deployments
⒍Rollover【多个rollout并行】
回退Deployment
只要Deployment的rollout被触发,就会创建一个revision。也就是说当且仅当Deployment的Pod template(如`.spec.template`)被更改,例如更新template中的label和容器镜像时,就会创建出一个新的revision。其他的更新,比如扩容Deployment不会创建revision-因此我们可以很方便的手动或者自动扩容。这意味着当您回退到历史revision时,只有Deployment中的Pod template部分才会回退
#设置镜像 kubectl set image deployment/nginx-deployment nginx=nginx:1.91 #查看当前更新状态 kubectl rollout status deployments nginx-deployment kubectl get pods #查看可回滚的历史版本 kubectl rollout history deployment/nginx-deployment kubectl rollout undo deployment/nginx-deployment ##可以使用--revision参数指定回退到某个历史版本 kubectl rollout undo deployment/nginx-deployment --to-revision=2 ##暂停 deployment的更新 kubectl rollout pause deployment/nginx-deployment
您可以用kubectl rollout status 命令查看Deployment是否完成。如果 rollout成功完成,kubect1rollout status 将返回一个0值的Exit Code
kubect1 rollout status deploy/nginx echo $?
您可以通过设置.spec.revisonHistoryLimit 项来指定 deployment 最多保留多少revision历史记录。默认的会保留所有的revision;如果将该项设置为0,Deployment 就不允许回退了