Using a lab environment, I've created this step by step tutorial to help one configure FlashSystem.ai from a clean installation of Ubuntu. The setup should be very similar for Red Hat or other Linux distributions.
FlashSystem.ai Installation Guide
Lab Environment:
VMware Workstation 25H2u1
Ubuntu 26.04 Desktop
FS5200 Software Version 9.1.2.3
Variables used in this installation:
Remember to replace all IP's/Hostnames below with your information and apply it to the guide below as required.
Ubuntu Hostname flashsystemai
FlashSystem FQDN flashsystemai.lab.local
FlashSystem Management IP 192.168.2.195
Ubuntu/K3s IP 192.168.3.155
Namespace flashsystem-app
Prerequisites:
1. Storage must connect to Storage Insights.
2. The IP address used on the VM must be registered with DNS. See first step below to do a ping test from the storage. 192.168.3.155 was used in this lab setup.
3. Cloud API Key must be created from https://cloud.ibm.com/login. "Manage-->Access (IAM)-->API Keys. Copy the key and keep it safe as you will be unable to view the key later.
*note a credit card was needed to create the account for verification. The is no billing to create the API key.
4. Install VM-Tools on the Ubuntu VM so all the commands below can be copy/paste into the terminal.
Installation Steps using Ubuntu Terminal:
1 - Prepare Ubuntu:
Set Hostname
sudo hostnamectl set-hostname flashsystemai.lab.local
Verify:
hostname -f
*putty into the storage and do a test ping. Example: ping -srcip4 192.168.2.195 flashsystemai.lab.local
Expected:
flashsystemai.lab.local
Successful ping from storage
2 - Update Ubuntu
sudo apt update
sudo apt -y upgrade
sudo reboot
3 - Install basic prerequisites (can copy/paste all together)
sudo apt update
sudo apt install -y \
curl \
wget \
vim \
git \
jq \
openssl \
ca-certificates \
gnupg \
apt-transport-https \
software-properties-common
Verify:
curl --version
openssl version
git --version
Expected:
openssl version
git --version
Warning: The argument '–version' starts with a Unicode character. Maybe ASCII was intended?
curl: (6) Could not resolve host: –version
OpenSSL 3.5.5 27 Jan 2026 (Library: OpenSSL 3.5.5 27 Jan 2026)
git version 2.53.0
4 - Verify networking
ip addr
Expected primary IP:
192.168.3.155
Test internet:
ping -c 4 8.8.8.8
ping -c 4 ibm.com
5 - Update local hosts file
sudo nano /etc/hosts
Add:
192.168.3.155 flashsystemai.lab.local flashsystemai
Verify:
getent hosts flashsystemai.lab.local
Expected:
192.168.3.155 flashsystemai.lab.local flashsystemai
6 - Install k3s (Lightweight Kubernetes):
curl -sfL https://get.k3s.io | sh -
Verify:
sudo systemctl status k3s --no-pager
Expected:
Active: active (running)
Then run:
sudo kubectl get nodes
Expected:
NAME STATUS ROLES AGE VERSION
flashsystemai Ready control-plane,master ...
7 - Verify k3s Cluster Components:
sudo kubectl get pods -A
Expected:
kube-system coredns-...
kube-system local-path-provisioner-...
kube-system metrics-server-...
kube-system traefik-...
8 – Disable swap:
sudo swapoff -a
sudo cp /etc/fstab /etc/fstab.backup
sudo sed -i '/swap/d' /etc/fstab
Verify:
swapon --show
free -h
Expected:
Swap: 0B
9 - Disable Traefik:
sudo kubectl get pods -A
sudo mkdir -p /etc/rancher/k3s
sudo nano /etc/rancher/k3s/config.yaml
Using nano add the following lines and save/exit:
disable:
- traefik
sudo systemctl restart k3s (may take minute for traefik to delete)
Verify:
sudo kubectl get pods -A
Expected:
traefik-...
svclb-traefik-...
Should be gone
10 - Install Helm:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm repo update
Verify:
helm version
Expected:
version.BuildInfo{Version:"v3.21.3", GitComm……..
11 - Install ingress-nginx:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace
If installation fails with:
Error: INSTALLATION FAILED: Kubernetes cluster unreachable: Get "http://localhost:8080/version": dial tcp 127.0.0.1:8080: connect: connection refused
follow the steps below else continue with step 12:
11.1 - Configure kubectl for Your User:
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
chmod 600 ~/.kube/config
Verify:
sudo kubectl get nodes
Expected:
NAME STATUS ROLES AGE VERSION
flashsystemai.lab.local Ready control-plane ...
11.2 - Check KUBECONFIG:
echo $HOME
ls -l ~/.kube/config
head -5 ~/.kube/config
Expected:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data:…………………..
11.3 - Force kubectl to Use Your Config:
kubectl --kubeconfig=$HOME/.kube/config get nodes
export KUBECONFIG=$HOME/.kube/config
Verify: Should work without sudo
kubectl get nodes
Expected:
NAME STATUS ROLES AGE VERSION
flashsystemai.lab.local Ready control-plane 26m v1.36.2+k3s1
12 Install ingress-nginx: (second attempt after correcting error)
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace
Verify:
kubectl get pods -n ingress-nginx
Expected:
STATUS Running
13 Verify the ingress-nginx Service:
kubectl get svc -n ingress-nginx
Expected:
ingress-nginx-controller Ready 1/1(may take a minute)
14 Create the FlashSystem.ai Namespace:
kubectl create namespace flashsystem-app
Verify:
kubectl get namespace flashsystem-app
Expected:
NAME STATUS AGE
flashsystem-app Active ...
15 Create the IBM Container Registry Pull Secret:
kubectl create secret docker-registry icr-io \
--docker-server=icr.io \
--docker-username=iamapikey \
--docker-password='<YOUR_IBM_CLOUD_API_KEY>' \
--docker-email='<YOUR_EMAIL>' \
-n flashsystem-app
*NOTE Can copy/paste entire command above but update API key and enter email address. Cloud API Key is the one create on https://cloud.ibm.com/login. Remember to remove the quotes from '<YOUR_IBM_CLOUD_API_KEY>' and '<YOUR_EMAIL>'. Leave the username iamapikey.
Verify:
kubectl get secrets -n flashsystem-app
Expected:
icr-io
16 - Create the Backend TLS Certificate:
cd ~
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key \
-out tls.crt \
-subj "/CN=flashsystem-app-service.flashsystem-app.svc.cluster.local"
16.1
kubectl create secret tls flashsystem-app-tls \
--key=tls.key \
--cert=tls.crt \
-n flashsystem-app
Verify:
kubectl get secrets -n flashsystem-app
Expected:
icr-io
flashsystem-app-tls
17 - Create a Frontend Certificate:
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout frontend.key \
-out frontend.crt \
-subj "/CN=flashsystemai.lab.local" \
-addext "subjectAltName=DNS:flashsystemai.lab.local"
17.1:
kubectl create secret tls my-custom-frontend-cert \
--key=frontend.key \
--cert=frontend.crt \
-n flashsystem-app
18 - Verify Helm Can Authenticate to IBM Container Registry:
helm registry login icr.io \
--username iamapikey \
--password '<YOUR_IBM_CLOUD_API_KEY>'
*NOTE Can copy/paste entire command above but update API key. Cloud API Key is the one create on https://cloud.ibm.com/login. Remember to remove quotes from '<YOUR_IBM_CLOUD_API_KEY>'. Leave the username iamapikey.
Verify:
Login Succeeded
19 - Pull the FlashSystem.ai Helm Chart:
helm pull oci://icr.io/flashsystem-ai-release/flashsystem-ai:1.1.0 --untar
Verify:
ls -la
Expected:
There should be a flashsystem-ai directory
20 - Update values.yaml in flashsystem-ai folder
cd flashsystem-ai
nano values.yaml
*FIND:
hosts:
- host: ""
*CHANGE TO:
hosts:
- host: "flashsystemai.lab.local"
*FIND:
backend:
mode: "manual"
secretName: ""
*CHANGE TO:
backend:
mode: "manual"
secretName: "flashsystem-app-tls"
*FIND:
frontend:
mode: "wildcard"
secretName: ""
CHANGE TO:
frontend:
mode: "custom"
secretName: "my-custom-frontend-cert"
*Note don't forget to change mode to custom.
21 - Install FlashSystem.ai from inside the ~/flashsystem-ai directory
helm install flashsystem-app . -f values.yaml -n flashsystem-app
Verify: (may have to wait minute or two to come ready)
kubectl get pods -n flashsystem-app
Expected:
NAME READY STATUS RESTARTS AGE
flashsystem-ai-7xxxxxxxxd-ws6ns 1/1 Running 0 2m2s
22 - Verify the Service:
kubectl get svc -n flashsystem-app
Expected:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
flashsystem-ai-service ClusterIP 10.43.147.60 <none> 8443/TCP 3m17s
23 - Verify the Ingress Was Created:
kubectl get ingress -n flashsystem-app
Expected:
NAME CLASS HOSTS ADDRESS PORTS AGE
flashsystem-ai-ingress nginx flashsystemai.lab.local 192.168.3.155 80, 443 4m14s
24 - Open web browser (from within the VM):
https://flashsystemai.lab.local/setup
24.1 There should be a log on screen. Enter a username and password
24.2 Add storage, with superuser and password. Select Security to Self Signed
24.3 Test connection and Save
25 - Storage Insights information:
25.1 Enter Tenant ID from Storage Insights. Get this from the IBM SI URL Typically https://insights.ibm.com/cui/01f17ec3xxxxxxxxxxxxxxxx omit the https://insights.ibm.com/cui and only use 01f17ec3xxxxxxxxxxxxxxx
25.2 Copy/paste the very long Storage Insights API Key. Create the API key in Storage Insights. Settings-->User access management
25.3 Click Save and refresh the page. There should be a GUI Connection Key. You need this key for the step below
26 - Configure Storage to Communicate to FlashSystem AI:
26.1 Putty to storage and login superuser
26.2 lsaicontainerinfo (should be blank)
26.3 chaicontainerinfo -key GUI Connection Key Above -url flashsystemai.lab.local
Example: chaicontainerinfo -key aaxaxxxx-dxxx-4xxx-8xxx-xxxxxxxx -url flashsystemai.lab.local
*Note URL must not contain https:// Although it will accept this, the storage will not communicate.
Conclusion:
Login to the storage and you should now see the small blue AI icon and be able to initiate a chat.
------------------------------
Brandon Rock
------------------------------