概念:
    image.png

    Deployment为Pod和Replica Set(下一代Replication Controller)提供声明式更新

    只需要在 Deployment 中描述想要的目标状态,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态,也可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换

    典型的用例如下:

    1. 使用Deployment来创建ReplicaSet,ReplicaSet在后台创建pod,检查启动状态

    2. 通过更新Deployment的PodTemplateSpec字段来声明Pod的新状态,这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新的ReplicaSet中

    3. 如果当前状态不稳定,回滚到之前的Deployment revision,每次回滚都会更新Deployment的revision

    4. 扩容Deployment以满足更高的负载

    5. 暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线

    6. 根据Deployment 的状态判断上线是否hang住了

    7. 清除旧的不必要的 ReplicaSet

    deployment.spec官方定义所需字段:
    image.png

    [root@master ~]# kubectl explain deploy.spec.

    KIND: Deployment
    VERSION: extensions/v1beta1 #现在最新式apps/v1

    minReadySeconds

    paused #暂停

    progressDeadlineSeconds

    replicas #replicas

    revisionHistoryLimit #保存历史版本数量,用于回滚,默认10

    rollbackTo #回滚

    selector #选择器,和replicaset的一样

    strategy #更新策略,策略如下:
    rollingUpdate滚动更新,如果使用rollingUpdate,内部还可以定义更新粒度
    Recreate重建更新
    maxSurge #更新时最多可超出副本数 可以是数量和百分比
    maxUnavailable #最大不可用 可以是数量和百分比,和上面的maxSurge不能同为0

    template -required- #模板,和replicaset的一样

    创建示例:
    image.png

    [root@master manifests]# vim deploy-damo.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: myapp-deploy
    namespace: default
    spec:
    replicas: 2
    selector:
    matchLabels:
    app: myapp
    release: canary
    template:
    metadata:
    labels:
    app: myapp
    release: canary
    spec:
    containers:
    - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
    containerPort: 80

    [root@master manifests]# kubectl apply -f deploy-damo.yaml
    deployment.apps/myapp-deploy created

    Deployment更新与查看:
    image.png

    [root@master manifests]# kubectl apply -f deploy-damo.yaml ( apply表示声明式创建,也可以用来更新 )

    Deployment扩容:
    image.png

    [root@master manifests]# vim deploy-damo.yaml
    replicas: 4

    [root@master manifests]# kubectl apply -f deploy-damo.yaml
    deployment.apps/myapp-deploy configured

    直接编辑deploy-damo.yaml,副本数修改为4,然后使用kubectl apply -f 更新 也可以使用-w 监控实时更新

    Deployment回滚:
    image.png

    默认情况下,kubernetes 会在系统中保存前两次的 Deployment 的 rollout 历史记录,以便可以随时回退(您可以修改revision history limit来更改保存的revision数)

    注意: 只要 Deployment 的 rollout 被触发就会创建一个 revision,也就是说当且仅当 Deployment 的 Pod template(如.spec.template)被更改,例如更新template 中的 label 和容器镜像时,就会创建出一个新的 revision

    其他的更新,比如扩容 Deployment 不会创建 revision——因此我们可以很方便的手动或者自动扩容,这意味着当您回退到历史 revision 时,只有 Deployment 中的 Pod template 部分才会回退

    [root@master ~]# kubectl rollout history deploy myapp-deploy #查看升级记录
    deployment.extensions/myapp-deploy
    REVISION CHANGE-CAUSE
    9
    10
    这里在创建deployment时没有增加—record参数,所以并不能看到revision的变化,在创建 Deployment 的时候使用了—record参数可以记录命令,就可以方便的查看每次 revision 的变化

    [root@master ~]# kubectl rollout history deployment/myapp-deploy —revision=10(查看单个revision的 详细信息)

    [root@master ~]# kubectl rollout undo deployment/myapp-deploy( 回滚历史版本,默认是上一个版本 )
    deployment.extensions/myapp-deploy rolled back

    [root@master ~]# kubectl rollout undo deployment/myapp-deploy —to-revision=11( 使用 —to-revision参数指定某个历史版本 )
    deployment.extensions/myapp-deploy skipped rollback (current template already matches revision 11)

    相关文档:https://www.cnblogs.com/wlbl/p/10694306.html