• 6.Deployment控制器


    1.Deployment控制器概念

    Deployment官方文档

    Deployment是kubernetes中最常用的资源对象,为ReplicaSet和Pod的创建提供了一种声明式的定义方法,在Deployment对象中描述一个期望的状态,Deployment控制器就会按照一定的控制速率把实际状态改成期望状态,通过定义一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建pod,删除Deployment控制器,也会删除Deployment控制器下对应的ReplicaSet控制器和pod资源.

    使用Deployment而不直接创建ReplicaSet是因为Deployment对象拥有许多ReplicaSet没有的特性,例如滚动升级和回滚。

    声明式定义是指直接修改资源清单yaml文件,然后通过kubectl apply -f 资源清单yaml文件,就可以更改资源

    Deployment控制器是建立在rs之上的一个控制器,可以管理多个rs,每次更新镜像版本,都会生成一个新的rs,把旧的rs替换掉,多个rs同时存在,但是只有一个rs运行。

    image
    rs v1控制三个pod,删除一个pod,在rs v2上重新建立一个,依次类推,直到全部都是由rs v2控制,如果rs v2有问题,还可以回滚,Deployment是建构在rs之上的,多个rs组成一个Deployment,但是只有一个rs处于活跃状态.

    2.Deployment工作原理

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

    比如说Deployment控制5个pod副本,pod的期望值是5个,但是升级的时候需要额外多几个pod,那我们控制器可以控制在5个pod副本之外还能再增加几个pod副本;比方说能多一个,但是不能少,那么升级的时候就是先增加一个,再删除一个,增加一个删除一个,始终保持pod副本数是5个;还有一种情况,最多允许多一个,最少允许少一个,也就是最多6个,最少4个,第一次加一个,删除两个,第二次加两个,删除两个,依次类推,可以自己控制更新方式,这种滚动更新需要加readinessProbe和livenessProbe探测,确保pod中容器里的应用都正常启动了才删除之前的pod。
    启动第一步,刚更新第一批就暂停了也可以;假如目标是5个,允许一个也不能少,允许最多可以10个,那一次加5个即可;这就是我们可以自己控制节奏来控制更新的方法。

    通过Deployment对象,你可以轻松的做到以下事情:

    • 创建ReplicaSet和Pod
    • 滚动升级(不停止旧服务的状态下升级)和回滚应用(将应用回滚到之前的版本)
    • 平滑地扩容和缩容
    • 暂停和继续Deployment

    3.Deployment资源清单

    [root@master1 ~]# kubectl explain deploy
    KIND:     Deployment
    VERSION:  apps/v1
    DESCRIPTION:
         Deployment enables declarative updates for Pods and ReplicaSets.
    FIELDS:
       apiVersion	<string> #该资源使用的api版本
         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	<string> #创建的资源是什么?
         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	<Object> #元数据,包括资源的名字和名称空间
         Standard object metadata.
       spec	<Object> #定义具体容器
         Specification of the desired behavior of the Deployment.
       status	<Object> #状态,不可以修改
         Most recently observed status of the Deployment.
    

    spec

    [root@master1 ~]# kubectl explain deploy.spec
    KIND:     Deployment
    VERSION:  apps/v1
    
    RESOURCE: spec <Object>
    
    DESCRIPTION:
         Specification of the desired behavior of the Deployment.
    
         DeploymentSpec is the specification of the desired behavior of the
         Deployment.
    
    FIELDS:
       minReadySeconds	<integer> # pod再启动后需要多长时间才能提供服务,默认0s
       paused	<boolean> # 在部署更新的时候pod先暂停,不是立即更新
       progressDeadlineSeconds	<integer> # k8s 在升级过程中有可能由于各种原因升级卡住(这个时候还没有明确的升级失败),比如在拉取被墙的镜像,权限不够等错误。那么这个时候就需要有个 deadline ,在 deadline 之内如果还卡着,那么就上报这个情况,这个时候这个 Deployment 状态就被标记为 False,并且注明原因。但是它并不会阻止 Deployment 继续进行卡住后面的操作。完全由用户进行控制。默认600s
       replicas	<integer> # 副本数,默认1
       revisionHistoryLimit	<integer> # 保留历史版本数量,默认10
       selector	<Object> # 标签选择器,选择它关联的pod,必填项
       strategy	<Object> # 更新策略
       template	<Object> # 定义的pod模板
    

    更新策略

    [root@master1 ~]# kubectl explain deploy.spec.strategy
    KIND:     Deployment
    VERSION:  apps/v1
    RESOURCE: strategy <Object>
    DESCRIPTION:
         The deployment strategy to use to replace existing pods with new ones.
         DeploymentStrategy describes how to replace existing pods with new ones.
    FIELDS:
       rollingUpdate	<Object> #滚动更新,定义滚动更新方式,也就是pod能多几个,少几个
       type	<string> #支持两种更新,Recreate和RollingUpdate Recreate是重建式更新,删除一个更新一个
    

    滚动更新

    [root@master1 ~]# kubectl explain deploy.spec.strategy.rollingUpdate
    KIND:     Deployment
    VERSION:  apps/v1
    RESOURCE: rollingUpdate <Object>
    DESCRIPTION:
         Rolling update config params. Present only if DeploymentStrategyType =
         RollingUpdate.
         Spec to control the desired behavior of rolling update.
    FIELDS:
       maxSurge	<string>
       # 我们更新的过程当中最多允许超出的指定的目标副本数有几个;
       # 它有两种取值方式,第一种直接给定数量,第二种根据百分比,
       # 百分比表示原本是5个,最多可以超出20%,那就允许多一个,最多可以超过40%,那就允许多两个
       maxUnavailable	<string>
       #最多允许几个不可用,假设有5个副本,最多一个不可用,就表示最少有4个可用
    

    template

    [root@master1 ~]# kubectl explain deploy.spec.template
    KIND:     Deployment
    VERSION:  apps/v1
    RESOURCE: template <Object>
    DESCRIPTION:
         Template describes the pods that will be created.
         PodTemplateSpec describes the data a pod should have when created from a
         template
    FIELDS:
       metadata	<Object> # 定义模板的名字
       spec	<Object> # template中不包含apiVersion和Kind属性,要求必须有metadata。deployment.spec.template.spec为容器的属性信息,其他定义内容和Pod一致。
    

    清单示例

    apiVersion: apps/v1  #deployment对应的api版本
    kind: Deployment    #创建的资源是deployment
    metadata:
      name: myapp-v1   #deployment的名字
    spec:
      replicas: 2     #deployment管理的pod副本数
      selector:       #标签选择器
       matchLabels:  # matchLabels下定义的标签需要跟template.metadata.labels定义的标签一致
        app: myapp
        version: v1
      template:
       metadata:
        labels:
         app: myapp
         version: v1
       spec:   #定义容器的属性
        containers:
        - name: myapp
          image: janakiramm/myapp:v1 #容器使用的镜像
          imagePullPolicy: IfNotPresent  #镜像拉取策略
          ports:
          - containerPort: 80     #容器里的应用的端口
    

    4.滚动更新

    滚动更新就是编辑资源清单修改副本数量和镜像名称可以使用rollout history查看更新历史

    [root@master1 ~]# kubectl rollout history deployment myapp-v1
    deployment.apps/myapp-v1
    REVISION  CHANGE-CAUSE
    2         <none>
    3         <none>
    

    回滚

    
    [root@xianchaomaster1 ~]# kubectl rollout undo deployment myapp-v1 --to-revision=1
    deployment.apps/myapp-v1 rolled back
    
  • 相关阅读:
    2 初学函数,求幂指数练手程序
    1 批量生成虚拟姓名
    Python 中 time 模块与 datetime 模块在使用中的不同之处
    feature selection&feature abstraction降维
    拿到样本简单的清洗操作
    使用sklearn做单机特征工程
    tensorflow安装
    PCA数学角度解析
    使用Python进行描述性统计【解决了实习初期的燃眉之急】
    类、对象、属性、方法、类的成员
  • 原文地址:https://www.cnblogs.com/forlive/p/15945019.html
Copyright © 2020-2023  润新知