IT评测·应用市场-qidao123.com

标题: HAMi + prometheus-k8s + grafana实现vgpu虚拟化监控 [打印本页]

作者: 种地    时间: 2025-1-10 18:04
标题: HAMi + prometheus-k8s + grafana实现vgpu虚拟化监控
最近长沙跑了半个多月,跟甲方客户对了下项目指标,许久没更新

回来后继承研究如何实现 grafana实现HAMi vgpu虚拟化监控,毕竟条约里写了须要体现gpu资源限制和算力共享以及体现算力卡资源共享监控

先说下为啥要用HAMi吧, 一个重要原因是公司有人引见了这个工具的作者, 很多问题我都可以直接向作者提问
HAMi,是一个国产的GPU与国产加速卡(支持的GPU与国产加速卡型号与具体特性请查看此项目官网:https://github.com/Project-HAMi/HAMi/)虚拟化开源项目,实现以kubernetes为基础的容器场景下GPU或加速卡虚拟化。HAMi原名“k8s-vGPU-scheduler”,
最初由我司开源,现已在国内与国际上愈加流行,是管理Kubernetes中异构装备的中间件。它可以管理不同范例的异构装备(如GPU、NPU等),在Pod之间共享异构装备,根据装备的拓扑信息和调理策略做出更好的调理决策。为了论述的简明性,本文只提供一种可行的办法,最终实现使用prometheus抓取监控指标并作为数据源、使用grafana来展示监控信息的目的。
       本文假定已经部署好Kubernetes集群、HAMi。以下涉及到的相关组件都是在kubernetes集群内安装的,相关组件或软件版本信息如下:
组件或软件名称版本备注kubernetes集群v1.23.1AMD64构架服务器环境下HAMi根据向开源作者提问,当前HAMi版本发行机制还不够成熟,暂以安装HAMi的scheduler.kubeScheduler.imageTag 参数值为其版本,此值要跟kubernetes版本看齐项目地址:https://github.com/Project-HAMi/HAMi/kube-prometheus stack prom/prometheus:v2.27.1关于监控的安装参见实现prometheus+grafana的监控部署_prometheus grafana监控部署-CSDN博客dcgm-exporternvcr.io/nvidia/k8s/dcgm-exporter:3.3.9-3.6.1-ubuntu22.04 HAMi  的默认安装方式是通过helm,添加Helm堆栈:
  1. helm repo add hami-charts https://project-hami.github.io/HAMi/
复制代码

检查Kubernetes版本并安装HAMi(服务器版本为1.23.1):

  1. helm install hami hami-charts/hami --set scheduler.kubeScheduler.imageTag=v1.23.1 -n kube-system
复制代码
验证hami安装成功
  1. kubectl get pods -n kube-system
复制代码

确认hami-device-plugin和hami-scheduler都处于Running状态表示安装成功。

把helm安装转为hami-install.yaml
  1. helm template hami hami-charts/hami --set scheduler.kubeScheduler.imageTag=v1.23.1 -n kube-system > hami-install.yaml
复制代码
该格式部署
  1. ---
  2. # Source: hami/templates/device-plugin/monitorserviceaccount.yaml
  3. apiVersion: v1
  4. kind: ServiceAccount
  5. metadata:
  6.   name: hami-device-plugin
  7.   namespace: "kube-system"
  8.   labels:
  9.     app.kubernetes.io/component: "hami-device-plugin"
  10.     helm.sh/chart: hami-2.4.0
  11.     app.kubernetes.io/name: hami
  12.     app.kubernetes.io/instance: hami
  13.     app.kubernetes.io/version: "2.4.0"
  14.     app.kubernetes.io/managed-by: Helm
  15. ---
  16. # Source: hami/templates/scheduler/serviceaccount.yaml
  17. apiVersion: v1
  18. kind: ServiceAccount
  19. metadata:
  20.   name: hami-scheduler
  21.   namespace: "kube-system"
  22.   labels:
  23.     app.kubernetes.io/component: "hami-scheduler"
  24.     helm.sh/chart: hami-2.4.0
  25.     app.kubernetes.io/name: hami
  26.     app.kubernetes.io/instance: hami
  27.     app.kubernetes.io/version: "2.4.0"
  28.     app.kubernetes.io/managed-by: Helm
  29. ---
  30. # Source: hami/templates/device-plugin/configmap.yaml
  31. apiVersion: v1
  32. kind: ConfigMap
  33. metadata:
  34.   name: hami-device-plugin
  35.   labels:
  36.     app.kubernetes.io/component: hami-device-plugin
  37.     helm.sh/chart: hami-2.4.0
  38.     app.kubernetes.io/name: hami
  39.     app.kubernetes.io/instance: hami
  40.     app.kubernetes.io/version: "2.4.0"
  41.     app.kubernetes.io/managed-by: Helm
  42. data:
  43.   config.json: |
  44.     {
  45.         "nodeconfig": [
  46.             {
  47.                 "name": "m5-cloudinfra-online02",
  48.                 "devicememoryscaling": 1.8,
  49.                 "devicesplitcount": 10,
  50.                 "migstrategy":"none",
  51.                 "filterdevices": {
  52.                   "uuid": [],
  53.                   "index": []
  54.                 }
  55.             }
  56.         ]
  57.     }
  58. ---
  59. # Source: hami/templates/scheduler/configmap.yaml
  60. apiVersion: v1
  61. kind: ConfigMap
  62. metadata:
  63.   name: hami-scheduler
  64.   labels:
  65.     app.kubernetes.io/component: hami-scheduler
  66.     helm.sh/chart: hami-2.4.0
  67.     app.kubernetes.io/name: hami
  68.     app.kubernetes.io/instance: hami
  69.     app.kubernetes.io/version: "2.4.0"
  70.     app.kubernetes.io/managed-by: Helm
  71. data:
  72.   config.json: |
  73.     {
  74.         "kind": "Policy",
  75.         "apiVersion": "v1",
  76.         "extenders": [
  77.             {
  78.                 "urlPrefix": "https://127.0.0.1:443",
  79.                 "filterVerb": "filter",
  80.                 "bindVerb": "bind",
  81.                 "enableHttps": true,
  82.                 "weight": 1,
  83.                 "nodeCacheCapable": true,
  84.                 "httpTimeout": 30000000000,
  85.                 "tlsConfig": {
  86.                     "insecure": true
  87.                 },
  88.                 "managedResources": [
  89.                     {
  90.                         "name": "nvidia.com/gpu",
  91.                         "ignoredByScheduler": true
  92.                     },
  93.                     {
  94.                         "name": "nvidia.com/gpumem",
  95.                         "ignoredByScheduler": true
  96.                     },
  97.                     {
  98.                         "name": "nvidia.com/gpucores",
  99.                         "ignoredByScheduler": true
  100.                     },
  101.                     {
  102.                         "name": "nvidia.com/gpumem-percentage",
  103.                         "ignoredByScheduler": true
  104.                     },
  105.                     {
  106.                         "name": "nvidia.com/priority",
  107.                         "ignoredByScheduler": true
  108.                     },
  109.                     {
  110.                         "name": "cambricon.com/vmlu",
  111.                         "ignoredByScheduler": true
  112.                     },
  113.                     {
  114.                         "name": "hygon.com/dcunum",
  115.                         "ignoredByScheduler": true
  116.                     },
  117.                     {
  118.                         "name": "hygon.com/dcumem",
  119.                         "ignoredByScheduler": true
  120.                     },
  121.                     {
  122.                         "name": "hygon.com/dcucores",
  123.                         "ignoredByScheduler": true
  124.                     },
  125.                     {
  126.                         "name": "iluvatar.ai/vgpu",
  127.                         "ignoredByScheduler": true
  128.                     }
  129.                 ],
  130.                 "ignoreable": false
  131.             }
  132.         ]
  133.     }
  134. ---
  135. # Source: hami/templates/scheduler/configmapnew.yaml
  136. apiVersion: v1
  137. kind: ConfigMap
  138. metadata:
  139.   name: hami-scheduler-newversion
  140.   labels:
  141.     app.kubernetes.io/component: hami-scheduler
  142.     helm.sh/chart: hami-2.4.0
  143.     app.kubernetes.io/name: hami
  144.     app.kubernetes.io/instance: hami
  145.     app.kubernetes.io/version: "2.4.0"
  146.     app.kubernetes.io/managed-by: Helm
  147. data:
  148.   config.yaml: |
  149.     apiVersion: kubescheduler.config.k8s.io/v1
  150.     kind: KubeSchedulerConfiguration
  151.     leaderElection:
  152.       leaderElect: false
  153.     profiles:
  154.     - schedulerName: hami-scheduler
  155.     extenders:
  156.     - urlPrefix: "https://127.0.0.1:443"
  157.       filterVerb: filter
  158.       bindVerb: bind
  159.       nodeCacheCapable: true
  160.       weight: 1
  161.       httpTimeout: 30s
  162.       enableHTTPS: true
  163.       tlsConfig:
  164.         insecure: true
  165.       managedResources:
  166.       - name: nvidia.com/gpu
  167.         ignoredByScheduler: true
  168.       - name: nvidia.com/gpumem
  169.         ignoredByScheduler: true
  170.       - name: nvidia.com/gpucores
  171.         ignoredByScheduler: true
  172.       - name: nvidia.com/gpumem-percentage
  173.         ignoredByScheduler: true
  174.       - name: nvidia.com/priority
  175.         ignoredByScheduler: true
  176.       - name: cambricon.com/vmlu
  177.         ignoredByScheduler: true
  178.       - name: hygon.com/dcunum
  179.         ignoredByScheduler: true
  180.       - name: hygon.com/dcumem
  181.         ignoredByScheduler: true
  182.       - name: hygon.com/dcucores
  183.         ignoredByScheduler: true
  184.       - name: iluvatar.ai/vgpu
  185.         ignoredByScheduler: true
  186. ---
  187. # Source: hami/templates/scheduler/device-configmap.yaml
  188. apiVersion: v1
  189. kind: ConfigMap
  190. metadata:
  191.   name: hami-scheduler-device
  192.   labels:
  193.     app.kubernetes.io/component: hami-scheduler
  194.     helm.sh/chart: hami-2.4.0
  195.     app.kubernetes.io/name: hami
  196.     app.kubernetes.io/instance: hami
  197.     app.kubernetes.io/version: "2.4.0"
  198.     app.kubernetes.io/managed-by: Helm
  199. data:
  200.   device-config.yaml: |-
  201.     nvidia:
  202.       resourceCountName: nvidia.com/gpu
  203.       resourceMemoryName: nvidia.com/gpumem
  204.       resourceMemoryPercentageName: nvidia.com/gpumem-percentage
  205.       resourceCoreName: nvidia.com/gpucores
  206.       resourcePriorityName: nvidia.com/priority
  207.       overwriteEnv: false
  208.       defaultMemory: 0
  209.       defaultCores: 0
  210.       defaultGPUNum: 1
  211.       deviceSplitCount: 10
  212.       deviceMemoryScaling: 1
  213.       deviceCoreScaling: 1
  214.     cambricon:
  215.       resourceCountName: cambricon.com/vmlu
  216.       resourceMemoryName: cambricon.com/mlu.smlu.vmemory
  217.       resourceCoreName: cambricon.com/mlu.smlu.vcore
  218.     hygon:
  219.       resourceCountName: hygon.com/dcunum
  220.       resourceMemoryName: hygon.com/dcumem
  221.       resourceCoreName: hygon.com/dcucores
  222.     metax:
  223.       resourceCountName: "metax-tech.com/gpu"
  224.     mthreads:
  225.       resourceCountName: "mthreads.com/vgpu"
  226.       resourceMemoryName: "mthreads.com/sgpu-memory"
  227.       resourceCoreName: "mthreads.com/sgpu-core"
  228.     iluvatar:
  229.       resourceCountName: iluvatar.ai/vgpu
  230.       resourceMemoryName: iluvatar.ai/vcuda-memory
  231.       resourceCoreName: iluvatar.ai/vcuda-core
  232.     vnpus:
  233.     - chipName: 910B
  234.       commonWord: Ascend910A
  235.       resourceName: huawei.com/Ascend910A
  236.       resourceMemoryName: huawei.com/Ascend910A-memory
  237.       memoryAllocatable: 32768
  238.       memoryCapacity: 32768
  239.       aiCore: 30
  240.       templates:
  241.         - name: vir02
  242.           memory: 2184
  243.           aiCore: 2
  244.         - name: vir04
  245.           memory: 4369
  246.           aiCore: 4
  247.         - name: vir08
  248.           memory: 8738
  249.           aiCore: 8
  250.         - name: vir16
  251.           memory: 17476
  252.           aiCore: 16
  253.     - chipName: 910B3
  254.       commonWord: Ascend910B
  255.       resourceName: huawei.com/Ascend910B
  256.       resourceMemoryName: huawei.com/Ascend910B-memory
  257.       memoryAllocatable: 65536
  258.       memoryCapacity: 65536
  259.       aiCore: 20
  260.       aiCPU: 7
  261.       templates:
  262.         - name: vir05_1c_16g
  263.           memory: 16384
  264.           aiCore: 5
  265.           aiCPU: 1
  266.         - name: vir10_3c_32g
  267.           memory: 32768
  268.           aiCore: 10
  269.           aiCPU: 3
  270.     - chipName: 310P3
  271.       commonWord: Ascend310P
  272.       resourceName: huawei.com/Ascend310P
  273.       resourceMemoryName: huawei.com/Ascend310P-memory
  274.       memoryAllocatable: 21527
  275.       memoryCapacity: 24576
  276.       aiCore: 8
  277.       aiCPU: 7
  278.       templates:
  279.         - name: vir01
  280.           memory: 3072
  281.           aiCore: 1
  282.           aiCPU: 1
  283.         - name: vir02
  284.           memory: 6144
  285.           aiCore: 2
  286.           aiCPU: 2
  287.         - name: vir04
  288.           memory: 12288
  289.           aiCore: 4
  290.           aiCPU: 4
  291. ---
  292. # Source: hami/templates/device-plugin/monitorrole.yaml
  293. apiVersion: rbac.authorization.k8s.io/v1
  294. kind: ClusterRole
  295. metadata:
  296.   name:  hami-device-plugin-monitor
  297. rules:
  298.   - apiGroups:
  299.       - ""
  300.     resources:
  301.       - pods
  302.     verbs:
  303.       - get
  304.       - create
  305.       - watch
  306.       - list
  307.       - update
  308.       - patch
  309.   - apiGroups:
  310.       - ""
  311.     resources:
  312.       - nodes
  313.     verbs:
  314.       - get
  315.       - update
  316.       - list
  317.       - patch
  318. ---
  319. # Source: hami/templates/device-plugin/monitorrolebinding.yaml
  320. apiVersion: rbac.authorization.k8s.io/v1
  321. kind: ClusterRoleBinding
  322. metadata:
  323.   name: hami-device-plugin
  324.   labels:
  325.     app.kubernetes.io/component: "hami-device-plugin"
  326.     helm.sh/chart: hami-2.4.0
  327.     app.kubernetes.io/name: hami
  328.     app.kubernetes.io/instance: hami
  329.     app.kubernetes.io/version: "2.4.0"
  330.     app.kubernetes.io/managed-by: Helm
  331. roleRef:
  332.   apiGroup: rbac.authorization.k8s.io
  333.   kind: ClusterRole
  334.   #name: cluster-admin
  335.   name: hami-device-plugin-monitor
  336. subjects:
  337.   - kind: ServiceAccount
  338.     name: hami-device-plugin
  339.     namespace: "kube-system"
  340. ---
  341. # Source: hami/templates/scheduler/rolebinding.yaml
  342. apiVersion: rbac.authorization.k8s.io/v1
  343. kind: ClusterRoleBinding
  344. metadata:
  345.   name: hami-scheduler
  346.   labels:
  347.     app.kubernetes.io/component: "hami-scheduler"
  348.     helm.sh/chart: hami-2.4.0
  349.     app.kubernetes.io/name: hami
  350.     app.kubernetes.io/instance: hami
  351.     app.kubernetes.io/version: "2.4.0"
  352.     app.kubernetes.io/managed-by: Helm
  353. roleRef:
  354.   apiGroup: rbac.authorization.k8s.io
  355.   kind: ClusterRole
  356.   name: cluster-admin
  357. subjects:
  358.   - kind: ServiceAccount
  359.     name: hami-scheduler
  360.     namespace: "kube-system"
  361. ---
  362. # Source: hami/templates/device-plugin/monitorservice.yaml
  363. apiVersion: v1
  364. kind: Service
  365. metadata:
  366.   name: hami-device-plugin-monitor
  367.   labels:
  368.     app.kubernetes.io/component: hami-device-plugin
  369.     helm.sh/chart: hami-2.4.0
  370.     app.kubernetes.io/name: hami
  371.     app.kubernetes.io/instance: hami
  372.     app.kubernetes.io/version: "2.4.0"
  373.     app.kubernetes.io/managed-by: Helm
  374. spec:
  375.   externalTrafficPolicy: Local
  376.   selector:
  377.     app.kubernetes.io/component: hami-device-plugin
  378.   type: NodePort
  379.   ports:
  380.     - name: monitorport
  381.       port: 31992
  382.       targetPort: 9394
  383.       nodePort: 31992
  384. ---
  385. # Source: hami/templates/scheduler/service.yaml
  386. apiVersion: v1
  387. kind: Service
  388. metadata:
  389.   name: hami-scheduler
  390.   labels:
  391.     app.kubernetes.io/component: hami-scheduler
  392.     helm.sh/chart: hami-2.4.0
  393.     app.kubernetes.io/name: hami
  394.     app.kubernetes.io/instance: hami
  395.     app.kubernetes.io/version: "2.4.0"
  396.     app.kubernetes.io/managed-by: Helm
  397. spec:
  398.   type: NodePort
  399.   ports:
  400.     - name: http
  401.       port: 443
  402.       targetPort: 443
  403.       nodePort: 31998
  404.       protocol: TCP
  405.     - name: monitor
  406.       port: 31993
  407.       targetPort: 9395
  408.       nodePort: 31993
  409.       protocol: TCP
  410.   selector:
  411.     app.kubernetes.io/component: hami-scheduler
  412.     app.kubernetes.io/name: hami
  413.     app.kubernetes.io/instance: hami
  414. ---
  415. # Source: hami/templates/device-plugin/daemonsetnvidia.yaml
  416. apiVersion: apps/v1
  417. kind: DaemonSet
  418. metadata:
  419.   name: hami-device-plugin
  420.   labels:
  421.     app.kubernetes.io/component: hami-device-plugin
  422.     helm.sh/chart: hami-2.4.0
  423.     app.kubernetes.io/name: hami
  424.     app.kubernetes.io/instance: hami
  425.     app.kubernetes.io/version: "2.4.0"
  426.     app.kubernetes.io/managed-by: Helm
  427. spec:
  428.   selector:
  429.     matchLabels:
  430.       app.kubernetes.io/component: hami-device-plugin
  431.       app.kubernetes.io/name: hami
  432.       app.kubernetes.io/instance: hami
  433.   template:
  434.     metadata:
  435.       labels:
  436.         app.kubernetes.io/component: hami-device-plugin
  437.         hami.io/webhook: ignore
  438.         app.kubernetes.io/name: hami
  439.         app.kubernetes.io/instance: hami
  440.     spec:
  441.       imagePullSecrets:
  442.         []
  443.       serviceAccountName: hami-device-plugin
  444.       priorityClassName: system-node-critical
  445.       hostPID: true
  446.       hostNetwork: true
  447.       containers:
  448.         - name: device-plugin
  449.           image: projecthami/hami:latest
  450.           imagePullPolicy: "IfNotPresent"
  451.           lifecycle:
  452.             postStart:
  453.               exec:
  454.                 command: ["/bin/sh","-c", "cp -f /k8s-vgpu/lib/nvidia/* /usr/local/vgpu/"]
  455.           command:
  456.             - nvidia-device-plugin
  457.             - --config-file=/device-config.yaml
  458.             - --mig-strategy=none
  459.             - --disable-core-limit=false
  460.             - -v=false
  461.           env:
  462.             - name: NODE_NAME
  463.               valueFrom:
  464.                 fieldRef:
  465.                   fieldPath: spec.nodeName
  466.             - name: NVIDIA_MIG_MONITOR_DEVICES
  467.               value: all
  468.             - name: HOOK_PATH
  469.               value: /usr/local
  470.           securityContext:
  471.             allowPrivilegeEscalation: false
  472.             capabilities:
  473.               drop: ["ALL"]
  474.               add: ["SYS_ADMIN"]
  475.           volumeMounts:
  476.             - name: device-plugin
  477.               mountPath: /var/lib/kubelet/device-plugins
  478.             - name: lib
  479.               mountPath: /usr/local/vgpu
  480.             - name: usrbin
  481.               mountPath: /usrbin
  482.             - name: deviceconfig
  483.               mountPath: /config
  484.             - name: hosttmp
  485.               mountPath: /tmp
  486.             - name: device-config
  487.               mountPath: /device-config.yaml
  488.               subPath: device-config.yaml
  489.         - name: vgpu-monitor
  490.           image: projecthami/hami:latest
  491.           imagePullPolicy: "IfNotPresent"
  492.           command: ["vGPUmonitor"]
  493.           securityContext:
  494.             allowPrivilegeEscalation: false
  495.             capabilities:
  496.               drop: ["ALL"]
  497.               add: ["SYS_ADMIN"]
  498.           env:
  499.             - name: NVIDIA_VISIBLE_DEVICES
  500.               value: "all"
  501.             - name: NVIDIA_MIG_MONITOR_DEVICES
  502.               value: all
  503.             - name: HOOK_PATH
  504.               value: /usr/local/vgpu              
  505.           volumeMounts:
  506.             - name: ctrs
  507.               mountPath: /usr/local/vgpu/containers
  508.             - name: dockers
  509.               mountPath: /run/docker
  510.             - name: containerds
  511.               mountPath: /run/containerd
  512.             - name: sysinfo
  513.               mountPath: /sysinfo
  514.             - name: hostvar
  515.               mountPath: /hostvar
  516.       volumes:
  517.         - name: ctrs
  518.           hostPath:
  519.             path: /usr/local/vgpu/containers
  520.         - name: hosttmp
  521.           hostPath:
  522.             path: /tmp
  523.         - name: dockers
  524.           hostPath:
  525.             path: /run/docker
  526.         - name: containerds
  527.           hostPath:
  528.             path: /run/containerd
  529.         - name: device-plugin
  530.           hostPath:
  531.             path: /var/lib/kubelet/device-plugins
  532.         - name: lib
  533.           hostPath:
  534.             path: /usr/local/vgpu
  535.         - name: usrbin
  536.           hostPath:
  537.             path: /usr/bin
  538.         - name: sysinfo
  539.           hostPath:
  540.             path: /sys
  541.         - name: hostvar
  542.           hostPath:
  543.             path: /var
  544.         - name: deviceconfig
  545.           configMap:
  546.             name: hami-device-plugin
  547.         - name: device-config
  548.           configMap:
  549.             name: hami-scheduler-device
  550.       nodeSelector:
  551.         gpu: "on"
  552. ---
  553. # Source: hami/templates/scheduler/deployment.yaml
  554. apiVersion: apps/v1
  555. kind: Deployment
  556. metadata:
  557.   name: hami-scheduler
  558.   labels:
  559.     app.kubernetes.io/component: hami-scheduler
  560.     helm.sh/chart: hami-2.4.0
  561.     app.kubernetes.io/name: hami
  562.     app.kubernetes.io/instance: hami
  563.     app.kubernetes.io/version: "2.4.0"
  564.     app.kubernetes.io/managed-by: Helm
  565. spec:
  566.   replicas: 1
  567.   selector:
  568.     matchLabels:
  569.       app.kubernetes.io/component: hami-scheduler
  570.       app.kubernetes.io/name: hami
  571.       app.kubernetes.io/instance: hami
  572.   template:
  573.     metadata:
  574.       labels:
  575.         app.kubernetes.io/component: hami-scheduler
  576.         app.kubernetes.io/name: hami
  577.         app.kubernetes.io/instance: hami
  578.         hami.io/webhook: ignore
  579.     spec:
  580.       imagePullSecrets:
  581.         []
  582.       serviceAccountName: hami-scheduler
  583.       priorityClassName: system-node-critical
  584.       containers:
  585.         - name: kube-scheduler
  586.           image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.31.0
  587.           imagePullPolicy: "IfNotPresent"
  588.           command:
  589.             - kube-scheduler
  590.             - --config=/config/config.yaml
  591.             - -v=4
  592.             - --leader-elect=true
  593.             - --leader-elect-resource-name=hami-scheduler
  594.             - --leader-elect-resource-namespace=kube-system
  595.           volumeMounts:
  596.             - name: scheduler-config
  597.               mountPath: /config
  598.         - name: vgpu-scheduler-extender
  599.           image: projecthami/hami:latest
  600.           imagePullPolicy: "IfNotPresent"
  601.           env:
  602.           command:
  603.             - scheduler
  604.             - --http_bind=0.0.0.0:443
  605.             - --cert_file=/tls/tls.crt
  606.             - --key_file=/tls/tls.key
  607.             - --scheduler-name=hami-scheduler
  608.             - --metrics-bind-address=:9395
  609.             - --node-scheduler-policy=binpack
  610.             - --gpu-scheduler-policy=spread
  611.             - --device-config-file=/device-config.yaml
  612.             - --debug
  613.             - -v=4
  614.           ports:
  615.             - name: http
  616.               containerPort: 443
  617.               protocol: TCP
  618.           volumeMounts:
  619.             - name: tls-config
  620.               mountPath: /tls
  621.             - name: device-config
  622.               mountPath: /device-config.yaml
  623.               subPath: device-config.yaml
  624.       volumes:
  625.         - name: tls-config
  626.           secret:
  627.             secretName: hami-scheduler-tls
  628.         - name: scheduler-config
  629.           configMap:
  630.             name: hami-scheduler-newversion
  631.         - name: device-config
  632.           configMap:
  633.             name: hami-scheduler-device
  634. ---
  635. # Source: hami/templates/scheduler/webhook.yaml
  636. apiVersion: admissionregistration.k8s.io/v1
  637. kind: MutatingWebhookConfiguration
  638. metadata:
  639.   name: hami-webhook
  640. webhooks:
  641.   - admissionReviewVersions:
  642.     - v1beta1
  643.     clientConfig:
  644.       service:
  645.         name: hami-scheduler
  646.         namespace: kube-system
  647.         path: /webhook
  648.         port: 443
  649.     failurePolicy: Ignore
  650.     matchPolicy: Equivalent
  651.     name: vgpu.hami.io
  652.     namespaceSelector:
  653.       matchExpressions:
  654.       - key: hami.io/webhook
  655.         operator: NotIn
  656.         values:
  657.         - ignore
  658.     objectSelector:
  659.       matchExpressions:
  660.       - key: hami.io/webhook
  661.         operator: NotIn
  662.         values:
  663.         - ignore
  664.     reinvocationPolicy: Never
  665.     rules:
  666.       - apiGroups:
  667.           - ""
  668.         apiVersions:
  669.           - v1
  670.         operations:
  671.           - CREATE
  672.         resources:
  673.           - pods
  674.         scope: '*'
  675.     sideEffects: None
  676.     timeoutSeconds: 10
  677. ---
  678. # Source: hami/templates/scheduler/job-patch/serviceaccount.yaml
  679. apiVersion: v1
  680. kind: ServiceAccount
  681. metadata:
  682.   name: hami-admission
  683.   annotations:
  684.     "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade
  685.     "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
  686.   labels:
  687.     helm.sh/chart: hami-2.4.0
  688.     app.kubernetes.io/name: hami
  689.     app.kubernetes.io/instance: hami
  690.     app.kubernetes.io/version: "2.4.0"
  691.     app.kubernetes.io/managed-by: Helm
  692.     app.kubernetes.io/component: admission-webhook
  693. ---
  694. # Source: hami/templates/scheduler/job-patch/clusterrole.yaml
  695. apiVersion: rbac.authorization.k8s.io/v1
  696. kind: ClusterRole
  697. metadata:
  698.   name: hami-admission
  699.   annotations:
  700.     "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade
  701.     "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
  702.   labels:
  703.     helm.sh/chart: hami-2.4.0
  704.     app.kubernetes.io/name: hami
  705.     app.kubernetes.io/instance: hami
  706.     app.kubernetes.io/version: "2.4.0"
  707.     app.kubernetes.io/managed-by: Helm
  708.     app.kubernetes.io/component: admission-webhook
  709. rules:
  710.   - apiGroups:
  711.       - admissionregistration.k8s.io
  712.     resources:
  713.       #- validatingwebhookconfigurations
  714.       - mutatingwebhookconfigurations
  715.     verbs:
  716.       - get
  717.       - update
  718. ---
  719. # Source: hami/templates/scheduler/job-patch/clusterrolebinding.yaml
  720. apiVersion: rbac.authorization.k8s.io/v1
  721. kind: ClusterRoleBinding
  722. metadata:
  723.   name:  hami-admission
  724.   annotations:
  725.     "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade
  726.     "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
  727.   labels:
  728.     helm.sh/chart: hami-2.4.0
  729.     app.kubernetes.io/name: hami
  730.     app.kubernetes.io/instance: hami
  731.     app.kubernetes.io/version: "2.4.0"
  732.     app.kubernetes.io/managed-by: Helm
  733.     app.kubernetes.io/component: admission-webhook
  734. roleRef:
  735.   apiGroup: rbac.authorization.k8s.io
  736.   kind: ClusterRole
  737.   name: hami-admission
  738. subjects:
  739.   - kind: ServiceAccount
  740.     name: hami-admission
  741.     namespace: "kube-system"
  742. ---
  743. # Source: hami/templates/scheduler/job-patch/role.yaml
  744. apiVersion: rbac.authorization.k8s.io/v1
  745. kind: Role
  746. metadata:
  747.   name:  hami-admission
  748.   annotations:
  749.     "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade
  750.     "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
  751.   labels:
  752.     helm.sh/chart: hami-2.4.0
  753.     app.kubernetes.io/name: hami
  754.     app.kubernetes.io/instance: hami
  755.     app.kubernetes.io/version: "2.4.0"
  756.     app.kubernetes.io/managed-by: Helm
  757.     app.kubernetes.io/component: admission-webhook
  758. rules:
  759.   - apiGroups:
  760.       - ""
  761.     resources:
  762.       - secrets
  763.     verbs:
  764.       - get
  765.       - create
  766. ---
  767. # Source: hami/templates/scheduler/job-patch/rolebinding.yaml
  768. apiVersion: rbac.authorization.k8s.io/v1
  769. kind: RoleBinding
  770. metadata:
  771.   name: hami-admission
  772.   annotations:
  773.     "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade
  774.     "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
  775.   labels:
  776.     helm.sh/chart: hami-2.4.0
  777.     app.kubernetes.io/name: hami
  778.     app.kubernetes.io/instance: hami
  779.     app.kubernetes.io/version: "2.4.0"
  780.     app.kubernetes.io/managed-by: Helm
  781.     app.kubernetes.io/component: admission-webhook
  782. roleRef:
  783.   apiGroup: rbac.authorization.k8s.io
  784.   kind: Role
  785.   name: hami-admission
  786. subjects:
  787.   - kind: ServiceAccount
  788.     name: hami-admission
  789.     namespace: "kube-system"
  790. ---
  791. # Source: hami/templates/scheduler/job-patch/job-createSecret.yaml
  792. apiVersion: batch/v1
  793. kind: Job
  794. metadata:
  795.   name: hami-admission-create
  796.   annotations:
  797.     "helm.sh/hook": pre-install,pre-upgrade
  798.     "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
  799.   labels:
  800.     helm.sh/chart: hami-2.4.0
  801.     app.kubernetes.io/name: hami
  802.     app.kubernetes.io/instance: hami
  803.     app.kubernetes.io/version: "2.4.0"
  804.     app.kubernetes.io/managed-by: Helm
  805.     app.kubernetes.io/component: admission-webhook
  806. spec:
  807.   template:
  808.     metadata:
  809.       name: hami-admission-create
  810.       labels:
  811.         helm.sh/chart: hami-2.4.0
  812.         app.kubernetes.io/name: hami
  813.         app.kubernetes.io/instance: hami
  814.         app.kubernetes.io/version: "2.4.0"
  815.         app.kubernetes.io/managed-by: Helm
  816.         app.kubernetes.io/component: admission-webhook
  817.         hami.io/webhook: ignore
  818.     spec:
  819.       imagePullSecrets:
  820.         []
  821.       containers:
  822.         - name: create
  823.           image: liangjw/kube-webhook-certgen:v1.1.1
  824.           imagePullPolicy: IfNotPresent
  825.           args:
  826.             - create
  827.             - --cert-name=tls.crt
  828.             - --key-name=tls.key
  829.             - --host=hami-scheduler.kube-system.svc,127.0.0.1
  830.             - --namespace=kube-system
  831.             - --secret-name=hami-scheduler-tls
  832.       restartPolicy: OnFailure
  833.       serviceAccountName: hami-admission
  834.       securityContext:
  835.         runAsNonRoot: true
  836.         runAsUser: 2000
  837. ---
  838. # Source: hami/templates/scheduler/job-patch/job-patchWebhook.yaml
  839. apiVersion: batch/v1
  840. kind: Job
  841. metadata:
  842.   name: hami-admission-patch
  843.   annotations:
  844.     "helm.sh/hook": post-install,post-upgrade
  845.     "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
  846.   labels:
  847.     helm.sh/chart: hami-2.4.0
  848.     app.kubernetes.io/name: hami
  849.     app.kubernetes.io/instance: hami
  850.     app.kubernetes.io/version: "2.4.0"
  851.     app.kubernetes.io/managed-by: Helm
  852.     app.kubernetes.io/component: admission-webhook
  853. spec:
  854.   template:
  855.     metadata:
  856.       name: hami-admission-patch
  857.       labels:
  858.         helm.sh/chart: hami-2.4.0
  859.         app.kubernetes.io/name: hami
  860.         app.kubernetes.io/instance: hami
  861.         app.kubernetes.io/version: "2.4.0"
  862.         app.kubernetes.io/managed-by: Helm
  863.         app.kubernetes.io/component: admission-webhook
  864.         hami.io/webhook: ignore
  865.     spec:
  866.       imagePullSecrets:
  867.         []
  868.       containers:
  869.         - name: patch
  870.           image: liangjw/kube-webhook-certgen:v1.1.1
  871.           imagePullPolicy: IfNotPresent
  872.           args:
  873.             - patch
  874.             - --webhook-name=hami-webhook
  875.             - --namespace=kube-system
  876.             - --patch-validating=false
  877.             - --secret-name=hami-scheduler-tls
  878.       restartPolicy: OnFailure
  879.       serviceAccountName: hami-admission
  880.       securityContext:
  881.         runAsNonRoot: true
  882.         runAsUser: 2000
复制代码

部署dcgm-exporter
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4.   name: "dcgm-exporter"
  5.   labels:
  6.     app.kubernetes.io/name: "dcgm-exporter"
  7.     app.kubernetes.io/version: "3.6.1"
  8. spec:
  9.   updateStrategy:
  10.     type: RollingUpdate
  11.   selector:
  12.     matchLabels:
  13.       app.kubernetes.io/name: "dcgm-exporter"
  14.       app.kubernetes.io/version: "3.6.1"
  15.   template:
  16.     metadata:
  17.       labels:
  18.         app.kubernetes.io/name: "dcgm-exporter"
  19.         app.kubernetes.io/version: "3.6.1"
  20.       name: "dcgm-exporter"
  21.     spec:
  22.       containers:
  23.       - image: "nvcr.io/nvidia/k8s/dcgm-exporter:3.3.9-3.6.1-ubuntu22.04"
  24.         env:
  25.         - name: "DCGM_EXPORTER_LISTEN"
  26.           value: ":9400"
  27.         - name: "DCGM_EXPORTER_KUBERNETES"
  28.           value: "true"
  29.         name: "dcgm-exporter"
  30.         ports:
  31.         - name: "metrics"
  32.           containerPort: 9400
  33.         securityContext:
  34.           runAsNonRoot: false
  35.           runAsUser: 0
  36.           capabilities:
  37.             add: ["SYS_ADMIN"]
  38.         volumeMounts:
  39.         - name: "pod-gpu-resources"
  40.           readOnly: true
  41.           mountPath: "/var/lib/kubelet/pod-resources"
  42.       volumes:
  43.       - name: "pod-gpu-resources"
  44.         hostPath:
  45.           path: "/var/lib/kubelet/pod-resources"
  46. ---
  47. kind: Service
  48. apiVersion: v1
  49. metadata:
  50.   name: "dcgm-exporter"
  51.   labels:
  52.     app.kubernetes.io/name: "dcgm-exporter"
  53.     app.kubernetes.io/version: "3.6.1"
  54. spec:
  55.   selector:
  56.     app.kubernetes.io/name: "dcgm-exporter"
  57.     app.kubernetes.io/version: "3.6.1"
  58.   ports:
  59.   - name: "metrics"
  60.     port: 9400
复制代码
dcgm-exporter安装成功



参考这个hami-vgpu  dashboard 下载panel 的json文件
hami-vgpu-dashboard | Grafana Labs 导入后grafana中将创建一个名为“hami-vgpu-dashboard”的dashboard,但此页面中有一些Panel如vGPUCorePercentage还没有数据

ServiceMonitor 是 Prometheus Operator 中的一个自定义资源,主要用于监控 Kubernetes 中的服务。它的作用包罗:
1. 自动化发现

ServiceMonitor 允许 Prometheus 自动发现和监控 Kubernetes 中的服务。通过定义 ServiceMonitor,您可以告诉 Prometheus 监控特定服务的端点。
2. 配置抓取参数

您可以在 ServiceMonitor 中设置抓取的相关参数,比方:


dcgm-exporter须要配置两个service monitor
hami-device-plugin-svc-monitor.yaml
  1. apiVersion: monitoring.coreos.com/v1
  2. kind: ServiceMonitor
  3. metadata:
  4.   name: hami-device-plugin-svc-monitor
  5.   namespace: kube-system
  6. spec:
  7.   selector:
  8.     matchLabels:
  9.       app.kubernetes.io/component: hami-device-plugin
  10.   namespaceSelector:
  11.     matchNames:
  12.       - kube-system
  13.   endpoints:
  14.     - path: /metrics
  15.       port: monitorport
  16.       interval: "15s"
  17.       honorLabels: false
  18.       relabelings:
  19.         - sourceLabels: [__meta_kubernetes_endpoints_name]
  20.           regex: hami-.*
  21.           replacement: $1
  22.           action: keep
  23.         - sourceLabels: [__meta_kubernetes_pod_node_name]
  24.           regex: (.*)
  25.           targetLabel: node_name
  26.           replacement: ${1}
  27.           action: replace
  28.         - sourceLabels: [__meta_kubernetes_pod_host_ip]
  29.           regex: (.*)
  30.           targetLabel: ip
  31.           replacement: $1
  32.           action: replace
复制代码
hami-scheduler-svc-monitor.yaml
  1. apiVersion: monitoring.coreos.com/v1
  2. kind: ServiceMonitor
  3. metadata:
  4.   name: hami-scheduler-svc-monitor
  5.   namespace: kube-system
  6. spec:
  7.   selector:
  8.     matchLabels:
  9.       app.kubernetes.io/component: hami-scheduler
  10.   namespaceSelector:
  11.     matchNames:
  12.       - kube-system
  13.   endpoints:
  14.     - path: /metrics
  15.       port: monitor
  16.       interval: "15s"
  17.       honorLabels: false
  18.       relabelings:
  19.         - sourceLabels: [__meta_kubernetes_endpoints_name]
  20.           regex: hami-.*
  21.           replacement: $1
  22.           action: keep
  23.         - sourceLabels: [__meta_kubernetes_pod_node_name]
  24.           regex: (.*)
  25.           targetLabel: node_name
  26.           replacement: ${1}
  27.           action: replace
  28.         - sourceLabels: [__meta_kubernetes_pod_host_ip]
  29.           regex: (.*)
  30.           targetLabel: ip
  31.           replacement: $1
  32.           action: replace
复制代码
确认创建的ServiceMonitor



启动gpu pod一个测试下
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: gpu-pod-1
  5. spec:
  6.   restartPolicy: Never
  7.   containers:
  8.     - name: cuda-container
  9.       image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.2.1
  10.       command: ["sleep", "infinity"]
  11.       resources:
  12.         limits:
  13.           nvidia.com/gpu: 1
  14.           nvidia.com/gpumem: 1000
  15.           nvidia.com/gpucores: 10
复制代码
如果看到pod不绝pending 状态

检查下节点如果出现下面gpu为0的环境

须要
  1.    docker:
  2.                 1:下载NVIDIA-DOCKER2安装包并安装
  3.                 2:修改/etc/docker/daemon.json文件内容加上
  4.                         {
  5.                         "default-runtime": "nvidia",
  6.                                 "runtimes": {
  7.                                         "nvidia": {
  8.                                                 "path": "/usr/bin/nvidia-container-runtime",
  9.                                                 "runtimeArgs": []
  10.                                         }
  11.                                 },
  12.                         }
  13.         k8s:
  14.                 1:下载k8s-device-plugin 镜像
  15.                 2:编写nvidia-device-plugin.yml创建驱动pod
复制代码
使用这个yml进行创建
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4.   name: nvidia-device-plugin-daemonset
  5.   namespace: kube-system
  6. spec:
  7.   selector:
  8.     matchLabels:
  9.       name: nvidia-device-plugin-ds
  10.   updateStrategy:
  11.     type: RollingUpdate
  12.   template:
  13.     metadata:
  14.       labels:
  15.         name: nvidia-device-plugin-ds
  16.     spec:
  17.       tolerations:
  18.       - key: nvidia.com/gpu
  19.         operator: Exists
  20.         effect: NoSchedule
  21.       priorityClassName: "system-node-critical"
  22.       containers:
  23.       - image: nvidia/k8s-device-plugin:1.11
  24.         name: nvidia-device-plugin-ctr
  25.         env:
  26.           - name: FAIL_ON_INIT_ERROR
  27.             value: "false"
  28.         securityContext:
  29.           allowPrivilegeEscalation: false
  30.           capabilities:
  31.             drop: ["ALL"]
  32.         volumeMounts:
  33.         - name: device-plugin
  34.           mountPath: /var/lib/kubelet/device-plugins
  35.       volumes:
  36.       - name: device-plugin
  37.         hostPath:
  38.           path: /var/lib/kubelet/device-plugins
复制代码

gpu pod启动后进入查看下, gpu内存和限制的大小雷同设置成功


访问下{scheduler node ip}:31993/metrics 

日志最后有两行
  1. vGPUPodsDeviceAllocated{containeridx="0",deviceusedcore="40",deviceuuid="GPU-7666e9de-679b-a768-51c6-260b81cd00ec",nodename="192.168.110.126",podname="gpu-pod-1",podnamespace="default",zone="vGPU"} 1.048576e+10
  2. vGPUPodsDeviceAllocated{containeridx="0",deviceusedcore="40",deviceuuid="GPU-7666e9de-679b-a768-51c6-260b81cd00ec",nodename="192.168.110.126",podname="gpu-pod-2",podnamespace="default",zone="vGPU"} 1.048576e+10
复制代码
可以看到雷同deviceuuid的gpu被不同pod共享使用
exec进入hami-device-plugin  daemonset里面执行nvidia-smi -L 可以看到呆板上所有显卡的信息
   root@node126:/# nvidia-smi -L
GPU 0: NVIDIA GeForce RTX 4090 (UUID: GPU-7666e9de-679b-a768-51c6-260b81cd00ec)
GPU 1: NVIDIA GeForce RTX 4090 (UUID: GPU-9f32af29-1a72-6e47-af2c-72b1130a176b)
root@node126:/# 
  
之前创建的两个serviceMonitor会去请求
app.kubernetes.io/component: hami-scheduler 和app.kubernetes.io/component: hami-device-plugin 的/metrics  接口获取数据
当gpu-pod跑起来以后查看hami-vgpu-metrics-dashboard




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4