[smarter-device-manager] New chart (#532)

This commit is contained in:
Ingvarr Zhmakin 2021-02-11 10:22:30 +01:00 committed by GitHub
parent a32e94cfca
commit 1c7d6d403e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 304 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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" . }}

View File

@ -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 }}

View File

@ -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