一、yaml基础写法介绍

1.基础语法

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

2.数据类型

  • 对象
  • 对象键值对使用冒号结构表示key: value,冒号后面要加一个空格
key: 
     child-key1: value1
     child-key2: value2
  • 数组
  • 以-开头的行表示构成一个数组
- value1
- value2
- value2
  • 纯量
    字符串、布尔值、整数、浮点数、Null、时间、日期

二、deployment部署文件详解

deployment总共包含5个属性

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

完整样例报文

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.metadata介绍

metadata:
  annotations: 							# 自定义注释列表
  generation: 
  labels: 									# 标签,用于标识该资源
    app: 
    version: 
  name: 										# deployment名称,同一个命名空间下该名称不可重复
  namespace: 								# deploymetn所属命名空间
  resourceVersion:
  selfLink:
  uid:

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

2.spec介绍

  1. spec.progressDeadlineSeconds

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

  1. spec.replicas

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

  1. spec.revisionHistoryLimit

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

  1. spec.selector

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

  1. spec.strategy

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

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

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"

VECLIB_MAXIMUM_THREADS、MKL_NUM_THREADS、NUMEXPR_NUM_THREADS、OPENBLAS_NUM_THREADS、OMP_NUM_THREADS 这五个环境变量是用于控制多线程的线程个数的,其值等于pod的cpu个数。

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

ConCurrencyFlag和SERVER_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秒

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

6.5 pod调度策略

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

6.6 重启策略

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

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

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

  • pec.restartPolicy: Always

  • 6.7 调度器

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

spec.schedulerName: default-scheduler

6.8 优雅删除

spec.terminationGracePeriodSeconds: 30

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信号,并且保证所有事务完成后再关闭程序

3.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       # 已更新的实例

5.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   
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐