提交工作负载

K8S工作负载类型

K8S原生的工作负载,包括Deployment、StatefulSet、Pod等,均可以基于yaml进行提交。

英博云支持通过K8S原生的yaml语法,指定运行工作负载的节点类型,以及实例规格。

一个Deployment示例

以下提供了一个部署nginx的例子:

注意:

  • 这里我们通过nodeAffinity标签指定节点类型为CPU,具体是这个label:cloud.ebtech.com/cpu=amd-epyc-milan。你也可以整体省略affinity部分,英博云默认会调度到CPU节点。
  • 实例规格方面,我们指定为:125毫核cpu,256GB内存,这是英博云CPU资源的最小规格。
  • 关于节点类型及规格的更多信息,参考:节点类型与规格
# nginx.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:  # 这里指定节点类型,本例为CPU
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: cloud.ebtech.com/cpu
                operator: In
                values:
                - amd-epyc-milan
      containers:
      - name: nginx
        image: nginx:1.21.6
        ports:
        - containerPort: 80
        resources:
          limits:  # 这里指定实例规格,对CPU来说,需要指定内存及CPU
            memory: "256Mi" # 指定内存需求
            cpu: "125m"     # 指定cpu需求
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 15
          periodSeconds: 20
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
      restartPolicy: Always

将以上文件保存为:nginx.yaml,然后执行以下命令,提交工作负载

kubectl apply -f nginx.yaml

提交GPU工作负载

若希望提交GPU类型工作负载,必须通过nodeAffinity指定GPU的节点类型,同时需要并在resources字段,指定卡的数量。示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deepseek-chat
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: deepseek
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: deepseek
    spec:
      affinity:  # 这里指定节点类型,本例为4090D GPU节点
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: cloud.ebtech.com/gpu
                operator: In
                values:
                - RTX_4090D
     containers:
      - image: registry-cn-huabei1-internal.ebcloud.com/tenant-61616664/chat-inference:latest
        imagePullPolicy: Always
        name: deepseek
        ports:
        - containerPort: 8000
          protocol: TCP
        resources:
          limits:      # 这里指定示例规格,对于GPU来说,需要指定卡数量、内存及CPU
            nvidia.com/gpu: 1 # 这里指定GPU卡数量
            memory: "100Gi"   # 指定内存
            cpu: "10"         # 指定CPU
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

为工作负载开启Gang调度

Gang调度是一种all-or-nothing的调度机制,用于一个工作负载需要多个pod配合的场景。

开启gang调度后,英博云会保证所有pod资源到位后,才会启动调度,避免部分pod启动占据资源造成消费,但是因为数量不足,无法真正完成任务。

apiVersion: v1
kind: Deployment
metadata:
  annotations:
    eks.ebcloud.com/gang-min-member=2  # 调度策略:gang调度,eg:gang-min-member=2,表示至少2个pod成组调度,一起成功或者失败
    ...
  name: pod-xxx
  namespace: pod-xxx
spec:
    ...

提交Spot工作负载

英博云提供闲时资源作为Spot竞价实例,竞价实例价格有一定折扣,但是可能随时被停止以释放资源。

若要开启竞价实例功能,需要在 集群管理 页面,进行配置以开启。

K8S原生RS,以及用户自定义的RS类型的工作负载,包括Deployment、POD等,通过配置annotation实现,:

apiVersion: v1
kind: Deployment
metadata:
  annotations:
    eks.ebcloud.com/enable-spot: "true"  # 竞价annotation 标记
    ...
  name: pod-xxx
  namespace: pod-xxx
spec:
    ...

在英博云控制台查看工作负载

在英博云控制台: 资源管理 -> 工作负载 页面,可以查看当前集群运行的工作负载,如下所示:

工作负载