一、Deployment的定位与优势

Deployment一般用于部署公司的无状态服务,因为企业内部都是以微服务为主,而企业内部现在都是以微服务为主,而微服务实现无状态化也是最佳实践,可以利用 Deployment的高级功能做到无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。

Deployment 是一种更高级别的 API 对象,用于更新其底层 ReplicaSet 及其 Pod。 如果你想要这种滚动更新功能,那么推荐使用 Deployment,因为它们是声明式的、服务端的,并且具有其它特性。

注意:Deployment的管理机制为通过 ReplicaSet 管理 Pod 副本

二、创建Deployment

2.1 Deployment部署过程

下面以创建名为nginx且副本数为3的Deployment文件为例,其部署过程图如下:

Deployment部署过程

1.在master节点上定义一个yaml文件,其中kind为Deployment。使用kubectl创建一个Deployment文件,副本数为3 2.在执行kubectl create命令时,提交给api-server 3.api-server持久化实例 4.假设在Default命名空间创建Deployment文件,先创建RS,其命名规则为nginx-xxx 5.由RS在不同的工作节点上创建pod

2.2 创建一个Deployment

1.定义一个新的yaml文件

$ vim nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        ports:
        - containerPort: 80

上面参数说明:

  • nginx-deployment:Deployment的名称
  • replicas: 创建Pod的副本数
  • selector:定义Deployment如何找到要管理的Pod,与template的label(标签)对应,apiVersion 为apps/v1必须指定该字段

2.创建Deployment

$ k create -f nginx-deploy.yaml

3.查看此 Deployment 的状态

$ k get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           106s

上面参数说明:

  • NAME:集群中Deployment的名称;
  • READY:Pod就绪个数和总副本数;
  • UP-TO-DATE:显示已达到期望状态的被更新的副本数;
  • AVAILABLE:显示用户可以使用的应用程序副本数,如果当前为0,说明目前还没有达到期 望的Pod;
  • AGE:显示应用程序运行的时间

4.查看整个 Deployment 创建的状态

(1)打开一个窗口创建名为nginx-deployment的Deployment

$ k create -f nginx-deploy.yaml

(2)打开另一个窗口查看整个 Deployment 创建的状态

$ k rollout status deployment/nginx-deployment
deployment "nginx-deployment" successfully rolled out

注意:需要开两个窗口,一个窗口执行操作命令,另一个窗口执行k rollout status deployment查看整个 Deployment 创建的状态

5.查看每个 Pod 自动生成的标签

$ k get pods --show-labels
NAME                              READY   STATUS    RESTARTS       AGE     LABELS
cluster-test-79b978867f-4x2lw     1/1     Running   64 (56m ago)   7d10h   app=cluster-test,pod-template-hash=79b978867f
etcd                              1/1     Running   2 (117m ago)   3d12h   <none>
nginx-deployment-df755dd4-2j6m7   1/1     Running   0              6m49s   app=nginx,pod-template-hash=df755dd4
nginx-deployment-df755dd4-86bcr   1/1     Running   0              6m49s   app=nginx,pod-template-hash=df755dd4
nginx-deployment-df755dd4-kbvp9   1/1     Running   0              6m49s   app=nginx,pod-template-hash=df755dd4

三、更新Deployment

3.1 Deployment更新过程

Deployment更新过程

1.在master节点上定义一个yaml文件,其中kind为Deployment。使用kubectl更新一个Deployment文件 2.在执行kubectl set命令时,提交给api-server 3.api-server持久化实例 4.假设在Default命名空间创建的Deployment文件,会再创建一个新的RS,其命名规则为nginx-xxx2, 5.由新的RS在不同的工作节点上创建pod逐步替代旧RS创建的旧pod

3.2 更新一个Deployment

当且仅当 Deployment 的 Pod 模板(即.spec.template)更改时,才会触发 Deployment 更新,例如更改内存、CPU 配置或者容器的 image。其他更新(如对 Deployment 执行扩缩容的操作)不会触发上线动作。

按照以下步骤更新 Deployment:

1.更新 nginx Pod 以使用 nginx:1.16.1 镜像

(1)方法一:使用set命令进行更新

$ k set image deployment nginx-deployment nginx=nginx:1.16.1
deployment.apps/nginx-deployment image updated

(2)方法二:使用edit命令进行更新

$ k edit deployment nginx-deployment

使用edit命令进行更新

2.使用 kubectl rollout status 查看更新过程,可以看出更新过程为新旧交替更新,首先新建一个 Pod,当 Pod 状态为 Running 时,删除一 个旧的 Pod,同时再创建一个新的 Pod。当触发一个更新后,会有新的 ReplicaSet 产生,旧的 ReplicaSet 会被保存,查看此时 ReplicaSet,可以从 AGE 或 READY 看出来新旧 ReplicaSet:

$ k get rs
NAME                         DESIRED   CURRENT   READY   AGE
cluster-test-79b978867f      1         1         1       7d10h
nginx-deployment-df755dd4    3         3         3       49m
nginx-deployment-ff6655784   0         0         0       10m

3.通过 describe 查看 Deployment 的详细信息

$ k describe deployment nginx-deployment

查看 Deployment 的详细信息