Deployment -> ReplicaSet -> Pod


创建


deployment必选字段:

        spec.replicas

        spec.selector.matchLables

        spec.template

API版本:apps/v1

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-dm
  name: nginx-dm
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-dm
  template:
    metadata:
      labels:
        app: nginx-dm
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
          name: http

命令创建方式:

kubectl create deployment nginx-dm --image=nginx --dry-run -o yaml

Deployment 创建 ReplicaSet 来控制 Pod,使用,命令可以查看到 RS。

kubectl get replicasets -l app=nginx-dm
NAME                 DESIRED   CURRENT   READY   AGE
nginx-dm-f6b9d478b   3         3         3       13m

查看创建的Pod:

kubectl get pods -l app=nginx-dm



更新策略


滚动更新(rolling update):

        新旧版本要同时可以工作。滚动更新期间是在新旧两个ReplicaSet的控制下,旧控制器的Pod在减少,新控制器的Pod在增加。

超出的Pod数:

        deployments.spec.strategy.rollingUpdate.maxSurge:升级期间Pod数量可超过预期数量的个数,值为0以上的正整数或百分比。

不可用的Pod数:

        deployments.spec.strategy.rollingUpdate.maxUnavailable:最大不达可数目,Pod处于不可用的状态的个数。

        maxSurge 和 maxUnavailable 这两个值不可同时为零。

spec:
  strategy:
    rollingUpdate:
      maxSurge: 2
      maxUnavailable: 0
    type: RollingUpdate

重新创建(recreate):

        这种方式为删除现有的Pod,然后创建新Pod,常用于对数据库结构有改动的应用。

就绪等待时间:

        deployments.spec.minReadySeconds:Pod创建好后等待多长的时间才视为就绪,给应用一些初始化的时间。

保留历史版本数:

        deployments.spec.revisionHistoryLimit:保留旧ReplicaSet 版本的个数,用来回滚。



更新


kubectl patch:打补丁

kubectl patch deployments nginx-dm -p '{"spec":{"minReadySeconds":5}}'

修改镜像:kubectl set image 

        其中 nginx=nginx:1.16-alpine 等号前面的是containers 中name字段的值,等号后面的是镜像名称。

        使用 --record=true 选项可以记录此条更新,以便后续回滚。

kubectl set image deployments nginx-dm nginx=nginx:1.16-alpine

查看更新过程:

        更新镜像时可以使用 --watch 选项来查看更新过程:

kubectl get pods --watch
Waiting for deployment "nginx-dm" rollout to finish: 1 out of 3 new replicas have been updated...

kubectl get deployments nginx-dm --watch
nginx-dm   4/3     1            4           26h

使用 kubectl rollout status 可以查看更新过程的状态信息:

kubectl rollout status deployments nginx-dm

滚动更新是用新的RS去替换旧的RS,可以看到更新过后留下的 ReplicaSet:

kubectl get replicaset -l app=nginx-dm



金丝雀发布


1、设置 maxSurge: 1 和 maxUnavailable: 0 值:

        使用kubectl edit 或 patch 的方式都可以。

kubectl patch deployments nginx-dm -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge" :1,"maxUnavailable": 0 }}}}'

2、更新镜像并立即暂停更新:kubectl rollout pause

kubectl set image deployments nginx-dm nginx=nginx:latest && kubectl rollout pause deployments nginx-dm

查看状态:kubectl rollout status

        此时的更新状态为暂停,如果查看Pod可以看到新版本的 ReplicaSet 控制的Pod只有一个,剩下的都是老版本的。此时可以通过 Service 或 Ingress 等资源的路由策略将一部分流量引入这个Pod。

kubectl rollout status deployments nginx-dm
Waiting for deployment "nginx-dm" rollout to finish: 1 out of 3 new replicas have been updated...

3、继续滚动更新:kubectl rollout resume

        如果新Pod没有问题则继续滚动更新。

kubectl rollout resume deployments nginx-dm && kubectl rollout status deployment nginx-dm



回滚deployment


回滚:kubectl rollout undo

        这样就可以回滚到之前的版本了。

kubectl rollout undo deployments nginx-dm

查看之前的版本:kubectl rollout history

kubectl rollout history deployments nginx-dm

回滚到指定的版本:--to-revision=8

kubectl rollout undo deployments nginx-dm --to-revision=8



扩容和缩容


手动扩缩容:

使用 kubectl scale 命令修改ReplicaSet 来扩容:

kubectl scale replicaset --replicas=2 nginx-dm-74754b979

使用 kubectl edit 来修改replicas 字段进行扩容:

kubectl edit deployments nginx-dm

修改资源文件的方式来扩容:

kubectl apply -f dm.yaml

自动扩缩容:

根据cpu的指标自动扩缩容:

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

也可以根据内存或其他指标进行自动扩缩容,详情:https://www.scriptjc.com/article/1136



示例


更新回滚示例:

kubectl run nginx-app --image=nginx:1.11.9-alpine --replicas=3
kubectl set image deployment/nginx-app nginx-app=nginx:1.12.0-alpine --record=true
kubectl rollout undo deployment/nginx-app

kubectl rollout history deployment nginx-app # 查看历史
kubectl rollout undo deployment nginx-app --to-revision=2  # 回滚到指定版本
kubectl rollout status deployment nginx-app


deployment官方文档:

https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/