From 1c7d6d403e62e4b5cb291244e3364c3136d24d6c Mon Sep 17 00:00:00 2001 From: Ingvarr Zhmakin <19270832+lazyoldbear@users.noreply.github.com> Date: Thu, 11 Feb 2021 10:22:30 +0100 Subject: [PATCH] [smarter-device-manager] New chart (#532) --- charts/smarter-device-manager/.helmignore | 24 ++++ charts/smarter-device-manager/Chart.yaml | 22 ++++ charts/smarter-device-manager/README.md | 111 ++++++++++++++++++ .../templates/common.yaml | 77 ++++++++++++ .../templates/configmap.yaml | 38 ++++++ charts/smarter-device-manager/values.yaml | 32 +++++ 6 files changed, 304 insertions(+) create mode 100644 charts/smarter-device-manager/.helmignore create mode 100644 charts/smarter-device-manager/Chart.yaml create mode 100644 charts/smarter-device-manager/README.md create mode 100644 charts/smarter-device-manager/templates/common.yaml create mode 100644 charts/smarter-device-manager/templates/configmap.yaml create mode 100644 charts/smarter-device-manager/values.yaml diff --git a/charts/smarter-device-manager/.helmignore b/charts/smarter-device-manager/.helmignore new file mode 100644 index 00000000..e559de0a --- /dev/null +++ b/charts/smarter-device-manager/.helmignore @@ -0,0 +1,24 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +# OWNERS file for Kubernetes +OWNERS diff --git a/charts/smarter-device-manager/Chart.yaml b/charts/smarter-device-manager/Chart.yaml new file mode 100644 index 00000000..3cb1d6f0 --- /dev/null +++ b/charts/smarter-device-manager/Chart.yaml @@ -0,0 +1,22 @@ +apiVersion: v2 +name: smarter-device-manager +version: 1.0.0 +appVersion: 1.1.2 +description: Manage hardware resource allocation without a need for privileged containers +keywords: + - kubernetes + - cluster + - hardware +home: https://gitlab.com/arm-research/smarter/smarter-device-manager/ +sources: + - https://gitlab.com/arm-research/smarter/smarter-device-manager/ + - https://github.com/k8s-at-home/charts +dependencies: + - name: common + repository: https://k8s-at-home.com/charts/ + version: 2.4.0 +maintainers: + - name: bjw-s + email: me@bjw-s.dev + - name: lazyoldbear + email: 19270832+lazyoldbear@users.noreply.github.com diff --git a/charts/smarter-device-manager/README.md b/charts/smarter-device-manager/README.md new file mode 100644 index 00000000..eba725bb --- /dev/null +++ b/charts/smarter-device-manager/README.md @@ -0,0 +1,111 @@ +# smarter device manager + +This is a helm chart for [smarter-device-manager](https://gitlab.com/arm-research/smarter/smarter-device-manager/) +([see also](https://community.arm.com/developer/research/b/articles/posts/a-smarter-device-manager-for-kubernetes-on-the-edge)). + +This tool discovers host hardware resources and manages their provisioning for the pods, decoupling host paths from them, and ensuring that pods don't compete for the same piece of hardware. + +Typical use cases are Zigbee/Zwave USB dongles for other charts available in this repository (Zigbee2MQTT, ZwaveJS2MQTT). + +**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/k8s-at-home/charts/issues/new/choose)** + +## TL;DR; + +```shell +$ helm repo add k8s-at-home https://k8s-at-home.com/charts/ +$ helm install k8s-at-home/smarter-device-manager +``` + +## Installing the Chart + +To install the chart with the release name `my-release`: + +```console +helm install --name my-release k8s-at-home/smarter-device-manager +``` + +Please consider overriding the default configuration through `values.yaml` file. +For example: +```yaml +config: + - devicematch: ^snd$ + nummaxdevices: 20 + - devicematch: ^rtc0$ + nummaxdevices: 20 + - devicematch: ^video[0-9]*$ + nummaxdevices: 20 + - devicematch: ^ttyACM[0-9]*$ + nummaxdevices: 1 +``` +The above configuration allows up to twenty pods to make use of `/dev/snd`, `/dev/rtc0` and each of `/dev/video[0-9]*` devices. +Only one pod at a time can use any of the discovered host `/dev/ttyACM[0-9]*` devices. This means that if a pod has reserved a dongle at `/dev/ttyACM0`, another pod requesting the same device will stay pending. + +Once the devices are discovered, they will be added as allocatable resources to the nodes: +``` + $ kubectl describe nodes +... +Capacity: + cpu: 4 + memory: 16104560Ki + pods: 110 + smarter-devices/gpiochip0: 0 + smarter-devices/i2c-0: 0 + smarter-devices/snd: 20 + smarter-devices/ttyUSB-Z-Stick-Gen5: 1 +``` + +## Usage + +### Important limitation + +Please note that only the root of the host `/dev` directory is considered for discovery. _Therefore, `by-id` paths will not work and some `udev` rules may be necessary._ + +### Resource allocation + +The hardware is requested by pods through `resources`, e.g.: +```yaml + resources: + limits: + smarter-devices/ttyUSB-Conbee-2: 1 + requests: + smarter-devices/ttyUSB-Conbee-2: 1 +``` + +In this case host device `/dev/ttyUSB-Conbee-2` will be given at the same path, and the pod will only be created when this device is available. + +## Uninstalling the Chart + +To uninstall/delete the `my-release` deployment: + +```console +helm delete my-release --purge +``` + +The command removes all the Kubernetes components associated with the chart and deletes the release. + +Read through the charts [values.yaml](https://github.com/k8s-at-home/charts/blob/master/charts/smarter-device-manager/values.yaml) +file. It has several commented out suggested values. +Additionally you can take a look at the common library [values.yaml](https://github.com/k8s-at-home/charts/blob/master/charts/common/values.yaml) for more (advanced) configuration options. + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, +```console +helm install my-release \ + --set image.pullPolicy="Always" \ + k8s-at-home/smarter-device-manager +``` +Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the +chart. For example, +```console +helm install my-release k8s-at-home/smarter-device-manager --values values.yaml +``` + +```yaml +image: + tag: ... +``` + +--- + +## Upgrading an existing Release to a new major version + +A major chart version change (like 4.0.1 -> 5.0.0) indicates that there is an incompatible breaking change potentially needing manual actions. diff --git a/charts/smarter-device-manager/templates/common.yaml b/charts/smarter-device-manager/templates/common.yaml new file mode 100644 index 00000000..360972d9 --- /dev/null +++ b/charts/smarter-device-manager/templates/common.yaml @@ -0,0 +1,77 @@ +{{/* Make sure all variables are set properly */}} +{{- include "common.values.setup" . }} + +{{/* Host paths */}} +{{- define "sdm.dev.volume" -}} +name: host-dev +hostPath: + path: {{ .Values.devPath | default "/dev" }} +{{- end -}} +{{- define "sdm.sys.volume" -}} +name: host-sys +hostPath: + path: {{ .Values.sysPath | default "/sys" }} +{{- end -}} +{{- define "sdm.device-plugins.volume" -}} +name: host-device-plugins +hostPath: + path: {{ .Values.devicePluginPath | default "/var/lib/kubelet/device-plugins" }} +{{- end -}} + +{{- define "sdm.dev.volumeMount" -}} +name: host-dev +mountPath: /dev +{{- end -}} +{{- define "sdm.sys.volumeMount" -}} +name: host-sys +mountPath: /sys +{{- end -}} +{{- define "sdm.device-plugins.volumeMount" -}} +name: host-device-plugins +mountPath: /var/lib/kubelet/device-plugins +{{- end -}} + +{{/* Append host paths and the configMap to the additionalVolumes and additionalVolumeMounts */}} +{{- define "sdm.configmap.volume" -}} +name: configuration +configMap: + name: {{ template "common.names.fullname" . }} +{{- end -}} + +{{- $additionalVolumes := .Values.additionalVolumes -}} +{{- $volume := include "sdm.dev.volume" . | fromYaml -}} +{{- $additionalVolumes := append $additionalVolumes $volume -}} +{{- $volume := include "sdm.sys.volume" . | fromYaml -}} +{{- $additionalVolumes := append $additionalVolumes $volume -}} +{{- $volume := include "sdm.device-plugins.volume" . | fromYaml -}} +{{- $additionalVolumes := append $additionalVolumes $volume -}} +{{- $volume := include "sdm.configmap.volume" . | fromYaml -}} +{{- $additionalVolumes := append $additionalVolumes $volume -}} +{{- $_ := set .Values "additionalVolumes" (deepCopy $additionalVolumes) -}} + +{{- define "sdm.configmap.volumeMount" -}} +name: configuration +mountPath: /root/config/conf.yaml +subPath: conf.yaml +{{- end -}} + +{{- $additionalVolumeMounts := .Values.additionalVolumeMounts -}} +{{- $volumeMount := include "sdm.dev.volumeMount" . | fromYaml -}} +{{- $additionalVolumeMounts := append $additionalVolumeMounts $volumeMount -}} +{{- $volumeMount := include "sdm.sys.volumeMount" . | fromYaml -}} +{{- $additionalVolumeMounts := append $additionalVolumeMounts $volumeMount -}} +{{- $volumeMount := include "sdm.device-plugins.volumeMount" . | fromYaml -}} +{{- $additionalVolumeMounts := append $additionalVolumeMounts $volumeMount -}} +{{- $volumeMount := include "sdm.configmap.volumeMount" . | fromYaml -}} +{{- $additionalVolumeMounts := append $additionalVolumeMounts $volumeMount -}} +{{- $_ := set .Values "additionalVolumeMounts" (deepCopy $additionalVolumeMounts) -}} + +{{/* DaemonSet controller, disabling defaults */}} +{{- $_ := set .Values "controllerType" "daemonset" }} +{{- $_ := set .Values.probes.liveness "enabled" false }} +{{- $_ := set .Values.probes.readiness "enabled" false }} +{{- $_ := set .Values.probes.startup "enabled" false }} +{{- $_ := set .Values.service "enabled" false }} + +{{/* Render the templates */}} +{{ include "common.all" . }} diff --git a/charts/smarter-device-manager/templates/configmap.yaml b/charts/smarter-device-manager/templates/configmap.yaml new file mode 100644 index 00000000..3b991059 --- /dev/null +++ b/charts/smarter-device-manager/templates/configmap.yaml @@ -0,0 +1,38 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "common.names.fullname" . }} + labels: + {{- include "common.labels" . | nindent 4 }} +data: + conf.yaml: | +{{- if not .Values.config }} + - devicematch: ^snd$ + nummaxdevices: 20 + #- devicematch: ^gpiomem$ + # nummaxdevices: 40 + #- devicematch: ^gpiochip[0-9]*$ + # nummaxdevices: 20 + #- devicematch: ^hci[0-9]*$ + # nummaxdevices: 1 + #- devicematch: ^i2c-[0-9]*$ + # nummaxdevices: 1 + #- devicematch: ^rtc0$ + # nummaxdevices: 20 + #- devicematch: ^video[0-9]*$ + # nummaxdevices: 20 + #- devicematch: ^vchiq$ + # nummaxdevices: 20 + #- devicematch: ^vcsm.*$ + # nummaxdevices: 20 + - devicematch: ^ttyUSB.*$ + nummaxdevices: 1 + #- devicematch: ^ttyACM[0-9]*$ + # nummaxdevices: 1 + #- devicematch: ^ttyTHS[0-9]*$ + # nummaxdevices: 1 + #- devicematch: ^ttyS[0-9]*$ + # nummaxdevices: 1 +{{- else }} + {{- toYaml .Values.config | nindent 4 }} +{{- end }} diff --git a/charts/smarter-device-manager/values.yaml b/charts/smarter-device-manager/values.yaml new file mode 100644 index 00000000..06485364 --- /dev/null +++ b/charts/smarter-device-manager/values.yaml @@ -0,0 +1,32 @@ +image: + repository: registry.gitlab.com/arm-research/smarter/smarter-device-manager + tag: v1.1.2 + pullPolicy: IfNotPresent + +# Override default configuration +# config: +# - devicematch: ^snd$ +# nummaxdevices: 20 +# - devicematch: ^ttyUSB.*$ +# nummaxdevices: 1 + +hostNetwork: true +dnsPolicy: ClusterFirstWithHostNet + +devicePluginPath: "/var/lib/kubelet/device-plugins" +# devPath: "/special-dev/" +# sysPath: "/special-sys/" + +# Setting priority class is not necessary, but is recommended. +# Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/ +priorityClassName: system-node-critical + + +securityContext: + capabilities: + drop: + - ALL + allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000