feat(nvidia_device_plugin): add initial NVIDIA device plugin role skeleton
This commit is contained in:
parent
20aaf42a0a
commit
f768b3f155
8 changed files with 371 additions and 0 deletions
63
roles/nvidia_device_plugin/README.md
Normal file
63
roles/nvidia_device_plugin/README.md
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
# NVIDIA Device Plugin
|
||||||
|
|
||||||
|
Installs NVIDIA Kubernetes Device Plugin via Helm with GPU Feature Discovery support.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Kubernetes cluster with NVIDIA GPU workers
|
||||||
|
- NVIDIA drivers installed on GPU nodes
|
||||||
|
- nvidia-container-toolkit configured
|
||||||
|
|
||||||
|
## Role Variables
|
||||||
|
|
||||||
|
| Variable | Default | Description |
|
||||||
|
|----------|---------|-------------|
|
||||||
|
| `nvidia_device_plugin_chart_version` | `0.17.1` | NVIDIA device plugin Helm chart version |
|
||||||
|
| `nvidia_device_plugin_namespace` | `nvidia-device-plugin` | Kubernetes namespace |
|
||||||
|
| `nvidia_device_plugin_config` | `{}` | ConfigMap configuration |
|
||||||
|
| `nvidia_device_plugin_compat_with_cpu_manager` | `false` | Enable CPUManager compatibility |
|
||||||
|
| `nvidia_device_plugin_mig_strategy` | `none` | MIG strategy: `none`, `single`, `mixed` |
|
||||||
|
| `nvidia_device_plugin_fail_on_init_error` | `true` | Fail on init error |
|
||||||
|
| `nvidia_device_plugin_device_list_strategy` | `envvar` | Device list strategy |
|
||||||
|
| `nvidia_device_plugin_device_id_strategy` | `uuid` | Device ID strategy |
|
||||||
|
| `nvidia_device_plugin_nvidia_driver_root` | `/` | NVIDIA driver root path |
|
||||||
|
| `nvidia_device_plugin_gfd.enabled` | `true` | Deploy GPU Feature Discovery |
|
||||||
|
| `nvidia_device_plugin_nfd` | see defaults | Node Feature Discovery config |
|
||||||
|
|
||||||
|
## Example Playbook
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- hosts: k8s_manager
|
||||||
|
become: false
|
||||||
|
roles:
|
||||||
|
- nvidia_device_plugin
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration Examples
|
||||||
|
|
||||||
|
### MIG Strategy
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
nvidia_device_plugin_mig_strategy: "mixed"
|
||||||
|
```
|
||||||
|
|
||||||
|
### ConfigMap
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
nvidia_device_plugin_config:
|
||||||
|
map:
|
||||||
|
default: |
|
||||||
|
version: v1
|
||||||
|
flags:
|
||||||
|
migStrategy: none
|
||||||
|
mig-mixed: |
|
||||||
|
version: v1
|
||||||
|
flags:
|
||||||
|
migStrategy: mixed
|
||||||
|
default: "default"
|
||||||
|
```
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [NVIDIA k8s-device-plugin GitHub](https://github.com/NVIDIA/k8s-device-plugin)
|
||||||
|
- [Helm Chart Values](https://github.com/NVIDIA/k8s-device-plugin/blob/v0.17.1/deployments/helm/nvidia-device-plugin/values.yaml)
|
||||||
97
roles/nvidia_device_plugin/defaults/main.yml
Normal file
97
roles/nvidia_device_plugin/defaults/main.yml
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
---
|
||||||
|
nvidia_device_plugin_chart_version: "0.17.1"
|
||||||
|
nvidia_device_plugin_namespace: nvidia-device-plugin
|
||||||
|
|
||||||
|
nvidia_device_plugin_config:
|
||||||
|
map: {}
|
||||||
|
default: ""
|
||||||
|
name: ""
|
||||||
|
|
||||||
|
nvidia_device_plugin_compat_with_cpu_manager: false
|
||||||
|
nvidia_device_plugin_mig_strategy: "none"
|
||||||
|
nvidia_device_plugin_fail_on_init_error: true
|
||||||
|
nvidia_device_plugin_device_list_strategy: "envvar"
|
||||||
|
nvidia_device_plugin_device_id_strategy: "uuid"
|
||||||
|
nvidia_device_plugin_nvidia_driver_root: "/"
|
||||||
|
|
||||||
|
nvidia_device_plugin_image:
|
||||||
|
repository: nvcr.io/nvidia/k8s-device-plugin
|
||||||
|
tag: ""
|
||||||
|
pull_policy: IfNotPresent
|
||||||
|
|
||||||
|
nvidia_device_plugin_resources: {}
|
||||||
|
|
||||||
|
nvidia_device_plugin_node_selector: {}
|
||||||
|
|
||||||
|
nvidia_device_plugin_affinity:
|
||||||
|
node_affinity:
|
||||||
|
required_during_scheduling_ignored_during_execution:
|
||||||
|
node_selector_terms:
|
||||||
|
- match_expressions:
|
||||||
|
- key: feature.node.kubernetes.io/pci-10de.present
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- "true"
|
||||||
|
- match_expressions:
|
||||||
|
- key: feature.node.kubernetes.io/cpu-model.vendor_id
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- "NVIDIA"
|
||||||
|
- match_expressions:
|
||||||
|
- key: nvidia.com/gpu.present
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- "true"
|
||||||
|
|
||||||
|
nvidia_device_plugin_tolerations:
|
||||||
|
- key: CriticalAddonsOnly
|
||||||
|
operator: Exists
|
||||||
|
- key: nvidia.com/gpu
|
||||||
|
operator: Exists
|
||||||
|
effect: NoSchedule
|
||||||
|
|
||||||
|
nvidia_device_plugin_priority_class_name: "system-node-critical"
|
||||||
|
|
||||||
|
nvidia_device_plugin_runtime_class_name: null
|
||||||
|
|
||||||
|
nvidia_device_plugin_gfd:
|
||||||
|
enabled: true
|
||||||
|
name_override: gpu-feature-discovery
|
||||||
|
no_timestamp: null
|
||||||
|
sleep_interval: null
|
||||||
|
security_context:
|
||||||
|
privileged: true
|
||||||
|
|
||||||
|
nvidia_device_plugin_nfd:
|
||||||
|
name_override: node-feature-discovery
|
||||||
|
enable_node_feature_api: false
|
||||||
|
master:
|
||||||
|
service_account:
|
||||||
|
name: node-feature-discovery
|
||||||
|
create: true
|
||||||
|
config:
|
||||||
|
extra_label_ns:
|
||||||
|
- nvidia.com
|
||||||
|
worker:
|
||||||
|
tolerations:
|
||||||
|
- key: node-role.kubernetes.io/master
|
||||||
|
operator: Equal
|
||||||
|
value: ""
|
||||||
|
effect: NoSchedule
|
||||||
|
- key: nvidia.com/gpu
|
||||||
|
operator: Equal
|
||||||
|
value: present
|
||||||
|
effect: NoSchedule
|
||||||
|
config:
|
||||||
|
sources:
|
||||||
|
pci:
|
||||||
|
device_class_whitelist:
|
||||||
|
- "02"
|
||||||
|
- "03"
|
||||||
|
device_label_fields:
|
||||||
|
- vendor
|
||||||
|
|
||||||
|
nvidia_device_plugin_mps:
|
||||||
|
root: "/run/nvidia/mps"
|
||||||
|
|
||||||
|
nvidia_device_plugin_kubeconfig: "/home/{{ ansible_user }}/.kube/config"
|
||||||
12
roles/nvidia_device_plugin/meta/main.yml
Normal file
12
roles/nvidia_device_plugin/meta/main.yml
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
---
|
||||||
|
galaxy_info:
|
||||||
|
role_name: nvidia_device_plugin
|
||||||
|
author: ops
|
||||||
|
description: Installs NVIDIA Kubernetes Device Plugin via Helm with GPU Feature Discovery support
|
||||||
|
license: MIT
|
||||||
|
min_ansible_version: "2.14"
|
||||||
|
platforms:
|
||||||
|
- name: EL
|
||||||
|
versions:
|
||||||
|
- "9"
|
||||||
|
dependencies: []
|
||||||
36
roles/nvidia_device_plugin/tasks/deploy.yml
Normal file
36
roles/nvidia_device_plugin/tasks/deploy.yml
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
---
|
||||||
|
- name: Helm | Add NVIDIA device plugin chart repository
|
||||||
|
ansible.builtin.command: helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
|
||||||
|
environment:
|
||||||
|
KUBECONFIG: "{{ nvidia_device_plugin_kubeconfig }}"
|
||||||
|
PATH: "/usr/local/bin:/usr/bin:/bin"
|
||||||
|
register: _helm_repo_add
|
||||||
|
changed_when: "'already exists' not in _helm_repo_add.stdout"
|
||||||
|
failed_when: _helm_repo_add.rc != 0 and 'already exists' not in _helm_repo_add.stdout
|
||||||
|
|
||||||
|
- name: Helm | Update chart repositories
|
||||||
|
ansible.builtin.command: helm repo update
|
||||||
|
environment:
|
||||||
|
KUBECONFIG: "{{ nvidia_device_plugin_kubeconfig }}"
|
||||||
|
PATH: "/usr/local/bin:/usr/bin:/bin"
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: NVIDIA Device Plugin | Render values
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: values.yml.j2
|
||||||
|
dest: /tmp/nvidia-device-plugin-values.yml
|
||||||
|
mode: "0600"
|
||||||
|
|
||||||
|
- name: NVIDIA Device Plugin | Install or upgrade
|
||||||
|
ansible.builtin.command: >
|
||||||
|
helm upgrade --install nvidia-device-plugin nvdp/nvidia-device-plugin
|
||||||
|
--namespace {{ nvidia_device_plugin_namespace }}
|
||||||
|
--version {{ nvidia_device_plugin_chart_version }}
|
||||||
|
--values /tmp/nvidia-device-plugin-values.yml
|
||||||
|
--timeout 15m0s
|
||||||
|
--wait
|
||||||
|
environment:
|
||||||
|
KUBECONFIG: "{{ nvidia_device_plugin_kubeconfig }}"
|
||||||
|
PATH: "/usr/local/bin:/usr/bin:/bin"
|
||||||
|
register: _helm_install
|
||||||
|
changed_when: "'STATUS: deployed' in _helm_install.stdout or 'has been upgraded' in _helm_install.stdout"
|
||||||
16
roles/nvidia_device_plugin/tasks/gfd.yml
Normal file
16
roles/nvidia_device_plugin/tasks/gfd.yml
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
---
|
||||||
|
- name: GPU Feature Discovery | Check if already deployed
|
||||||
|
ansible.builtin.kubectl:
|
||||||
|
name: "gpu-feature-discovery"
|
||||||
|
kind: "DaemonSet"
|
||||||
|
namespace: "{{ nvidia_device_plugin_namespace }}"
|
||||||
|
state: "list"
|
||||||
|
environment:
|
||||||
|
KUBECONFIG: "{{ nvidia_device_plugin_kubeconfig }}"
|
||||||
|
PATH: "/usr/local/bin:/usr/bin:/bin"
|
||||||
|
register: _gfd_check
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: GPU Feature Discovery | Deploy via Helm (if enabled in values)
|
||||||
|
ansible.builtin.include_tasks: deploy.yml
|
||||||
|
when: nvidia_device_plugin_gfd.enabled and (_gfd_check.stdout | length == 0)
|
||||||
9
roles/nvidia_device_plugin/tasks/main.yml
Normal file
9
roles/nvidia_device_plugin/tasks/main.yml
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
---
|
||||||
|
- name: Create namespace
|
||||||
|
ansible.builtin.include_tasks: namespace.yml
|
||||||
|
|
||||||
|
- name: Deploy NVIDIA Device Plugin via Helm
|
||||||
|
ansible.builtin.include_tasks: deploy.yml
|
||||||
|
|
||||||
|
- name: Deploy GPU Feature Discovery
|
||||||
|
ansible.builtin.include_tasks: gfd.yml
|
||||||
10
roles/nvidia_device_plugin/tasks/namespace.yml
Normal file
10
roles/nvidia_device_plugin/tasks/namespace.yml
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
- name: Create namespace
|
||||||
|
ansible.builtin.kubectl:
|
||||||
|
name: "{{ nvidia_device_plugin_namespace }}"
|
||||||
|
api_version: "v1"
|
||||||
|
kind: "Namespace"
|
||||||
|
state: "present"
|
||||||
|
environment:
|
||||||
|
KUBECONFIG: "{{ nvidia_device_plugin_kubeconfig }}"
|
||||||
|
PATH: "/usr/local/bin:/usr/bin:/bin"
|
||||||
128
roles/nvidia_device_plugin/templates/values.yml.j2
Normal file
128
roles/nvidia_device_plugin/templates/values.yml.j2
Normal file
|
|
@ -0,0 +1,128 @@
|
||||||
|
{% if nvidia_device_plugin_config.name or nvidia_device_plugin_config.map %}
|
||||||
|
config:
|
||||||
|
{% if nvidia_device_plugin_config.name %}
|
||||||
|
name: "{{ nvidia_device_plugin_config.name }}"
|
||||||
|
{% endif %}
|
||||||
|
{% if nvidia_device_plugin_config.map %}
|
||||||
|
map:
|
||||||
|
{% for key, value in nvidia_device_plugin_config.map.items() %}
|
||||||
|
{{ key }}: |
|
||||||
|
{{ value | indent(6, false) }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% if nvidia_device_plugin_config.default %}
|
||||||
|
default: "{{ nvidia_device_plugin_config.default }}"
|
||||||
|
{% endif %}
|
||||||
|
{% if nvidia_device_plugin_config.fallback_strategies %}
|
||||||
|
fallbackStrategies: {{ nvidia_device_plugin_config.fallback_strategies }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
compatWithCPUManager: {{ nvidia_device_plugin_compat_with_cpu_manager | lower }}
|
||||||
|
|
||||||
|
{% if nvidia_device_plugin_mig_strategy is defined and nvidia_device_plugin_mig_strategy %}
|
||||||
|
migStrategy: "{{ nvidia_device_plugin_mig_strategy }}"
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if nvidia_device_plugin_fail_on_init_error is defined %}
|
||||||
|
failOnInitError: {{ nvidia_device_plugin_fail_on_init_error | lower }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if nvidia_device_plugin_device_list_strategy is defined and nvidia_device_plugin_device_list_strategy %}
|
||||||
|
deviceListStrategy: "{{ nvidia_device_plugin_device_list_strategy }}"
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if nvidia_device_plugin_device_id_strategy is defined and nvidia_device_plugin_device_id_strategy %}
|
||||||
|
deviceIDStrategy: "{{ nvidia_device_plugin_device_id_strategy }}"
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if nvidia_device_plugin_nvidia_driver_root is defined and nvidia_device_plugin_nvidia_driver_root %}
|
||||||
|
nvidiaDriverRoot: "{{ nvidia_device_plugin_nvidia_driver_root }}"
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: {{ nvidia_device_plugin_image.repository }}
|
||||||
|
tag: "{{ nvidia_device_plugin_image.tag }}"
|
||||||
|
pullPolicy: {{ nvidia_device_plugin_image.pull_policy }}
|
||||||
|
|
||||||
|
resources: {{ nvidia_device_plugin_resources | default({}) | to_nice_yaml(indent=2) | indent(2) }}
|
||||||
|
|
||||||
|
nodeSelector: {{ nvidia_device_plugin_node_selector | default({}) | to_nice_yaml(indent=2) | indent(2) }}
|
||||||
|
|
||||||
|
affinity:
|
||||||
|
nodeAffinity:
|
||||||
|
requiredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
nodeSelectorTerms:
|
||||||
|
{% for term in nvidia_device_plugin_affinity.node_affinity.required_during_scheduling_ignored_during_execution.node_selector_terms %}
|
||||||
|
- matchExpressions:
|
||||||
|
{% for expr in term.match_expressions %}
|
||||||
|
- key: {{ expr.key }}
|
||||||
|
operator: {{ expr.operator }}
|
||||||
|
values:
|
||||||
|
{% for val in expr.values %}
|
||||||
|
- {{ val }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
tolerations: {{ nvidia_device_plugin_tolerations | to_nice_yaml(indent=2) | indent(2) }}
|
||||||
|
|
||||||
|
priorityClassName: "{{ nvidia_device_plugin_priority_class_name }}"
|
||||||
|
|
||||||
|
{% if nvidia_device_plugin_runtime_class_name is defined and nvidia_device_plugin_runtime_class_name %}
|
||||||
|
runtimeClassName: "{{ nvidia_device_plugin_runtime_class_name }}"
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
devicePlugin:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
{% if nvidia_device_plugin_gfd.enabled %}
|
||||||
|
gfd:
|
||||||
|
enabled: true
|
||||||
|
nameOverride: "{{ nvidia_device_plugin_gfd.name_override }}"
|
||||||
|
{% if nvidia_device_plugin_gfd.no_timestamp is defined %}
|
||||||
|
noTimestamp: {{ nvidia_device_plugin_gfd.no_timestamp | lower }}
|
||||||
|
{% endif %}
|
||||||
|
{% if nvidia_device_plugin_gfd.sleep_interval is defined %}
|
||||||
|
sleepInterval: "{{ nvidia_device_plugin_gfd.sleep_interval }}"
|
||||||
|
{% endif %}
|
||||||
|
securityContext:
|
||||||
|
privileged: {{ nvidia_device_plugin_gfd.security_context.privileged | lower }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if nvidia_device_plugin_nfd %}
|
||||||
|
nfd:
|
||||||
|
nameOverride: "{{ nvidia_device_plugin_nfd.name_override }}"
|
||||||
|
enableNodeFeatureApi: {{ nvidia_device_plugin_nfd.enable_node_feature_api | lower }}
|
||||||
|
master:
|
||||||
|
serviceAccount:
|
||||||
|
name: "{{ nvidia_device_plugin_nfd.master.service_account.name }}"
|
||||||
|
create: {{ nvidia_device_plugin_nfd.master.service_account.create | lower }}
|
||||||
|
config:
|
||||||
|
extraLabelNs:
|
||||||
|
{% for ns in nvidia_device_plugin_nfd.master.config.extra_label_ns %}
|
||||||
|
- {{ ns }}
|
||||||
|
{% endfor %}
|
||||||
|
worker:
|
||||||
|
tolerations:
|
||||||
|
{% for tol in nvidia_device_plugin_nfd.worker.tolerations %}
|
||||||
|
- key: "{{ tol.key }}"
|
||||||
|
operator: "{{ tol.operator }}"
|
||||||
|
value: "{{ tol.value | default('') }}"
|
||||||
|
effect: "{{ tol.effect }}"
|
||||||
|
{% endfor %}
|
||||||
|
config:
|
||||||
|
sources:
|
||||||
|
pci:
|
||||||
|
deviceClassWhitelist:
|
||||||
|
{% for cls in nvidia_device_plugin_nfd.worker.config.sources.pci.device_class_whitelist %}
|
||||||
|
- {{ cls }}
|
||||||
|
{% endfor %}
|
||||||
|
deviceLabelFields:
|
||||||
|
{% for field in nvidia_device_plugin_nfd.worker.config.sources.pci.device_label_fields %}
|
||||||
|
- {{ field }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
mps:
|
||||||
|
root: "{{ nvidia_device_plugin_mps.root }}"
|
||||||
Loading…
Reference in a new issue