Skip to content

K8S YAML 导入

K8S YAML 导入功能允许熟悉 K8S 的用户以自定义 Deployment 资源的 YAML 配置文件的方式,实现更高自由度的自定义配置。

例如:

关于 K8S Deployment 的简要介绍可见 Deployments,详细功能介绍可见 Deployment

出于对集群安全性的考虑和业务逻辑的要求,目前不支持设置关于卡类型、数目、资源配额、容器镜像等信息(请通过 UI 界面或 API 接口进行设置),也不支持任何可能使得容器获取宿主机权限的配置,例如特权容器,访问主机网络,挂载 hostpath 等。如有相关需要,请联系我们。

这里给出几个典型应用场景下的 K8S Yaml 配置文件样例

部分业务程序需要挂载内存盘作为进程间通信的方式,这里给出挂载内存盘的 yaml 文件样例

......
containers:
- image: harbor.suanleme.cn/xiongdw/mem-allocator:v1 #选卡后默认配置内容
name: d1749797718484-39886-container
resources:
limits:
cpu: '14'
memory: 63Gi
nvidia.com/gpu: '1'
requests:
cpu: '7'
memory: 32256Mi
volumeMounts: #共享内存关键配置
- mountPath: /dev/shm
name: shm-volume
volumes:
- emptyDir:
medium: Memory
name: shm-volume

部分业务程序处理单次请求可能需要数十分钟级别的较长时间,在服务缩容等场景中,如果不等待请求完成即退出程序,可能会对用户体验造成较大不良影响。

对于此类程序,可以在业务代码里面处理 SIGTERM 信号:

  • 捕获 SIGTREM 信号
  • 执行对应的清理逻辑
  • 主动退出程序

并在 yaml 中配置适当的优雅退出宽限时间来实现(默认 30s,可按需延长)。也可以通过 preStop 配置以其它方式通知程序。这里给出 yaml 文件样例(此处的 preStop 命令仅作格式上的说明,无实际意义)。

......
containers:
- image: harbor.suanleme.cn/repository/imagename:v1 #选用的镜像
lifecycle: #(可选)回调函数退出时执行的逻辑
preStop:
exec:
command:
- /bin/sh
- '-c'
- sleep 30
name: d1749797718484-39886-container #默认生成
resources: #选卡时确定此配置,不可修改
limits:
cpu: '14'
memory: 63Gi
nvidia.com/gpu: '1'
requests:
cpu: '7'
memory: 32256Mi
terminationGracePeriodSeconds: 200 #(关键)定义优雅退出最大时间

自定义 yaml 增加环境变量和启动命令等信息

Section titled “自定义 yaml 增加环境变量和启动命令等信息”
.......
containers:
- args: #启动参数
- serve
- MiniMaxAI/MiniMax-M1-80k
- '--trust-remote-code'
- '--quantization'
- experts_int8
- '--max_model_len'
- '4096'
- '--dtype'
- bfloat16
- '--tensor-parallel-size'
- '8'
command: #启动命令
- vllm
env: #环境变量
- name: HF_ENDPOINT
value: https://hf-mirror.com
image: harbor.suanleme.cn/xiongdw/mem-allocator:v1
name: d1750145858219-7590-container
ports:
- containerPort: 8000
resources:
limits:
cpu: '56'
memory: 252Gi
nvidia.com/gpu: '4'
requests:
cpu: '28'
memory: 126Gi
volumeMounts: #共享内存挂载
- mountPath: /dev/shm
name: shm-volume
terminationGracePeriodSeconds: 200 #任务最大退出时间
volumes:
- emptyDir:
medium: Memory
name: shm-volume
status: {}

解决容器内无法访问外部四层服务的问题

Section titled “解决容器内无法访问外部四层服务的问题”

部分业务程序可能需要访问云上消息队列,而且选择了采用 IP+ 端口的四层流量方式访问。默认我们的平台仅允许七层流量,这会导致无法从消息队列中拉取任务。如果存在此问题,可考虑使用此配置。

apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: d06161816-mem-allocatorv1-186-11icjyhf
name: d06161816-mem-allocatorv1-186-11icjyhf
namespace: wp2upu39jptxiuhkfkm0nx2bdkp9elwo-186
spec:
replicas: 1
selector:
matchLabels:
app: d06161816-mem-allocatorv1-186-11icjyhf
strategy: {}
template:
metadata:
annotations: #此项为放开四层流量的限制
sidecar.istio.io/inject: 'false'
creationTimestamp: null
labels:
app: d06161816-mem-allocatorv1-186-11icjyhf
spec:
......

如果主动切换业务程序所在的集群,我们会并发地要求新集群拉起新实例,旧集群关闭旧实例。但是,有些时候我们需要在新实例启动后才关闭旧实例。为此,我们可以通过如下配置来让旧实例等待一段时间再退出。

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: xxx
spec:
replicas: 1
selector:
matchLabels:
app: xxx
template:
metadata:
annotations:
[proxy.istio.io/config](http://proxy.istio.io/config): |
drainDuration: 4m
terminationDrainDuration: 5m
holdApplicationUntilProxyStarts: true
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 400 # 确保 preStop 执行完成
containers:
- name: nginx
image: [harbor.suanleme.cn/library/nginx:v1.20](http://harbor.suanleme.cn/library/nginx:v1.20) # 可替换为你的 harbor 镜像
lifecycle:
preStop:
exec:
command: ["sleep", "350"]
ports:
- containerPort: 80

部分业务容器可能希望以 root 身份启动,这与 K8S 的默认行为不同,可以通过自定义配置来进行设置。

......
containers:
- image: harbor.suanleme.cn/repository/imagename:v1 #选用的镜像
name: d1749797718484-39886-container #默认生成
securityContext:
runAsUser: 0 #此处填写用户 UID,0 标识 root,也可定义其他可用 UID
runAsGroup: 0 #(可选):此处表示 root 组的 GID