images\cherry_red.png1 K8S(kubernetes)
      images\cherry_blue.png1.1 Kubernetes基础命令
      images\cherry_blue.png1.2 Kubernetes快速部署
      images\cherry_blue.png1.3 Kubernetes部署(Test)
      images\cherry_blue.png1.4 资源对象Kind
         images\cherry_orange.png1.4.1 Deployment对象
            images\cherry_cyan.png1.4.1.1 rollout
         images\cherry_orange.png1.4.2 自动扩缩容
      images\cherry_blue.png1.5 Kubernetes基本概念与术语
         images\cherry_orange.png1.5.1 Master
         images\cherry_orange.png1.5.2 Node
      images\cherry_blue.png1.6 集群部署3 Master 2 node
         images\cherry_orange.png1.6.1 kuber
         images\cherry_orange.png1.6.2 kubernetes高可用集群验证
Deployment对象,顾名思义,是用于部署应用的对象。它使Kubernetes中最常用的一个对象,
它为ReplicaSet和Pod的创建提供了一种声明式的定义方法,从而无需像前两篇文章中那样手动创建ReplicaSet和Pod对象
使用Deployment而不直接创建ReplicaSet是因为Deployment对象拥有许多ReplicaSet没有的特性,例如滚动升级和回滚
详情请查询官方文档
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

• 创建ReplicaSet和Pod
• 滚动升级(不停止旧服务的状态下升级)和回滚应用(将应用回滚到之前的版本)
• 平滑地扩容和缩容
• 暂停和继续Deployment


部署一个简单的Nginx应用进行测试实验

首先创建对应两个yaml文件,nginx_deployment.yaml.nginx_service.yaml

nginx_deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
        track: stable
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80


kubectl create -f nginx_deployment.yaml --record

--record 参数记录当前版本Deployment执行了哪些命令

创建完成后,查询创建节点的情况

images\5-1.png


DESIRED 期望副本个数
CURRENT 当前已经创建副本个数
UP-TO-DATE 表示已经更新完成副本个数
AVAILABLE 当前用户可用的副本数量
AGE 当前已经运行的时常

通过kubectl get rs来查看系统中ReplicaSet对象,由此可以看出Deployment会自动创建一个ReplicaSet对象。
通过kubectl get pods --show-labels命令来查看当前系统中的Pod对象,可以成功观察到nginx-deployment创建的3个Pod。

images\5-2.png


Deployment 更新
假如我们现在想要让 nginx pod 使用 nginx:1.9.1 的镜像来代替原来的 nginx:1.7.9 的镜像,运行以下命令:
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

或者我们可以使用 edit 命令来编辑 Deployment,将image从nginx:1.7.9 改写成 nginx:1.9.1。
kubectl edit deployment/nginx-deployment
查看更新进度:
$ kubectl rollout status deployment/nginx-deployment
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx-deployment" successfully rolled out
扩容:
kubectl scale deployment nginx-deployment --replicas 10

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

kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80
Deployment更新时会创建一个新的ReplicaSet,然后将新的ReplicaSet中的Pod慢慢扩容到指定的副本数,将旧的ReplicaSet慢慢缩容到0。
因此,更新时总能够确保旧的服务不会停止,这就是滚动更新。

4. Deployment的回滚
当我们像上文一样更新了Deployment之后,我们发现nginx:1.9.1的镜像不是很稳定,因此想要修改回nginx:1.7.9的版本,
此时我们不需要手动更改Deployment文件,而是利用Deployment的回滚功能。

使用rollout history命令查看Deployment的版本(revision):
$ kubectl rollout history deployment/nginx-deployment

deployments "nginx-deployment":
REVISION CHANGE-CAUSE
1 kubectl create -f docs/user-guide/nginx-deployment.yaml --record
2 kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

因为我们创建 Deployment 的时候使用了 —recored 参数可以记录命令,我们可以很方便的查看每次 revison 的变化。

查看单个 revision 的详细信息:
kubectl rollout history deployment/nginx-deployment --revision=2

现在,可以使用rollout undo命令回滚到前一个revision:
$ kubectl rollout undo deployment/nginx-deployment
deployment "nginx-deployment" rolled back

也可以使用--to-revision参数指定某个历史版本:
$ kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment "nginx-deployment" rolled back
你可以通过设置 .spec.revisonHistoryLimit 项来指定 deployment 最多保留多少 revison 历史记录。默认的会保留所有的 revision;如果将该项设置为 0,Deployment 就不允许回退了。
只有 Deployment 的 rollout 被触发才会创建一个 revision!注意!当且仅当 Deployment 的 Pod template被更改,
例如更新 template 中的 label 和容器镜像时,才会触发一个rollout,从而为Deployment创建出一个新的 revision。


----------------------------------------------------------------------------------------------------------------------------

nginx_service.yaml

kubectl create -f nginx_service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service-node
spec:
  selector:
    app: nginx
  ports:
    - name:
      port: 8000
      protocol: TCP
      targetPort: 80
  type: NodePort