-
Notifications
You must be signed in to change notification settings - Fork 83
Add Device Agent on Kubernetes documentation #6762
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
276a9b7
8eff00f
b0f4040
426c19d
66b92c2
983b026
a871941
3494625
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,191 @@ | ||
| --- | ||
| navGroup: DeviceAgentInstallation | ||
| navTitle: Kubernetes Install | ||
| navOrder: 4 | ||
| meta: | ||
| description: Run the FlowFuse Device Agent in a Kubernetes cluster | ||
| tags: | ||
| - device agent | ||
| - kubernetes | ||
| - installation | ||
| --- | ||
|
|
||
| # Kubernetes Install | ||
|
|
||
| ## When to Use Each Option | ||
|
|
||
| Running the Device Agent in Kubernetes is appropriate when devices are containerized or managed as part of a Kubernetes-based edge or infrastructure platform. | ||
|
|
||
| Choose your deployment pattern based on how you manage device identity: | ||
|
|
||
| - **Fixed Configuration** | ||
| Use when the device already exists in FlowFuse and you have a `device.yml` with its credentials. One deployment maps to one device identity. | ||
|
|
||
| - **Automatic Provisioning** | ||
| Use when devices should register themselves at startup using a Provisioning Token. Each instance requires writable persistent storage. | ||
|
|
||
| Any deployment on Kubernetes is going to be specific to the environment and requirements of the solution. The following examples show two common patterns for running the FlowFuse Device Agent on Kubernetes: | ||
|
|
||
| - Fixed configuration using a static `device.yml` | ||
| - Automatic provisioning using a FlowFuse Provisioning Token | ||
|
|
||
| Choose the approach that matches how you manage device lifecycle and credentials. | ||
|
|
||
| ## Fixed Configuration | ||
|
|
||
| If you have an existing `device.yml` file containing a set of Device Agent credentials. | ||
|
|
||
| ```bash | ||
| kubectl create secret generic device-one-secret --from-file=device.yml=./device.yml | ||
| ``` | ||
|
|
||
| The following manifest will create a Deployment and Service for a device using the supplied Secret as its credentials | ||
|
|
||
| ```yaml | ||
| apiVersion: apps/v1 | ||
| kind: Deployment | ||
| metadata: | ||
| name: device-one | ||
| labels: | ||
| app: device-one | ||
| spec: | ||
| replicas: 1 # there can only be one replica as there is one configuration | ||
| revisionHistoryLimit: 10 | ||
| selector: | ||
| matchLabels: | ||
| app: device-one | ||
| template: | ||
| metadata: | ||
| labels: | ||
| app: device-one | ||
| spec: | ||
| containers: | ||
| - name: device-one | ||
| image: flowfuse/device-agent:latest | ||
allthedoll marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ports: | ||
| - containerPort: 1880 | ||
| volumeMounts: | ||
| - name: config | ||
| mountPath: "/opt/flowfuse-device/device.yml" | ||
| subPath: "device.yml" | ||
| readOnly: true | ||
| resources: | ||
| limits: | ||
| cpu: 1000m | ||
| memory: 256Mi | ||
| requests: | ||
| cpu: 500m | ||
| memory: 128Mi | ||
| volumes: | ||
| - name: config | ||
| secret: | ||
| secretName: device-one-secret | ||
| --- | ||
| apiVersion: v1 | ||
| kind: Service | ||
| metadata: | ||
| name: device-one-service | ||
| spec: | ||
allthedoll marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| selector: | ||
| app: device-one | ||
| ports: | ||
| - protocol: TCP | ||
| port: 1880 | ||
| targetPort: 1880 | ||
| ``` | ||
|
|
||
| ## Automatic Provisioning | ||
|
|
||
| Using a FlowFuse Provisioning Token to automatically configure a new Device Agent on deployment. | ||
|
|
||
| Because the Device Agent will need to re-write the `device.yml` file it can no longer be stored in a Secret and a PersistentVolume must be used for each instance of the Device Agent. | ||
|
|
||
| A Secret is used to hold the initial `device.yml` which contains the provisioning token. | ||
|
|
||
| ```bash | ||
| kubectl create secret generic device-provisioning-secret --from-file=device.yml=./device.yml | ||
| ``` | ||
|
|
||
| The following manifest will create a Deployment, Service and PVC for a device using the supplied Secret as the source of the Provisioning token. | ||
|
|
||
| The PVC will be used to store the updated `device.yml` and the Node-RED nodes installed by the Remote Instance. | ||
|
|
||
| ```yaml | ||
| apiVersion: apps/v1 | ||
| kind: Deployment | ||
| metadata: | ||
| name: device-one | ||
| labels: | ||
| app: device-one | ||
| spec: | ||
| replicas: 1 # to scale to more than one instance you should modify this to use a StatefulSet | ||
| revisionHistoryLimit: 10 | ||
| selector: | ||
| matchLabels: | ||
| app: device-one | ||
| template: | ||
| metadata: | ||
| labels: | ||
| app: device-one | ||
| spec: | ||
| initContainers: # on first run copies the device.yml from Secret to PVC volume | ||
| - name: config-copy | ||
| image: busybox:latest | ||
allthedoll marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| command: | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. since this |
||
| - "/bin/sh" | ||
| - "-c" | ||
| - "if [ ! -f /opt/flowfuse-device/device.yml ]; then cp /tmp/device.yml /opt/flowfuse-device/device.yml; fi" | ||
| volumeMounts: | ||
| - name: config | ||
| mountPath: "/opt/flowfuse-device" | ||
| - name: initial-config | ||
| mountPath: "/tmp/device.yml" | ||
| subPath: "device.yml" | ||
| readOnly: true | ||
| containers: | ||
| - name: device-one | ||
| image: flowfuse/device-agent:latest | ||
| ports: | ||
| - containerPort: 1880 | ||
| volumeMounts: | ||
| - name: config | ||
| mountPath: "/opt/flowfuse-device" | ||
| resources: | ||
| limits: | ||
| cpu: 1000m | ||
| memory: 256Mi | ||
| requests: | ||
| cpu: 500m | ||
| memory: 128Mi | ||
| volumes: | ||
| - name: initial-config | ||
| secret: | ||
| secretName: device-provisioning-secret | ||
| - name: config | ||
| persistentVolumeClaim: | ||
| claimName: device-one-pvc | ||
allthedoll marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| --- | ||
| apiVersion: v1 | ||
| kind: Service | ||
| metadata: | ||
| name: device-one-service | ||
| spec: | ||
| selector: | ||
| app: device-one | ||
| ports: | ||
| - protocol: TCP | ||
| port: 1880 | ||
| targetPort: 1880 | ||
| --- | ||
| apiVersion: v1 | ||
| kind: PersistentVolumeClaim | ||
| metadata: | ||
| name: device-one-pvc | ||
| spec: | ||
| accessModes: | ||
| - ReadWriteOnce | ||
| resources: | ||
| requests: | ||
| storage: 1Gi | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this assumes the cluster has a default Also, should we mention what gets stored here (the updated |
||
| ``` | ||
Uh oh!
There was an error while loading. Please reload this page.