• k8s--基础--14--deployment


    k8s–基础–14–deployment


    1、概念

    1. 是一个控制器,用于维护 同一个Pod 的数量。
    2. 为replicaSet和Pod提供了一个声明式更新的方法。
      1. 声明式更新:
        1. 修改配置文件:deployment_nginx.yaml
        2. 再执行命令:kubectl apply -f deployment_nginx.yaml
        3. 上面的操作能立马能生效,就是声明式更新
    3. 在Deployment对象中描述一个期望的状态(副本数),Deployment就会按照一定的控制速率把实际状态改成期望状态。

    1.1、作用

    1. Deployment可以使用声明式定义,直接在命令行通过纯命令的方式完成对应资源版本的内容的修改,也就是通过打补丁的方式进行修改,一般我们通过直接修改配置文件来更新
    2. Deployment能提供滚动式自定义自控制的更新,可以在实现更新时还可以实现控制更新节奏和更新逻辑

    1.1.1、什么叫做更新节奏和更新逻辑呢

    比如说ReplicaSet控制5个pod副本,pod的期望值是5个,但是升级的时候需要额外多几个pod,那么我们控制器可以控制在5个pod副本之外还能再增加几个pod副本;

    1.1.1.1、案例1

    比方说能多一个,但是不能少,那么升级的时候就是先增加一个,再删除一个,再增加一个删除一个,始终保持pod副本数是5个,但是有个别交叉之间是6个;

    1.1.1.2、案例2

    比方说最多允许多一个,最少允许少一个,也就是最多6个,最少4个,第一次加一个,删除两个,第二次加两个,删除1个,依次类推,可以自己控制更新方式

    1.1.1.3、总结

    案例1,案例2 说的就是滚动更新,需要加readinessProbe和livenessProbe探测,确保pod中容器里的应用都正常启动了才删除之前的pod;

    启动的第一步,刚更新第一批pod就暂停;假如目标是5个,允许一个也不能少,允许最多可以10个,那一次加5个即可;这就是我们可以自己控制节奏来控制更新的方法

    1.2、架构

    1.2.1、结构

    在这里插入图片描述

    1. 上面是Deployment,下面是replicaSet,绿色的表示处于活跃状态的replicaSet,一般只保留历史10个版本;
    2. Deployment是建立在replicaSet之上的,底层是replicaSet

    1.2.2、运行

    在这里插入图片描述

    1. Deployment是建构在replicaSet之上的,多个replicaSet组成一个Deployment,但是只有一个replicaSet处于活跃状态,当你更新到一个新版本的时候,只是创建了一个新的replicaSet,把旧的replicaSet替换掉了
    2. replicaSet的v1控制三个pod,删除一个,在replicaSet的v2上重新建立一个,依次类推,直到全部都是由replicaSet2控制,如果replicaSet v2有问题,还可以回滚

    1.2.3、怎么创建和删除Deployment

    1. 创建Deployment,会创建ReplicaSets,通过replicaset创建pod。
    2. 删除Deployment,会删除Deployment下对应的replicaSet,通过replicaset删除pod。

    1.3、使用场景

    1. 创建无状态的应用
    2. 滚动更新和回滚

    2、查看 部署一个deployment时需要哪些字段

    2.1、命令

    # 查看 deployment 的定义
    kubectl explain deployment 
    
    # 查看 spec 的定义
    kubectl explain deployment.spec
    # 查看 template 的定义
    kubectl explain deployment.spec.template
    
    # 查看 template.spec 的定义
    kubectl explain deployment.spec.template.spec
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果:这里只显示deployment 的定义

    
    [root@master1 ~]# kubectl explain deployment 
    KIND:     Deployment
    VERSION:  apps/v1
    
    DESCRIPTION:
         Deployment enables declarative updates forPodsand ReplicaSets.
    
    FIELDS:
       apiVersion	
         APIVersion defines the versioned schema of this representation of an
         object. Servers should convert recognized schemas to the latest internal
         value, and may reject unrecognized values. More info:
         https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
    
       kind	
         Kind is a string value representing the REST resource this object
         represents. Servers may infer this from the endpoint the client submits
         requests to. Cannot be updated. In CamelCase. More info:
         https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
    
       metadata	
         Standard object metadata.
    
       spec	
         Specification of the desired behavior of the Deployment.
    
       status	
         Most recently observed status of the Deployment.
    
    [root@master1 ~]# 
    
    
    
    • 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
    • 31
    • 32
    • 33

    说明

    1. 需要apiVersion,kind,metadata,spec字段
    2. kind:Deployment
    3. apiversion:apps/v1

    2.2、重要字段说明

    2.2.1、deployment.spec.template

    # 定义
    kubectl explain deployment.spec.template
    
    • 1
    • 2
    1. 定义一个Pod模板,且需要给pod模板设置标签。
      1. 注意:不要与其他控制器的选择器重叠。
    2. 这个就是当pod挂掉的时候,新启动的pod的模板

    2.2.2、deployment.spec.template.spec.restartPolicy

    # 定义
    kubectl explain deployment.spec.template.spec.restartPolicy
    
    • 1
    • 2
    1. 重启策略
    2. OnFailure
    3. Always:默认值

    2.2.3、deployment.spec.selector

    # 定义
    kubectl explain deployment.spec.selector
    
    • 1
    • 2
    1. 标签选择器。
    2. 可以选择它所匹配的拥有相同标签的pod。
    3. 当pod挂掉的时候,deployment就通过标签选择器,选择指定标签的pod模板,再通过pod模板创建pod。
    4. 在deployment中,deployment.spec.template.metadata.labels必须匹配deployment.spec.selector,否则将被API拒绝。

    注意:

    不应直接通过创建另一个Deployment或创建另一个控制器(例如ReplicaSet或ReplicationController)来创建其标签与该选择器匹配的其他Pod。如果这样做,则第一个Deployment会认为它创建了其他Pod。如果你有多个具有重叠选择器的控制器,则这些控制器将相互竞争,并且无法正常运行

    2.2.4、deployment.spec.replicas

    # 定义
    kubectl explain deployment.spec.replicas
    
    • 1
    • 2
    1. 指定要同时运行多少个 Pod。
    2. 在任何时间运行的 Pod 数量可能高于或低于 deployment.spec.replicas 指定的数量,例如在副本刚刚被增加或减少后、或者 Pod 正在被优雅地关闭、以及替换提前开始。
    3. 默认值:1

    2.2.5、deployment.spec.strategy

    # 定义
    kubectl explain deployment.spec.strategy
    
    • 1
    • 2

    指定用新Pods替换旧Pods的策略。

    2.2.6、deployment.spec.strategy.type

    # 定义
    kubectl explain deployment.spec.strategy.type
    
    • 1
    • 2
    1. 指定策略类型
    2. Recreate:
      1. 重建:所有现有的Pods在创建新Pods之前被杀死。
    3. RollingUpdate:
      1. 默认值
      2. 采取 滚动更新的方式更新Pods。可以指定maxUnavailable和maxSurge来控制滚动更新操作。

    2.2.7、deployment.spec.strategy.rollingUpdate.maxUnavailable

    # 定义
    kubectl explain deployment.spec.strategy.rollingUpdate.maxUnavailable
    
    • 1
    • 2
    1. 是一个可选字段
    2. 用于指定在更新过程中不可用的pod的最大数量
    3. 该值不能为0,可以是绝对数(例如5)或者所需pod的百分比(例如10%)
      1. 绝对数:按照四舍五入的百分比计算
    4. 默认值:25%
    5. 举例:
      1. 当此值设置为30%时,在滚动更新开始时,立即将旧的ReplicaSet缩小为所需Pod的70%。一旦准备好新的Pod,就可以进一步缩小旧的ReplicaSet的大小,然后按比例放大新的ReplicaSet,以确保更新期间始终可用的Pod总数至少为所需Pod的70%。

    2.2.8、deployment.spec.strategy.rollingUpdate.maxSurge

    # 定义
    kubectl explain deployment.spec.strategy.rollingUpdate.maxSurge
    
    • 1
    • 2
    1. 是一个可选字段
    2. 用于指定可以在所需数量的Pod上创建的最大Pod数量。
    3. 该值不能为0,可以是绝对数(例如5)或所需Pod的百分比(例如10%)。
      1. 绝对数是通过四舍五入从百分比中得出的
    4. 默认值:25%。
    5. 举例:
      1. 当此值设置为30%时,可以在滚动更新开始时立即按比例放大新的ReplicaSet,以使旧Pod和新Pod的总数不超过所需Pod的130%。一旦旧Pod被杀死,新的ReplicaSet便可以进一步扩展,以确保更新期间随时运行的Pod总数最多为所需Pod的130%。

    2.2.9、deployment.spec.progressDeadlineSecond

    # 定义
    kubectl explain deployment.spec.progressDeadlineSecond
    
    • 1
    • 2
    1. 是一个可选字段
    2. 用于指定在系统报告部署失败之前你要等待部署进行的秒数
    3. 默认值:600
    4. 此字段必须大于deployment.spec.minReadySeconds
    5. 举例:
      1. 以Type=Progressing, Status=False以及Reason=ProgressDeadlineExceeded资源的状态为例。deployment控制器将继续重试部署。将来,一旦实现自动回滚,Deployment控制器将在观察到这种情况后立即回滚Deployment

    2.2.10、deployment.spec.minReadySeconds

    # 定义
    kubectl explain  deployment.spec.minReadySeconds
    
    • 1
    • 2
    1. 是一个可选字段
    2. 用于指定新创建的Pod在不使其任何容器崩溃的情况下应准备就绪的最小秒数,以便将其视为可用。
    3. 默认值:0
      1. 准备就绪后,Pod将被视为可用

    2.2.11、deployment.spec.revisionHistoryLimit

    # 定义
    kubectl explain  deployment.spec.revisionHistoryLimit
    
    • 1
    • 2
    1. 是一个可选字段
    2. 用于指定要保留的可用于回滚的旧的replicaset的数量。
    3. deployment的修订历史记录存储在它的ReplicaSets中。因此,一旦删除了旧的ReplicaSet,你将无法回滚到该版本的Deployment。
    4. 默认值:10
      1. 将保留10个旧的ReplicaSet

    2.2.12、deployment.spec.paused

    # 定义
    kubectl explain  deployment.spec.paused
    
    • 1
    • 2
    1. 是一个可选的布尔字段
    2. 用于暂停和恢复部署。
    3. 暂停的Deployment和未暂停的Deployment之间的唯一区别
      1. 只要暂停,对暂停的Deployment的PodTemplateSpec所做的任何更改都不会触发新的rollouts(滚动更新)。
      2. 当创建时,默认情况下不会暂停deployment。

    3、案例:使用deployment部署一个无状态应用

    3.1、配置文件

    vim /root/test/deployment_nginx.yaml
    
    
    • 1
    • 2

    内容

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      # Deployment 的名称
      name: deployment-nginx
      # Deployment 的标签
      labels:
        k1: k1_la
        k2: k2_la
    spec:
      # 副本数目
      replicas: 3
      # 选择器
      selector:
        # 选择器匹配的标签
        matchLabels:
          nginx_pod: nginx_pod_la
      # Pod 模板
      template: 
        metadata:
          # Pod的标签
          labels:
            nginx_pod: nginx_pod_la
        spec:
          containers:
            # 容器名称
          - name: nginx
            # 镜像
            image: nginx
            # 镜像策略
            imagePullPolicy: IfNotPresent
            # 容器端口
            ports:
            - containerPort: 80
     
    
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35

    3.2、启动

    kubectl apply -f /root/test/deployment_nginx.yaml
    
    
    • 1
    • 2

    3.3、验证

    3.3.1、查看deployment

    kubectl get deployment
    
     
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    NAM: deployment的名称。
    READY:deployment有多少副本数。它遵循ready/desired的模式。
    UP-TO-DATE:显示已更新到所需状态的副本数。
    AVAILABLE:显示你的可以使用多少个应用程序副本。
    AGE:显示应用程序已运行的时间。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.3.2、查看replicaset

    因为创建deployment的时候会创建一个replicaset,replicaset会在后台创建pod,所以我们查看下

    kubectl get rs
    
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    NAME:ReplicaSet的名称。
    DESIRED:显示应用程序的所需副本数,这些副本数是在创建时定义的。这是所需的状态。
    CURRENT:显示当前正在运行多少个副本。
    READY:显示你的用户可以使用多少个应用程序副本。
    AGE:显示应用程序已运行的时间。
    
    
    ReplicaSet的名称规则: DEPLOYMENT-NAME-随机生成字符串
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.3.3、查看deployment对应的pod

    kubectl get pods | grep deployment-nginx
    
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    名称为:ReplicaSet的名称+随机数

    3.3.4、展示刚才创建的deployment详细信息

    kubectl describe deployment deployment-nginx
    
    
    • 1
    • 2

    在这里插入图片描述

    3.3.5、列出deployment创建的拥有标签是nginx_pod=nginx_pod_la的pods

    kubectl get pods -l nginx_pod=nginx_pod_la
    
    
    • 1
    • 2

    在这里插入图片描述

    3.3.6、更新deployment:更新nginx的镜像版本

    编辑配置文件,将nginx版本改为1.8

    vim /root/test/deployment_nginx.yaml
    
    
    • 1
    • 2

    在这里插入图片描述

    执行

    kubectl apply -f /root/test/deployment_nginx.yaml
    
    • 1

    查看该deployment创建的pods,可发现创建新的pod的同时删除了旧的pods

    kubectl get pods -l nginx_pod=nginx_pod_la
    
    • 1

    在这里插入图片描述

    3.3.7、通过增加副本数来扩容pod应用

    编辑配置文件,修改副本数为4

    vim /root/test/deployment_nginx.yaml 
    
    
    • 1
    • 2

    在这里插入图片描述

    执行

    kubectl apply -f /root/test/deployment_nginx.yaml
    
    • 1

    在这里插入图片描述

    3.3.8、查看历史版本

    kubectl rollout history deployment deployment-nginx
    
    • 1

    在这里插入图片描述

    3.3.9、按照指定版本回滚

    kubectl rollout undo deployment/deployment-nginx --to-revision=1 
    kubectl get pods -l nginx_pod=nginx_pod_la
    
    
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    在这里插入图片描述

    3.3.10、删除deployment

    kubectl delete deployment deployment-nginx
    kubectl get rs
    kubectl get pods -l nginx_pod=nginx_pod_la
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    spring boot配置文件中 Duration解析
    OkHttp搞定Http请求
    【C语言】break 关键字
    使用代理绕过网站的反爬机制
    用什么方式推广莆田鞋最好?C原版本真的能买吗
    EditorConfig + Prettier + ESLint 代码规范化
    SpringCloud Gateway 3.x 响应头添加 Skywalking TraceId
    java计算机毕业设计小区物业管理系统MyBatis+系统+LW文档+源码+调试部署
    pytest(6)-Fixture(固件)
    第09讲:SkyWalking Agent 启动流程剖析,领略微内核架构之美
  • 原文地址:https://blog.csdn.net/zhou920786312/article/details/126232584