• deployment的yaml说明


    k8s中deployment资源的yaml文件介绍

    yaml介绍

    基本语法

    • 大小写敏感
    • 使用缩进表示层级关系
    • 缩进不允许使用tab,只允许使用空格
    • 缩进的空格数不重要,只要相同层级的元素左对齐即可

    数据类型

    • 对象

      对象键值对使用冒号结构表示key: value,冒号后面要加一个空格

      key: 
           child-key1: value1
           child-key2: value2
      
      • 1
      • 2
      • 3
    • 数组

      -开头的行表示构成一个数组

      - value1
      - value2
      - value2
      
      • 1
      • 2
      • 3
    • 纯量

      字符串、布尔值、整数、浮点数、Null、时间、日期

    deployment的yaml文件介绍

    deployment总共包含5个属性

    1. apiVersion:资源的版本号
    2. kind:资源的类型
    3. metadata:资源的元数据信息
    4. spec:资源的规格说明和预期状态
    5. status:资源的实际状态

    metadata

    metadata:
      annotations: 							# 自定义注释列表
      generation: 
      labels: 									# 标签,用于标识该资源
        app: 
        version: 
      name: 										# deployment名称,同一个命名空间下该名称不可重复
      namespace: 								# deploymetn所属命名空间
      resourceVersion:
      selfLink:
      uid:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在线服务场景中,会同时存在多个版本的模型服务,每个版本的模型服务都会对应一个deployment,所有版本的模型服务共用一个service。此时,通过labels:app:deploymentservice进行关联,又通过app+version对同一service下不同的deployment进行区分。

    spec

    1. spec.progressDeadlineSeconds

      可选字段,表示deployment controller等待多少秒才能确定(通过deployment statusdeployment进程卡住了,单位:秒

    2. spec.replicas

      可选字段,指定期望的pod数量,默认是1

    3. spec.revisionHistoryLimit

      可选字段,用来指定可以保留的旧的ReplicaSet数量,余下的将在后台被当作垃圾收集,用于历史版本回滚

    4. spec.selector

      可选字段,用来指定deployment管理的pod的范围

    5. spec.strategy

      用来指定新的pod替换旧的pod的策略,包括RollingUpdateRecreate两种:

      • RollingUpdate
        • 使用滚动的方式更新pod
        • 通过配置项maxUnavailable来指定在升级过程中不可用pod的最大数量;该值既可以是绝对值,也可以是百分比;通过百分比计算的绝对值向下取整
        • 通过配置项maxSurge来指定可以超过期望的pod数量的最大个数;该值既可以是绝对值,也可以是百分比;通过百分比计算的绝对值向上取整;
      • Recreate
        • 在创建出新的pod之前会先杀掉所有已存在的pod
    6. spec.template

      必填字段,设置deployment控制的pod的样式,它跟 pod有一模一样的schema,是嵌套的类型,并且不需要apiVersion kind字段。

    spec.template: 
        metadata:
          creationTimestamp: null
          labels:
            app: 
            version: 
        spec:
          containers:
          - env:                      # 容器内的环境变量列表,详情见6.1
            image:                    # 容器所对应镜像的名称
            imagePullPolicy:          # 容器拉取镜像的策略,详情见6.2
            name:                     # 容器的名称
            ports:                    # 容器内部需要暴露的端口号列表
            - containerPort: 8888     # 端口号 
              name: aipaas            # 端口号名称
              protocol: TCP           # 端口协议,支持TCP和UDP,默认TCP
            readinessProbe:           # 健康检测,详见6.3
            resources:                # 资源配置,详见6.4
            terminationMessagePath: /dev/termination-log #日志保存路径
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst     # DNS策略
          nodeSelector:               # Pod调度策略,详见6.5
          restartPolicy:              # 容器重启策略,详见6.6
          schedulerName:              # 调度器,详见6.7
          terminationGracePeriodSeconds: # 容器删除策略,详见6.8
          securityContext: {}
    
    • 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

    6.1 环境变量

    spec.containers.env: 
        - name: VECLIB_MAXIMUM_THREADS
          value: "1"
        - name: MKL_NUM_THREADS
          value: "1"
        - name: NUMEXPR_NUM_THREADS
          value: "1"
        - name: OPENBLAS_NUM_THREADS
          value: "1"
        - name: OMP_NUM_THREADS 
          value: "1"    
        - name: NVIDIA_VISIBLE_DEVICES
          value: none
        - name: ConCurrencyFlag
          value: "false"
        - name: SERVER_PROCESS_NUM
          value: "1"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    VECLIB_MAXIMUM_THREADSMKL_NUM_THREADSNUMEXPR_NUM_THREADSOPENBLAS_NUM_THREADSOMP_NUM_THREADS 这五个环境变量是用于控制多线程的线程个数的,其值等于pod的cpu个数。

    NVIDIA_VISIBLE_DEVICES为gpu配置,当pod中不含有gpu时,添加该环境变量并将其设置为none。

    ConCurrencyFlagSERVER_PROCESS_NUM为MPS相关的环境变量,详情见6.9

    6.2 容器拉取镜像的策略

    • Always:每次都会从镜像仓库拉取镜像
    • Never:仅使用本地镜像
    • IfNotPresent:优先使用本地镜像,若本地镜像不存在,则会拉取仓库镜像

    6.3 健康检测

    • livenessProbe:当健康检测不通过时会直接重启容器
    • readinessProbe:当健康检测不通过时会停止向容器发送流量
    spec.readinessProbe: 
        httpGet:
          httpHeaders:
          - name: Authorization
            value: Bearer xxxxxxx # token
          path: /health           # 请求路径
          port: 8888              # 请求端口
          scheme: HTTP            # 请求协议
        initialDelaySeconds: 30   # 容器启动完成后多长时间进行首次健康检测,单位为秒
        periodSeconds: 30         # 健康监测时间周期,单位为秒,默认10秒一次
        successThreshold: 1       # 从检测错误到成功需要几次才认为健康检测成功,默认为1次
        failureThreshold: 2       # 检测失败几次后就认为健康检测失败,默认为3次
        timeoutSeconds: 3         # 健康检测响应超时时间,单位为秒,默认为1秒
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6.4 资源信息

    spec.resources: 
        limits:                     # 设置资源上限值
          cpu: "1"                  # cpu,单位为core
          memory: "2147483648"      # 内存,单位为Mib/Gib,若不添加单位,则默认为byte
          nvidia.com/gpu: "1"       # gpu
        requests:                   # 设置资源必需值
          cpu: 250m                 # cpu,若不足一个,则需要添加m
          memory: "536870912"       # 内存
          nvidia.com/gpu: "1"       # gpu
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    6.5 pod调度策略

    spec.nodeSelector: 
        node: worker  # pod会调度到有worker标签的node上
    
    • 1
    • 2

    6.6 重启策略

    • Always :不管pod以何种方式终止运行都会将其重启

    • Never:不管pod以何种方式终止运行都不会将其重启

    • OnFailure:只有pod以非0退出码退出才会重启

    spec.restartPolicy: Always
    
    • 1

    6.7 调度器

    经过预选筛选和优选打分之后,K8S会选择分数最高的node来运行pod,如果最终有多个 node 的分数最高,那么 Scheduler 将从当中随机选择一个 node 来运行pod

    spec.schedulerName: default-scheduler
    
    • 1

    6.8 优雅删除

    spec.terminationGracePeriodSeconds: 30
    
    • 1

    pod的升级(删除)过程:

    1. K8S首先会启动新的pod
    2. 当新的pod进入Ready状态时,K8S会创建Endpoint并将新的pod纳入负载均衡
    3. K8S移除与老pod相关的Endpoint,并且将老pod的状态设置为Terminating,此时将不会有新的请求到达老pod
    4. 同时K8S会给老pod发送SIGTERM信号,并且等待 terminationGracePeriodSeconds 这么长的时间。(默认为30秒)
    5. 超过terminationGracePeriodSeconds等待时间后, K8S会强制结束老pod
    6. 所以,terminationGracePeriodSeconds 要设置一个合适的值,至少保证所有现存的请求能被正确处理并返回程序处理SIGTERM信号,并且保证所有事务完成后再关闭程序

    status

    表示K8S对象在当前集群中实际的状态,往往通过资源的Controller控制

    status: 
      conditions:
      - lastTransitionTime: "2020-10-27T01:06:52Z"
        lastUpdateTime: "2020-10-27T01:06:52Z"
        message: Deployment has minimum availability.
        reason: MinimumReplicasAvailable
        status: "True"
        type: Available
      - lastTransitionTime: "2020-10-27T01:06:52Z"
        lastUpdateTime: "2020-10-27T01:07:52Z"
        message: ReplicaSet "uvzobilkwkmsfqca-serving-v1-d9c5f7bdf" has successfully progressed.
        reason: NewReplicaSetAvailable
        status: "True"
        type: Progressing
      availableReplicas: 1
      observedGeneration: 1    # 观察到的实例
      readyReplicas: 1         # 准备好的实例
      replicas: 1              # 实例总数
      updatedReplicas: 1       # 已更新的实例
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    MPS

    使用gpu的在线服务可以通过开启MPS来提升gpu的使用率

    # spec.containers.env
    - name: ConCurrencyFlag
      value: "True"
    - name: SERVER_PROCESS_NUM
      value: "1"
    
    lifecycle:
       preStop:
         exec:
           command:
             - /bin/bash
             - /model_serving/model_server/stop_mps.sh
    
    securityContext: 
        capabilities:
          add:
            - SYS_ADMIN
          procMount: Default              
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    完整样例

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      annotations:
        deployment.kubernetes.io/revision: "1"
      creationTimestamp: "2020-11-04T09:00:37Z"
      generation: 1
      labels:
        app: gbavqfbyfltzqfuu-serving
        version: v1
      name: gbavqfbyfltzqfuu-serving-v1
      namespace: aipaas-modelserving
      resourceVersion: "121103285"
      selfLink: /apis/extensions/v1beta1/namespaces/aipaas-modelserving/deployments/gbavqfbyfltzqfuu-serving-v1
      uid: 34db5072-1e7c-11eb-b71b-fa163efea19e
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: gbavqfbyfltzqfuu-serving
          version: v1
      strategy:
        rollingUpdate:
          maxSurge: 100%
          maxUnavailable: 100%
        type: RollingUpdate
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: gbavqfbyfltzqfuu-serving
            version: v1
        spec:
          containers:
          - env:
            - name: VECLIB_MAXIMUM_THREADS
              value: "1"
            - name: MKL_NUM_THREADS
              value: "1"
            - name: NUMEXPR_NUM_THREADS
              value: "1"
            - name: NVIDIA_VISIBLE_DEVICES
              value: none
            - name: OPENBLAS_NUM_THREADS
              value: "1"
            - name: OMP_NUM_THREADS
              value: "1"
            image: 172.16.1.222:10004/library/pmml-serving:v1.2
            imagePullPolicy: IfNotPresent
            name: gbavqfbyfltzqfuu-serving-v1
            ports:
            - containerPort: 8888
              name: aipaas
              protocol: TCP
            readinessProbe:
              failureThreshold: 2
              httpGet:
                httpHeaders:
                - name: Authorization
                  value: Bearer eyJhbG......
                path: /openscoring/model/serving
                port: 8888
                scheme: HTTP
              initialDelaySeconds: 30
              periodSeconds: 30
              successThreshold: 1
              timeoutSeconds: 3
            resources:
              limits:
                cpu: "1"
                memory: "2147483648"
              requests:
                cpu: 250m
                memory: "536870912"
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          nodeSelector:
            node: worker
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    status:
      availableReplicas: 1
      conditions:
      - lastTransitionTime: "2020-11-04T09:00:37Z"
        lastUpdateTime: "2020-11-04T09:00:37Z"
        message: Deployment has minimum availability.
        reason: MinimumReplicasAvailable
        status: "True"
        type: Available
      - lastTransitionTime: "2020-11-04T09:00:37Z"
        lastUpdateTime: "2020-11-04T09:01:36Z"
        message: ReplicaSet "gbavqfbyfltzqfuu-serving-v1-7bd89cd5c9" has successfully
          progressed.
        reason: NewReplicaSetAvailable
        status: "True"
        type: Progressing
      observedGeneration: 1
      readyReplicas: 1
      replicas: 1
      updatedReplicas: 1
    
    • 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
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
  • 相关阅读:
    HTTP协议详解:基本概念与工作流程
    题目0010:整数转二进制(附二进制转整数与字符串知识点)
    【前端】HTTP相关知识总结
    React+Antd项目,Form的Input中已经有内容,但是还是提示此项为必填项,不能为空
    gRPC编译时,请注意使用make clean 清理后再重复编译
    软件开发全文档整理(原件获取)
    Golang 开发实战day03 - Arrays & Slices
    博弈论——斯塔克尔伯格模型(Stackelberg model)
    RabbitMQ: Publish/Subscribe结构
    【数据分享】全国县市2000-2020年医疗卫生机构床位数数据(excel和shp格式)
  • 原文地址:https://blog.csdn.net/weixin_42114097/article/details/128167085