本文发布于Cylon的收藏册,转载请著名原文链接~

Deployment当中借助于ReplicaSet进行更新的策略反映在Deployment的对象定义所需字段可使用kubectl explain deploy,Deployment属于extension群组。在1.10版本中它被移至到apps群组。他与ReplicaSet相比增加了几个字段。

stratgy 重要字段,定义更新策略,它支持两种策略 重建式更新 Recreate与滚动更新RollingUpdate,如果type为RollingUpdate,那么RollingUpdate的策略还可以使用RollingUpdate来定义,如果type为Recreate,那么RollingUpdate字段无效。 默认值为RollingUpdate

stratgy.RollingUpdate控制RollingUpdate更新力度

  • maxSurge 对应的更新过程当中,最多能超出目标副本数几个。有两种取值方式,为直接指定数量和百分比。在使用百分比时,在计算数据时如果不足1会补位1个。
  • maxUnavailable 最多有几个副本不可用。

revisionHistoryLimit 滚动更新后,在历史当中最多保留几个历史版本,默认10。

    在使用Deployment创建Pod时,Deployment会自动创建ReplicaSet,而且Deployment名称是使用Pod模板的hash值,此值是固定的。

    Deployment在实现更新应用时,可以通过编辑配置文件来实现,使用kubectl apply -f更改每次变化。每次的变化通过吧变化同步至apiserver中,apiserver发现其状态与etcd不同,从而改变etcd值来实现修改其期望状态,来实现现有状态去逼近期望状态。

kubectl explain deploy

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deploy
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: deploy
      release: canary
  template:
    metadata:
      labels:
        app: deploy
        release: canary
    spec:
      containers:
      - name: my-deploy
        image: node01:5000/busybox:v1
        ports:
        - name: http
          containerPort: 80
        command: ["/bin/sh","-c","/bin/httpd -f -h /tmp"]

使用kubectl apply 声明式更新、创建资源对象。

将上述资源配置清单的replicaSet数量改为3个后,可以看到数量增加为3,而对应的hash值没变化。

1
2
3
4
5
6
7
$ kubectl apply -f deploy.yaml 
deployment.apps/app-deploy configured
$ kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
app-deploy-5b8db6bc7d-bkldv   1/1     Running   0          4s
app-deploy-5b8db6bc7d-r2pcv   1/1     Running   0          5h5m
app-deploy-5b8db6bc7d-wgbbg   1/1     Running   0          5h5m

    由于Deployment是构建在ReplicaSet之上,对Pod做扩展、缩容是很方便的。处理动态修改资源配置清单外,还可以使用kubectl patch(打补丁)进行操作。

    patch操作是对对象的JSON内容进行打补丁,-p选项值为JSON格式,其建值需以引号引起。

语法

1
kubectl patch

-p 提供补丁

1
2
3
4
5
6
7
8
$ kubectl patch deployment app-deploy -p '{"spec":{"replicas":4}}'
deployment.extensions/app-deploy patched
$ kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
app-deploy-58d74fd87f-555jm   1/1     Running   0          15m
app-deploy-58d74fd87f-kkwz9   1/1     Running   0          15m
app-deploy-58d74fd87f-vzthx   1/1     Running   0          15m
app-deploy-58d74fd87f-zwdn5   1/1     Running   0          4s
1
kubectl patch deployment app-deploy -p '{"spec": {"strategy": {"rollingUpdate": {"maxSurge":1,"maxUnavailable":0 }}}}'

更新版本

    在更新完成后使用 kubectl get rs 查看可看到有两个 rs版本,所不同的是,镜像版本不同和可用的数量为0,但这个对应的模板会保留,随时等待回滚。

1
2
3
4
$ kubectl get rs -o wide
NAME                    DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                   SELECTOR
app-deploy-58d74fd87f   3         3         3       76s     my-deploy    node01:5000/busybox:v2   app=deploy,pod-template-hash=58d74fd87f,release=canary
app-deploy-5b8db6bc7d   0         0         0       5h10m   my-deploy    node01:5000/busybox:v1   app=deploy,pod-template-hash=5b8db6bc7d,release=canary

更新版本可以使用可使用 kubectl set image进行更新

语法

1
kubectl set image [-f filename | type name] container=version
1
kubectl set image deployment app-deploy my-deploy=node01:5000/busybox:v4 && kubectl rollout pause deployment app-deploy

此时可以看到rs保留多个版本

1
2
3
4
$ kubectl get rs -o wide
NAME                    DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES                   SELECTOR
app-deploy-58d74fd87f   0         0         0       34m    my-deploy    node01:5000/busybox:v2   app=deploy,pod-template-hash=58d74fd87f,release=canary
app-deploy-7fbc8b6df    3         3         3       25m    my-deploy    node01:5000/busybox:v4   app=deploy,pod-template-hash=7fbc8b6df,release=canary

使用 kubectl rollout pause可以暂停更新。

1
kubectl rollout pause type typename

使用resume可恢复暂停操作

1
kubectl rollout resume type typename

Deployment版本滚动的历史保留

可使用 kubectl rollout history 查看滚动历史

1
2
3
4
5
$ kubectl rollout history deployment app-deploy
deployment.extensions/app-deploy 
REVISION  CHANGE-CAUSE
1         [none]
2         [none]

版本回滚

使用 kubectl rollout undo默认是回滚至上一个版本

语法

1
kubectl rollout undo type typename 

--to-revision=n 回滚至指定版本

1
kubectl rollout undo deployment app-deploy --to-revision=1

回滚后查询当前rs版本

1
2
3
4
$ kubectl get rs -o wide
NAME                    DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                   SELECTOR
app-deploy-58d74fd87f   3         3         3       108m    my-deploy    node01:5000/busybox:v2   app=deploy,pod-template-hash=58d74fd87f,release=canary
app-deploy-7fbc8b6df    0         0         0       99m     my-deploy    node01:5000/busybox:v4   app=deploy,pod-template-hash=7fbc8b6df,release=canary

Deployment回滚演示

b1fc4e91.gif

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2018/09/kubenetes-deployment/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。