• 四、K8S之Deployment


    一、概述

    K8S中,Deployment是一种更高层级的控制器,用于管理应用程序的部署和更新。为 Pod和 ReplicaSet提供声明式的更新能力。比如:

    • 部署ReplicaSet(副本集)

    • 清理不再需要的旧版RS

    • 扩展/缩小RS里的Pod数量

    • 动态更新Pod(根据Pod模板定义的更新用新Pod替换旧Pod)

    • 回滚到以前的Deployment版本

    二、体验Deployment

    • 1、使用命令指定镜像创建
    kubectl create deploy nginx-deploy --image nginx
    
    • 1
    • 2、查看deploy资源
    kubectl get deploy 
    
    ------------------------------------------------------------
    NAME           READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deploy   1/1     1            1           7m38s
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里就会得到一个名为 nginx-deploy 的deploy资源,而我们知道Deployment不直接控制Pod,是先控制ReplicaSe,所以先查看replicaSet资源

    • 2、获取replicaSet资源信息
    kubectl get replicaSet
    
    ------------------------------------------------------------
    NAME                      DESIRED   CURRENT   READY   AGE
    nginx-deploy-6c758c8d46   1         1         1       10m
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里的名字是有规律的,在 nginx-deploy 后面加上了随机字符-6c758c8d46作为replicaSet的资源名称。

    • 3、再看一下Pod
    kubectl get po
    
    ------------------------------------------------------------
    NAME                            READY   STATUS    RESTARTS   AGE
    nginx-deploy-6c758c8d46-5swnb   1/1     Running   0          20m
    
    • 1
    • 2
    • 3
    • 4
    • 5

    最后发现他们的是有联系,在nginx-deploy-6c758c8d46后面又多了随机字符作为pod的名称

    • 4、删除Pod会怎么样?
    kubectl delete pods nginx-deploy-6c758c8d46-5swnb
    
    • 1
    • 5、再看Pod信息
    kubectl get po
    
    • 1

    发现pod又出来了一个,但名字变了,说明Deployment也确实在帮我们管理的pod信息

    • 6、查看yaml文件

    我们虽然是直接用的命令来创建deployment,但K8S也帮我们创建了一个配置文件,使用口令可查看

    kubectl get deploy  nginx-deploy -o yaml
    
    • 1

    把配置内容简化并且加上注释得到

    apiVersion: apps/v1
    kind: Deployment
    metadata: #元信息
      labels: #配置的标签名称
        app: nginx-deploy
      name: nginx-deploy #Deployment的名称
      namespace: default #所用的命名空间
    spec:
      replicas: 1 # 期望副本数量
      revisionHistoryLimit: 10 #进行滚动更新后,保留的历史版本数
      selector: # !关键,是叫选择器,用于找到匹配RS的重要条件
        matchLabels: # 按照标签匹配
          app: nginx-deploy
      strategy: # 更新策略
        type: RollingUpdate # 更新类型,采用滚动更新
        rollingUpdate: # 滚动更新配置
          maxSurge: 25% #进行滚动更新时,更新的个数最多可以超过多少个数/比率
          maxUnavailable: 25% # 进行滚动更新时,允许多少个数/比率失败
      template: #描述pod的模板
        metadata: #描述Pod的元信息
          labels: # 设置pod的标签
            app: nginx-deploy
        spec: #pod期望信息
          containers: #容器配置信息
          - image: nginx 
            imagePullPolicy: Always #拉取策略
            name: nginx
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          terminationGracePeriodSeconds: 30 #删除超时时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    三、滚动更新

    滚动更新主要目标是无缝地将旧版本的Pod替换成新版本的Pod,采用逐步增加新版本Pod的副本数,同同时逐渐减少旧的版本的副本数量,以实现应用程序的平滑升级,这样可以确保应用程序在整个更新过程中持续提供服务

    3.1、创建Deploy文件
    • 创建文件
    touch nginx-deploy.yaml
    
    • 1
    • 编辑内容
    apiVersion: apps/v1
    kind: Deployment
    metadata: #元信息
      labels: #配置的标签名称
        app: nginx-deploy
      name: nginx-deploy #Deployment的名称
      namespace: default #所用的命名空间
    spec:
      replicas: 1 # 期望副本数量
      revisionHistoryLimit: 10 #进行滚动更新后,保留的历史版本数
      selector: # !关键,是叫选择器,用于找到匹配RS的重要条件
        matchLabels: # 按照标签匹配
          app: nginx-deploy
      strategy: # 更新策略
        type: RollingUpdate # 更新类型,采用滚动更新
        rollingUpdate: # 滚动更新配置
          maxSurge: 25% #进行滚动更新时,更新的个数最多可以超过多少个数/比率
          maxUnavailable: 25% # 进行滚动更新时,允许多少个数/比率失败
      template: #描述pod的模板
        metadata: #描述Pod的元信息
          labels: # 设置pod的标签
            app: nginx-deploy
        spec: #pod期望信息
          containers: #容器配置信息
          - image: nginx:1.7.9
            imagePullPolicy: IfNotPresent #拉取策略
            name: nginx
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          terminationGracePeriodSeconds: 30 #删除超时时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 创建deployment
    kubectl create -f nginx-deploy.yaml
    
    • 1
    3.2、修改副本数
    • 获取deploy信息
    kubectl get deploy
    
    ------------------------------------------
    NAME           READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deploy   1/1     1            1           23m
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里看UP-TO-DATE列(更新数),为1

    • 修改副本数为3
    kubectl edit deploy nginx-deploy
    
    # 将下面信息修改为3
    spec.replicas=3
    
    • 1
    • 2
    • 3
    • 4
    • 再次查看已成功修改了
    kubectl get deploy
    
    ------------------------------------------
    NAME           READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deploy   3/3     3            3           33m
    
    • 1
    • 2
    • 3
    • 4
    • 5
    3.3、滚动更新
    • 修改nginx镜像版本
    kubectl set image deployment/nginx-deploy nginx=nginx:1.9.1 --record
    
    • 1

    可以使用命令,也可以进到配置文件里修改, --record 是用来记录修改的内容

    • 查看滚动更新信息
    kubectl rollout status deploy nginx-deploy
    
    • 1
    • 查deploy的详细信息
    kubectl describe deploy  nginx-deploy
    
    ----------------------------------------------------------
    
      Type    Reason             Age   From                   Message
      ----    ------             ----  ----                   -------
      Normal  ScalingReplicaSet  55m   deployment-controller  Scaled up replica set nginx-deploy-78d8bf4fd7 to 3
      Normal  ScalingReplicaSet  47m   deployment-controller  Scaled up replica set nginx-deploy-754898b577 to 1
      Normal  ScalingReplicaSet  44m   deployment-controller  Scaled down replica set nginx-deploy-78d8bf4fd7 to 2
      Normal  ScalingReplicaSet  44m   deployment-controller  Scaled up replica set nginx-deploy-754898b577 to 2
      Normal  ScalingReplicaSet  38m   deployment-controller  Scaled down replica set nginx-deploy-78d8bf4fd7 to 1
      Normal  ScalingReplicaSet  38m   deployment-controller  Scaled up replica set nginx-deploy-754898b577 to 3
      Normal  ScalingReplicaSet  38m   deployment-controller  Scaled down replica set nginx-deploy-78d8bf4fd7 to 0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 分析日志
    Scaled up replica set nginx-deploy-78d8bf4fd7 to 3
    Scaled up replica set nginx-deploy-754898b577 to 1
    Scaled down replica set nginx-deploy-78d8bf4fd7 to 2
    Scaled up replica set nginx-deploy-754898b577 to 2
    Scaled down replica set nginx-deploy-78d8bf4fd7 to 1
    Scaled up replica set nginx-deploy-754898b577 to 3
    Scaled down replica set nginx-deploy-78d8bf4fd7 to 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    看日志得出,先是修改的**replica(nginx-deploy-78d8bf4fd7)副本数为3,随后创建新的replica(nginx-deploy-754898b577)**,副本数为1,当新的replica启动1个后,则旧的replica副本数旧副本数就减少1个,依次类推,直到新的replica启动了3个,旧的replica剩下0个

    • 查看RS信息
    kubectl get rs
    
    -----------------------------------------
    nginx-deploy-754898b577   3         3         3       56m
    nginx-deploy-78d8bf4fd7   0         0         0       96m
    
    • 1
    • 2
    • 3
    • 4
    • 5

    四、版本回滚

    • 查看历史版本
    kubectl rollout history deployment/nginx-deploy
    
    • 1
    • 查看具体的版本信息
     kubectl rollout history deployment/nginx-deploy --revision=2 
    
    • 1
    • 回退得上一个版本
    kubectl rollout undo deployment/nginx-deploy 
    
    • 1
    • 指定版本回退
    kubectl rollout undo deployment/nginx-deploy --to-revision=2
    
    • 1
    • 调整保留的历史版本数
    #默认为10 ,设置为0,则代表不能回滚
    .spec.revisonHistoryLimit=10
    
    • 1
    • 2

    五、扩缩容和更新暂停

    5.1、扩缩容

    每次调整副本数去修改文件会觉得麻烦,可以直接使用命令 的方式实现副本数的调整

    kubectl scale --replicas=xx deploy nginx-deploy
    
    • 1
    5.2、更新的暂停和恢复

    在知道需要修改多次配置文件,不想每次修改完执行更新操作,可以使用命令暂停更新

    • 暂停
     kubectl rollout pause deployment nginx-deploy
    
    • 1
    • 恢复
    kubectl rollout resume deploy nginx-deploy
    
    • 1
  • 相关阅读:
    openpyxl: Value must be either numerical or a string containing a wildcard
    FFmpeg进阶: 截取视频生成gif动图
    【linux内核中的双向链表-02】list_for_each_safe
    spring boot中使用Bean Validation做优雅的参数校验
    智能制造容器平台架构设计与实战
    Spring 从入门到精通 (十) 复杂对象详解
    铁塔基站用能监控能效解决方案
    图像处理之图像质量评价指标PSNR(峰值信噪比)
    深入理解线段树
    Java 发送 Http 请求工具类(HttpClient)
  • 原文地址:https://blog.csdn.net/qq_39381892/article/details/133849019