• Deployment介绍


    一、什么是Deployment?

    	用于部署无状态的服务,这个最常用的控制器。一般用于管理维护企业内部无状态的微服务,比如configserver、zuul、springboot。他可以管理多个副本的Pod实现无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。
           用于部署无状态的服务!!!
    

    二、 创建一个Deployment

    2.1、手动创建

    [root@k8s-master01 ~]# kubectl create deployment nginx --image=nginx:1.15.2
    deployment.apps/nginx created
    

    2.2、使用文件创建

    # 查看手动创建的nginx的yaml文件,然后把f开头的删了,且删了最后的status标签的内容,得到下面的yaml文件
    [root@k8s-master01 ~]# kubectl  get deployment nginx -o yaml > nginx-deploy.yaml
    
    cat > nginx-deploy.yaml << EFO
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
        deployment.kubernetes.io/revision: "1"
      creationTimestamp: "2020-12-22T00:07:49Z"
      generation: 1
      labels:
        app: nginx
      name: nginx
      namespace: default
      resourceVersion: "73782"
      uid: 6186f4c7-50bc-45d0-9ed4-916b311802eb
    spec:
      progressDeadlineSeconds: 600
      replicas: 1               # 副本数
      revisionHistoryLimit: 10  # 历史记录保留的个数
      selector:
        matchLabels:
          app: nginx
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx:1.15.2
            imagePullPolicy: IfNotPresent
            name: nginx
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    EFO
    
    # 使用以下命令去新建一个deployment
    [root@k8s-master01 ~]# kubectl replace -f nginx-deploy.yaml 
    deployment.apps/nginx replaced
    
    # 在线更改yaml,管理deployment    ---把副本数改为2
    [root@k8s-master01 ~]# kubectl edit deploy  nginx 
    
    # 查看是否生成2个副本
    [root@k8s-master01 ~]# kubectl get po
    NAME                     READY   STATUS             RESTARTS   AGE
    nginx-66bbc9fdc5-c6l6t   1/1     Running            0          57s
    nginx-66bbc9fdc5-hsv4d   1/1     Running  		    0          34m
    

    2.3、状态解析

    [root@k8s-master01 ~]# kubectl get deploy -owide
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
    nginx   2/2     2            1           35m   nginx        nginx:1.15.2   app=nginx
    
     NAME: Deployment名称
     READY:Pod的状态,已经Ready的个数
     UP-TO-DATE:已经达到期望状态的被更新的副本数
     AVAILABLE:已经可以用的副本数
     AGE:显示应用程序运行的时间
     CONTAINERS:容器名称
     IMAGES:容器的镜像
     SELECTOR:管理的Pod的标签
    

    三、Deployment的更新

    3.1、更改deployment的镜像并记录

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

    3.2、查看更新过程

    [root@k8s-master01 ~]# kubectl rollout status deploy nginx
    Waiting for deployment "nginx" rollout to finish: 1 out of 3 new replicas have been updated...
    
    # 或者使用describe查看
    [root@k8s-master01 ~]# kubectl describe deploy nginx 
    

    四、Deployment的回滚

    3.1、回滚到上一个版本(一般都是回滚到上一个版本)

    # 例如错误的更新到了一个xxx版本
    [root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:xxx --record   
    deployment.apps/nginx image updated
    
    # 查看kubectl更新的历史命令
    [root@k8s-master01 ~]# kubectl rollout history deploy nginx 
    deployment.apps/nginx 
    REVISION  CHANGE-CAUSE
    1         <none>
    2         kubectl set image deploy nginx nginx=nginx:1.15.3 --record=true
    3         kubectl set image deploy nginx nginx=nginx:xxx --record=true
    
    # 回滚到上一个版本
    [root@k8s-master01 ~]# kubectl rollout undo deploy nginx
    deployment.apps/nginx rolled back
    

    3.2、回滚到指定版本(较少,但是得掌握)

    # 多次更新错误版本
    [root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:aa --record
    deployment.apps/nginx image updated
    [root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:bb --record
    deployment.apps/nginx image updated
    [root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:cc --record
    deployment.apps/nginx image updated
    
    # 查看kubectl更新的历史命令
    [root@k8s-master01 ~]# kubectl rollout history deploy nginx 
    deployment.apps/nginx 
    REVISION  CHANGE-CAUSE
    1         <none>
    3         kubectl set image deploy nginx nginx=nginx:xxx --record=true
    4         kubectl set image deploy nginx nginx=nginx:1.15.3 --record=true
    5         kubectl set image deploy nginx nginx=nginx:aa --record=true
    6         kubectl set image deploy nginx nginx=nginx:bb --record=true
    7         kubectl set image deploy nginx nginx=nginx:cc --record=true
    
    # 查看指定版本的详细信息 ---看revision对应的数字即可
    [root@k8s-master01 ~]# kubectl rollout history deploy nginx --revision=4
    deployment.apps/nginx with revision #4
    Pod Template:
      Labels:       app=nginx
            pod-template-hash=5dfc8689c6
      Annotations:  kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.15.3 --record=true
      Containers:
       nginx:
        Image:      nginx:1.15.3
        Port:       <none>
        Host Port:  <none>
        Environment:        <none>
        Mounts:     <none>
      Volumes:      <none>
      
    # 回滚到指定版本
    [root@k8s-master01 ~]# kubectl rollout undo deploy nginx --to-revision=4
    deployment.apps/nginx rolled back
    

    五、Deployment的扩容与缩容

    5.1、Deployment的扩容

    # Deployment的扩容与缩容,不会生成新的rs
    [root@k8s-master01 ~]# kubectl  scale  --replicas=4  deploy nginx 
    deployment.apps/nginx scaled
    
    # --replicas  # 指定副本数
    # nginx  	  # pod的名字
    
    # 查看rs
    [root@k8s-master01 ~]# kubectl get rs
    

    5.2、Deployment的缩容

    # Deployment的扩容与缩容,不会生成新的rs
    [root@k8s-master01 ~]# kubectl  scale  --replicas=1  deploy nginx
    deployment.apps/nginx scaled
    
    # --replicas  # 指定副本数
    # nginx  	  # pod的名字
    
    # 查看rs
    [root@k8s-master01 ~]# kubectl get rs
    

    六、Deployment的暂停和恢复

    • deployment可以在线edit更改(可以一次性更改多个)
    • 也可以用kubectl set image更改(也可以一次性更改多个,但是需要使用到Deployment的暂停和恢复功能)

    6.1、Deployment 暂停功能

    # 暂停
    [root@k8s-master01 ~]# kubectl rollout pause deployment nginx
    deployment.apps/nginx paused
    
    # 第一次更新
    [root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:1.15.4 --record
    deployment.apps/nginx image updated
    
    # 第二次更新、添加内存、CPU
    [root@k8s-master01 ~]# kubectl set resources deploy nginx -c nginx --limits=cpu=200m,memory=128Mi --requests=cpu=10m,memory=16Mi
    deployment.apps/nginx resource requirements updated
    
    # 查看被更改以后的nginx镜像的deployment
    [root@k8s-master01 ~]# kubectl get deploy nginx -oyaml
    

    6.2、Deployment 恢复功能

    # 更新完想更新的内容后,然后恢复镜像
    [root@k8s-master01 ~]# kubectl rollout resume deploy nginx 
    deployment.apps/nginx resumed
    
    # 查看rs,看到有新的
    [root@k8s-master01 ~]# kubectl get rs
    NAME                DESIRED   CURRENT   READY   AGE
    nginx-5b6bc78b67    1         1         0       41s
    

    七、Deployment注意事项

    .spec.revisionHistoryLimit:设置保留RS旧的revision的个数,设置为0的话,不保留历史数据
    
    .spec.minReadySeconds:可选参数,指定新创建的Pod在没有任何容器崩溃的情况下视为Ready最小的秒数,默认为0,即一旦被创建就视为可用。
    
    滚动更新的策略:
    	.spec.strategy.type:更新deployment的方式,默认是RollingUpdate
    		RollingUpdate:滚动更新,可以指定maxSurge和maxUnavailable
    			maxUnavailable:指定在回滚或更新时最大不可用的Pod的数量,可选字段,默认25%,可以设置成数字或百分比,如果该值为0,那么maxSurge就不能0
    			maxSurge:可以超过期望值的最大Pod数,可选字段,默认为25%,可以设置成数字或百分比,如果该值为0,那么maxUnavailable不能为0
    		Recreate:重建,先删除旧的Pod,在创建新的Pod
    
  • 相关阅读:
    Deployment progressDeadlineSeconds
    go字符串转[]bytes
    shell单引号内嵌套单引号即可使用变量
    ensp 模拟 calico 跨网段 bgp 网络
    如何利用termination GracePeriodSeconds 优雅地关闭你的服务
    gin是怎么传参数
    垃圾代码评析——关于《C程序设计伴侣》9.4——链表(三)
    垃圾“程序是怎样练成的”——关于《C程序设计伴侣》第A章(五)
    垃圾代码评析——关于《C程序设计伴侣》9.4——链表(四)
    垃圾“程序是怎样炼成的”——关于《C程序设计伴侣》第A章(二)
  • 原文地址:https://www.cnblogs.com/hsyw/p/14171076.html
Copyright © 2020-2023  润新知