RS与RC与Deployment关联

RC(ReplicationController)主要的作用就是用来确保容器应用的副本数始终保持在用户定义的副本数。即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收
Kubernetes 官方建议使用RS(ReplicaSet)替代RC(ReplicationController)进行部署,RS跟RC没有本质的不同,只是名字不一样,并且RS支持集合式的 selector

  1. apiVersion: extensions/v1beta1
  2. kind: ReplicaSet
  3. metadata:
  4. name: frontend
  5. spec:
  6. replicas: 3
  7. selector:
  8. matchLabels:
  9. tier: frontend
  10. template:
  11. metadata:
  12. labels:
  13. tier: frontend
  14. spec:
  15. containers:
  16. - name: php-redis
  17. image: gcr.io/google_samples/gb-frontend:v3
  18. env:
  19. - name: GET_HOSTS_FROM
  20. value: dns
  21. ports:
  22. - containerPort: 80

RS与 Deployment 关联

Deployment

image.png
Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的 ReplicationController 来方便的管理应用。典型的应用场景包括:

  • 定义Deployment来创建Pod和ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续DeploymentI、部署一个简单的Nginx应用

部署简单nginx应用

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deployment
  5. spec:
  6. replicas: 3
  7. template:
  8. metadata:
  9. labels:
  10. app: nginx
  11. spec:
  12. containers:
  13. - name: nginx
  14. image: nginx1.7.9
  15. ports:
  16. - containerPort: 80
  1. kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record
  2. [root@k8s-master01 ~]# kubectl apply -f deployment.yaml --record
  3. deployment.extensions/nginx-deployment created
  4. ## --record 参数可以记录命令,我们可以很方便的查看每次revision的变化

扩容

  1. kubectl scale deployment nginx-deployment --replicas 10

如果集群支持horizontal pod autoscaling的话,还可以为Deployment设置自动扩展

  1. kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80

更新镜像也比较简单

  1. kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

回滚

  1. kubectl rollout undo deployment/nginx-deployment

更新 Deployment

假如我们现在想要让nginx pod使用 nginx:1.9.1 的镜像来代替原来的nginx:1.7.9的镜像

  1. kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

可以使用edit 命令来编辑Deployment

  1. $ kubectl edit deployment/nginx-deployment
  2. deployment "nginx-deployment" edited

查看rollout的状态

  1. $ kubectl rollout status deployment/nginx-deployment
  2. Waiting for rollout to finish2 out of 3 new replicas have been updated...
  3. deployment "nginx-deployment" successfully rolled out

查看历史RS

  1. [root@k8s-master01 ~]# kubectl get rs
  2. NAME DESIRED CURRENT READY AGE
  3. nginx-deployment-5c478875d8 0 0 0 12m
  4. nginx-deployment-5df65767f 10 10 10 20m
  5. [root@k8s-master01 ~]#

Deployment更新策略

Deployment可以保证在升级时只有一定数量的Pod是down的。默认的,它会确保至少有比期望的Pod数量少一个是up状态(最多一个不可用)
Deployment同时也可以确保只创建出超过期望数量的一定数量的Pod。默认的,它会确保最多比期望的Pod数量多一个的Pod是up的(最多1个 surge )
未来的Kuberentes版本中,将从1-1变成25%-25%

  1. $ kubectl describe deployments

Rollover(多个rollout并行)

假如您创建了一个有5个 niginx:1.7.9 replica 的 Deployment,但是当还只有3个 nginx:1.7.9 的 replica 创建出来的时候您就开始更新含有5个nginx:1.9.1 replica 的 Deployment。在这种情况下,Deployment会立即杀掉已创建的3个nginx:1.7.9 的Pod,并开始创建nginx:1.9.1的Pod。它不会等到所有的5个nginx:1.7.9 的 Pod 都创建完成后才开始改变航道

回退Deployment

  1. kubectl set image deployment/nginx-deployment nginx=nginx1.91
  2. kubectl rollout status deployments nginx-deployment ## 查看更新状态
  3. kubectl get pods
  4. kubectl rollout history deployment/nginx-deployment ## 查看历史版本
  5. kubectl rollout undo deployment/nginx-deployment ## 回滚
  6. kubectl rollout undo deployment/nginx-deployment --to-revision=2 ##可以使用 --revision参数指定某个历史版本
  7. kubectl rollout pause deployment/nginx-deployment ##暂停deployment的更新

您可以用 kubectl rollout status 命令查看Deployment是否完成。如果 rollout成功完成, kubectl rollout status 将返回一个 0 值的 Exit Code

  1. $ kubectl rollout status deploy/nginx
  2. waiting for rollout to finish2 of 3 updated replicas are available...
  3. deployment "nginx" successfully rolled out
  4. $ echo $?
  5. 0

清理 Policy

您可以通过设置 .spec.revisonHistoryLimit 项来指定 deployment 最多保留多少revision历史记录。默认的会保留所有的 revision;如果将该项设置为0,Deployment 就不允许回退了