指定地域调度
在默认情况下,如果我们需要将业的Serverless算力调度到指定的地域,可以在业务应用的定义中添加标签ctyun.cn/specified-region-id来实现。编排如下:
| apiVersion: apps/v1kind: Deploymentmetadata:  labels:    esx: nginx-gpu-specified-region  name: nginx-gpu-deployment-specified-region  namespace: defaultspec:  replicas: 1  selector:    matchLabels:      esx: nginx-gpu-specified-region  template:    metadata:      labels:        ctyun.cn/esx: "true"        ctyun.cn/compute-class: gpu        ctyun.cn/compute-qos: default        ctyun.cn/gpu-model-series: example-model  # GPU卡型,请按照实际情况替换,例如T4        ctyun.cn/specified-region-id: <RegionID> # 通过该标签指定地域,若不指定会使用默认地域,// RegionID由集群服务提供        esx: nginx-gpu-specified-region    spec:       containers:        - image: 'nginx:stable-alpine'          imagePullPolicy: IfNotPresent          name: nginx          ports:            - containerPort: 80              protocol: TCP          resources:            limits:              cpu: 1              memory: 1Gi              nvidia.com/gpu: "1"            requests:              cpu: 1              memory: 1Gi              nvidia.com/gpu: "1" | 
调度器动态调度
在指定地域调度的示例中,是通过为业务应用设置标签来实现将业务应用调度到指定地域的Serverless算力。然而,这种方式存在一定的限制和缺少灵活性。为了解决该问题,通过调度器ResourcePolicy策略实现动态调度。
策略定义如下:
| apiVersion: scheduling.ctyun.cn/v1kind: Policymetadata:  name: multi-vk-gpu-resourcepolicy  namespace: defaultspec:  selector: # 在selector中标记Pod,表示带有esx=nginx-gpu-resourcepolicy标签的Pod将遵循此调度策略    esx: nginx-gpu-resourcepolicy  units:  # 优先使用该地域的资源,当该地域资源不足时候,自动切换到其他地域  - resource: bc # resource类型指定业务资源为bc    replicas: 1    schedulerNodeSelector: # 支持通过nodeSelector指定虚拟节点地域      topology.kubernetes.io/region: <RegionID>      spec: uuid    podLabels:      ctyun.cn/specified-region-id: <RegionID>      ctyun.cn/compute-class: gpu      ctyun.cn/compute-qos: default      ctyun.cn/gpu-model-series: example-model  # GPU卡型,请按照实际情况替换  - resource: bc    replicas: 2    nodeSelector: # 支持通过nodeSelector指定虚拟节点地域      topology.kubernetes.io/region: <RegionID>      spec: uuid    podLabels:      ctyun.cn/specified-region-id: <RegionID>      ctyun.cn/compute-class: gpu      ctyun.cn/compute-qos: default      ctyun.cn/gpu-model-series: example-model  # GPU卡型,请按照实际情况替换 | 
调度成功后,在ResourceBinding最后采用GVR实现动态标签注入。获取资源的标签,如果标签为空,则创建一个新的标签映射,然后添加一个新的标签,并将其设置回unstructured对象中,实现概要如下:
| // 将 YAML 解析为 unstructured 对象var obj unstructured.Unstructurederr = yaml.Unmarshal(yamlFile, &obj)iferr != nil {    log.Fatalf("Failed to unmarshal YAML: %v", err)}// 获取 GVRgvk := obj.GroupVersionKind()gvr := schema.GroupVersionResource{    Group:    gvk.Group,    Version:  gvk.Version,    Resource: fmt.Sprintf("%ss", gvk.Kind),}// 动态注入标签labels := obj.GetLabels()iflabels == nil {    labels = make(map[string]string)}labels["example-label"] = "example-value"obj.SetLabels(labels) | 
调度器框架

