Kubernetes对象之Deployment

学习本节内容之前,希望你已经对Pod和ReplicaSet有了基本的了解。具体请参考这两篇文章:

  • Kubernetes对象之Pod
  • Kubernetes对象之ReplicaSet

1. Deployment概述

Deployment对象,顾名思义,是用于部署应用的对象。它使Kubernetes中最常用的一个对象,它为ReplicaSet和Pod的创建提供了一种声明式的定义方法,从而无需像前两篇文章中那样手动创建ReplicaSet和Pod对象(使用Deployment而不直接创建ReplicaSet是因为Deployment对象拥有许多ReplicaSet没有的特性,例如滚动升级和回滚)。

一个最简单的nginx应用,其Deployment文件如下:

apiVersion: apps/v1
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

通过kubectl create -f nginx-deployment.yaml命令或者kubectl apply -f nginx-deployment.yaml命令创建名为nginx-deployment的Deployment对象。

通过Deployment对象,你可以轻松的做到以下事情:

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

2. Deployment的创建

以上面的nginx-deployment.yaml文件为例,使用以下命令创建一个nginx的Deployment:

kubectl create -f nginx-deployment.yaml --record

--record参数可以记录当前版本的Deployment都执行过哪些命令。

创建完成后立即执行get命令可以查看这个Deployment:

$kubectl get deployments
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3         0         0            0           1s

NAME代表Deployment的名字,DESIRED代表这个Deployment期望的副本数量,CURRENT代表当前已经创建了的副本数量,UP-TO-DATE代表已经更新完成的副本数量,AVAILABLE代表对于当前用户可用的副本数量,AGE代表当前Deployment已经运行的时长。

等待几秒钟,再次运行get命令,可以查看到变化:

$ kubectl get deployments
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3         3         3            3           18s

通过kubectl get rs来查看系统中ReplicaSet对象,由此可以看出Deployment会自动创建一个ReplicaSet对象。

通过kubectl get pods --show-labels命令来查看当前系统中的Pod对象,可以成功观察到nginx-deployment创建的3个Pod。

3. 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。

rollout命令的更多用法:

  • history(查看历史版本)
  • pause(暂停Deployment)
  • resume(恢复暂停的Deployment)
  • status(查看资源状态)
  • undo(回滚版本)

参考文章

  • https://kubernetes.feisky.xyz/zh/concepts/deployment.html

你可能感兴趣的:(Kubernetes对象之Deployment)