Summary
Blinkt! is an LED light strip attachable to the GPIO extension on Raspberry Pi’s. Sealsystems provides a rainbow container that creates a rainbow of the LEDs and can be orchestrated on a Docker cluster using the Swarm orchestrator. This is a description of how to run the rainbow on a Kubernetes cluster.
Prerequisites
- Raspberry Pi’s with Pimoroni Blinkt!
- Kubernetes cluster (Hypriot for Raspberry Pi)
- Sealsystems Rainbow Container (sealsystems/rainbow:latest)
Description
The Rainbow container uses the node package (npm), node-blinkt, to interact with the LEDs through the host GPIO. To access the GPIO, the container will need access to the host’s /sys directory which acts as a virtual filesystem for the system devices (/sys/devices/gpiochip2/gpio/). Mount the host’s /sys directory to the container and the Blinkt! package will be able to access the GPIO.
containers:
- name: rainbow
image: sealsystems/rainbow:latest
volumeMounts:
- name: sys
mountPath: /sys
volumes:
- name: sys
hostPath:
path: /sys
There is only one GPIO and Blinkt! light per host so running the rainbow container as a DaemonSet will ensure that only one (1) container is run on each host in the cluster.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: rainbow
By default the master node will be excluded from cluster nodes in the DaemonSet so in a 5-node cluster, only the (four) 4 worker nodes will light up.
Use tolerations to enable the DaemonSet to to run on the master node.
spec:
# this toleration is to have a daemonset run or not run on the master node
# key - node key to identify master node
# effect - specifies whether to run (NoSchedule) or not run (NoExecute)
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
Steps
Create yaml file, rainbow.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: rainbow
spec:
selector:
matchLabels:
name: rainbow
template:
metadata:
labels:
name: rainbow
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: rainbow
image: sealsystems/rainbow:latest
volumeMounts:
- name: sys
mountPath: /sys
volumes:
- name: sys
hostPath:
path: /sys
Apply to cluster:
kubectl apply -f rainbow.yml