Deployment 为 Pod 和 ReplicaSet(下一代 Replication Controller)提供声明式更新,有了Deployment之后我们就不再单独的使用RC和RS了。 您只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和 ReplicaSet 的实际状态改变到您的目标状态。 Deployment集成了上线部署、滚动升级、创建副本、暂停上线任务,恢复上线任务,回滚到以前某一版本(成功/稳定)的Deployment等功能,在某种程度上,Deployment可以帮我们实现无人值守的上线,大大降低我们的上线过程的复杂沟通、操作风险。

一、创建Deployment

Deployment对象的创建同样是一开YAML的配置文件。

[root@k8s-01 ~]# cat nginx-deployment.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: nginx:1.13.12
        ports:
        - containerPort: 80

可以发现,这里我特意在镜像中指定了一下nginx的版本,以方便后面升级的时候做对比。

使用kubectl创建Deployment

[root@k8s-01 ~]# kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created

查看Deployment

[root@k8s-01 ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           16s
  • UP-TO-DATE 的 replica 的数目已经达到了配置中要求的数目。
  • CURRENT 的 replica 数表示 Deployment 管理的 replica 数量
  • AVAILABLE 的 replica 数是当前可用的 replica 数量。

查看RS和pod

[root@k8s-01 ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-56689dc4b8   3         3         3       29s

[root@k8s-01 ~]# kubectl get pod
NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-56689dc4b8-9v72r   1/1     Running            1          26m
nginx-deployment-56689dc4b8-mt4n2   1/1     Running            1          26m
nginx-deployment-56689dc4b8-twlx2   1/1     Running            1          26m

查看Deployment扩展信息

[root@k8s-01 ~]# kubectl get deployment -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES          SELECTOR
nginx-deployment   3/3     3            3           28m   nginx        nginx:1.13.12   app=nginx

查看pod的lables

[root@k8s-01 ~]# kubectl get pods --show-labels
NAME                                READY   STATUS             RESTARTS   AGE   LABELS
nginx-deployment-56689dc4b8-9v72r   1/1     Running            1          30m   app=nginx,pod-template-hash=56689dc4b8
nginx-deployment-56689dc4b8-mt4n2   1/1     Running            1          30m   app=nginx,pod-template-hash=56689dc4b8
nginx-deployment-56689dc4b8-twlx2   1/1     Running            1          30m   app=nginx,pod-template-hash=56689dc4b8

注意: pod-template-has这个 label 不是用户指定的!

注意上面示例输出中的 pod label 里的 pod-template-hash label。当 Deployment 创建或者接管 ReplicaSet 时,Deployment controller 会自动为 Pod 添加 pod-template-hash label。这样做的目的是防止 Deployment 的子ReplicaSet 的 pod 名字重复。通过将 ReplicaSet 的 PodTemplate 进行哈希散列,使用生成的哈希值作为 label 的值,并添加到 ReplicaSet selector 里、 pod template label 和 ReplicaSet 管理中的 Pod 上。

二、更新Deployment

更新Deployment,并增加–recode参数

[root@k8s-01 ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.14.2 --record
deployment.apps/nginx-deployment image updated

查看更新状态

[root@k8s-01 ~]# kubectl rollout status deployment nginx-deployment
deployment "nginx-deployment" successfully rolled out

查看更新后的Deploymnet

[root@k8s-01 ~]# kubectl get deployment -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx-deployment   3/3     3            3           49m   nginx        nginx:1.14.2   app=nginx

可以看到,一开始定义的nginx版本是1.13.12,现在已经变成了1.14.2 。

三、Deployment升级历史

查看升级历史

[root@k8s-01 ~]# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment nginx-deployment nginx=nginx:1.14.2 --record=true

因为我们创建 Deployment 的时候使用了–record参数可以记录命令,我们可以很方便的查看每次 revision 的变化。可以看到有两次的历史记录。

查看单个revision 的详细信息:

[root@k8s-01 ~]# kubectl rollout history deployment nginx-deployment --revision=1 
deployment.apps/nginx-deployment with revision #1
Pod Template:
  Labels:       app=nginx
        pod-template-hash=56689dc4b8
  Containers:
   nginx:
    Image:      nginx:1.13.12
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

四、Deployment版本回滚

回滚到上一个版本

[root@k8s-01 ~]# kubectl rollout undo deployment nginx-deployment
deployment.apps/nginx-deployment rolled back

[root@k8s-01 ~]# kubectl get deployment -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES          SELECTOR
nginx-deployment   3/3     3            3           54m   nginx        nginx:1.13.12   app=nginx

很神奇吧,可以直接进行回滚,真是太舒服了。

还可以使用--revision参数指定某个历史版本:

[root@k8s-01 ~]# kubectl rollout undo deployment nginx-deployment --to-revision=2 
deployment.apps/nginx-deployment rolled back

[root@k8s-01 ~]# kubectl get deployment -o wide                                  
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx-deployment   3/3     3            3           57m   nginx        nginx:1.14.2   app=nginx

注意:版本号在Deployment的升级历史中查找

五、Deployment扩容

[root@k8s-01 ~]# kubectl scale deployment nginx-deployment --replicas 2
deployment.apps/nginx-deployment scaled

[root@k8s-01 ~]# kubectl get pod
NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-574b87c764-b6jhm   1/1     Running            0          3m25s
nginx-deployment-574b87c764-tgsb8   1/1     Running            0          3m24s

[root@k8s-01 ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           63m


[root@k8s-01 ~]# kubectl scale deployment nginx-deployment --replicas 4
deployment.apps/nginx-deployment scaled

[root@k8s-01 ~]# kubectl get pod
NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-574b87c764-7sw2x   1/1     Running            0          3s
nginx-deployment-574b87c764-9mnmn   1/1     Running            0          3s
nginx-deployment-574b87c764-b6jhm   1/1     Running            0          3m36s
nginx-deployment-574b87c764-tgsb8   1/1     Running            0          3m35s

[root@k8s-01 ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   4/4     4            4           64m

参考文章:
http://k8s.unixhot.com/kubernetes/deployment.html

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐