Back when I was at Honeywell, I had the privilege of being involved in some massive projects — including OpenVEP and Experion Elevate SCADA. These were enterprise-grade control systems that took entire teams months to scope, configure, deploy, and integrate. I remember the time, cost, and sheer coordination it took to stand something up in a data center.
Fast forward to today, and I’m blown away that I can spin up a demo SCADA environment in just minutes using containers and a Kubernetes cluster on Civo. Of course, this is just for demonstration purposes — a production deployment would require persistent volumes and hardened security — but the fact that it’s even possible this quickly is remarkable.
This post walks you through how I deployed Inductive Automation’s Ignition platform to a Civo Kubernetes cluster using nothing more than the CLI, a few YAML files, and Docker Hub.
Step 1: Create the Kubernetes Cluster
I used the Civo web dashboard to create a new Kubernetes cluster. The process is straightforward:
- Choose your cluster name, size, and node count (I used 3 nodes).
- Under networking, select “default” or create a new network.
- Let Civo auto-create a firewall or configure one manually if needed.
- Hit Create Cluster and within a few minutes, your cluster is ready.
Civo even gives you an estimated time to completion and notifies you when everything is live.
Step 2: Set Up the CLI
Although the web UI is great, I prefer using the command line — especially when scripting deployments.
To install the Civo CLI on Windows:
choco install civo-cli
Once installed, link your CLI to your Civo account:
civo apikey save
You’ll need your API key, which you can find under Account Settings > Security in the Civo dashboard.
Step 3: Connect kubectl
to Your Cluster
Get the kubeconfig for your cluster with:
civo kubernetes config <your_cluster_id> –save
This will merge the config with your existing kubeconfig file, allowing you to run:
kubectl config use-context ignitiondemo
kubectl get nodes
Step 4: Deploy Ignition
Ignition is available on Docker Hub under inductiveautomation/ignition
. For this demo, I used version 8.1.41
.
a) Create a Namespace
Save this to IgnitionNS.yaml
:
Apply it with:
apiVersion: v1
kind: Namespace
metadata:
name: ignition-demo
kubectl apply -f IgnitionNS.yaml
b) Create the Deployment
Here’s the deployment YAML (IgnitionDeploy.yaml
):
apiVersion: apps/v1
kind: Deployment
metadata:
name: ignition
namespace: ignition-demo
spec:
replicas: 1
selector:
matchLabels:
app: ignition
template:
metadata:
labels:
app: ignition
spec:
containers:
– name: ignition
image: inductiveautomation/ignition:8.1.41
ports:
– containerPort: 8088
Apply it with:
kubectl apply -f IgnitionDeploy.yaml
Step 5: Expose the Deployment
To make Ignition accessible externally, we’ll use a LoadBalancer service. Save this as IgnitionLB.yaml
:
apiVersion: v1
kind: Service
metadata:
name: ignition-lb
namespace: ignition-demo
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8088
protocol: TCP
selector:
app: ignition
Apply it:
kubectl apply -f IgnitionLB.yaml
To get the public IP:
kubectl get service ignition-lb -n ignition-demo
You’ll see something like:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ignition-lb LoadBalancer 10.43.194.211 212.2.247.184 80:32013/TCP 2m
Now you can access Ignition from your browser:
http://212.2.247.184 (This demo is no longer online)
Final Thoughts
This deployment is meant for demonstration only. In a real production environment, you’d want:
- Persistent storage for project and tag data
- Secrets management for credentials
- Network security policies
- Backup and monitoring tools
But still — seeing Ignition up and running on a public IP in under 30 minutes is impressive, especially when I think about the months-long projects of the past.
Civo, containers, and Kubernetes are reshaping the landscape. For those of us with a background in traditional industrial automation, it’s an exciting time to bridge the old with the new.