Note: This README was written by Cursor and verified by members of the team
The OpenShift Fusion Access Operator is a Kubernetes operator that enables IBM Fusion Access for SAN on OpenShift clusters. Fusion Access for SAN is a cloud-native storage solution designed to help enterprises transition smoothly from traditional virtualization environments to OpenShift while reusing existing SAN infrastructure.
Built on IBM Storage Scale technology, Fusion Access provides a consistent, high-performance datastore-like experience with enhanced observability, platform-storage separation, and true storage abstraction. This operator simplifies the deployment and management of Fusion Access components in OpenShift environments.
The operator consists of several key components that work together to provide a complete storage solution:
- FusionAccess Controller: The main reconciliation controller that manages the lifecycle of Fusion Access installations
- Device Finder: A daemonset that discovers and reports available storage devices on cluster nodes
- Console Plugin: A dynamic web UI plugin for the OpenShift console
- Kernel Module Manager: Integration with KMM for loading required kernel modules
- Local Volume Discovery: Automated discovery of local storage devices
The operator is controlled through a FusionAccess custom resource that defines the desired state:
apiVersion: fusion.storage.openshift.io/v1alpha1
kind: FusionAccess
metadata:
name: fusionaccess-object
namespace: ibm-fusion-access
spec:
storageScaleVersion: "v5.2.3.1"
storageDeviceDiscovery:
create: trueWhen a FusionAccess resource is created, the operator performs the following steps:
- Manifest Application: Downloads and applies IBM Storage Scale manifests from the official repository
- Entitlement Setup: Creates necessary pull secrets for accessing protected IBM container images
- Image Registry Validation: Verifies OpenShift's internal image registry storage configuration
- Kernel Module Management: Creates KMM (Kernel Module Management) resources for loading required drivers
- Console Plugin Deployment: Deploys and enables the web UI plugin
- Device Discovery: Optionally deploys device discovery daemonsets
The device finder component runs as a privileged daemonset on cluster nodes and:
- Scans for available block devices using
lsblk - Filters devices based on criteria (size, filesystem, mountpoints, etc.)
- Creates
LocalVolumeDiscoveryResultresources with discovered device information - Monitors for hardware changes using udev events
The operator includes a dynamic console plugin that provides:
- Fusion Access Home Page: Overview of the Fusion Access installation
- Storage Cluster Management: Interface for creating and managing storage clusters
- File System Management: Tools for creating and managing file systems
- Device Visualization: Display of discovered storage devices (LUNs)
The operator continuously monitors the system status and reports:
- Manifest application status
- Image pull validation results
- Device discovery results
- Overall system health
- OpenShift 4.19 (Exclusively)
- IBM Fusion Access entitlement (see https://access.ibmfusion.eu/)
- Cluster administrator privileges
- Supported storage hardware
The operator is distributed through the OpenShift OperatorHub:
- Install from OperatorHub in the OpenShift console
- Create the
ibm-fusion-accessnamespace - Configure IBM entitlement credentials
- Create a
FusionAccesscustom resource
- IBM Entitlement Secret: Named
fusion-pullsecretcontaining IBM registry credentials - Storage Scale Version: Must specify a supported IBM Storage Scale version
- External Manifest URL: Override default IBM manifest location
- Device Discovery: Enable/disable automatic device discovery
- Image Registry Settings: Configure internal vs external registry usage
The operator currently supports:
- IBM Storage Scale v5.2.3.1
- OpenShift 4.19 (exclusively)
- Architecture: x86_64
- The device finder requires privileged access to scan host devices
- Pull secrets must be properly configured for IBM registry access
- Kernel modules are loaded through the Kernel Module Management (KMM) operator
- All communications use TLS encryption
Common issues and solutions:
- Image Pull Errors: Verify IBM entitlement credentials and pull secret configuration
- Device Discovery Issues: Check daemonset logs and node privileges
- Console Plugin Not Loading: Verify plugin is enabled in cluster console configuration
- Kernel Module Loading: Check KMM operator status and node compatibility
- Go 1.21+
kubectlorocCLI- OpenShift/OCP cluster access (via kubeconfig)
- Operator SDK
- controller-runtime
- OpenShift APIs
Important: You don't need a separate token! Your kubeconfig file already contains all the authentication credentials (certificates and tokens) needed to access your OpenShift cluster.
To set up cluster access:
# Option 1: Set KUBECONFIG environment variable
export KUBECONFIG=/path/to/your/kubeconfig
# Option 2: Use default location (~/.kube/config)
# If kubeconfig is in default location, no export needed
# Option 3: Login with oc CLI (creates/updates ~/.kube/config)
oc login --server=https://your-cluster:6443 --token=your-token
# OR
oc login --server=https://your-cluster:6443 # Interactive loginVerify your connection:
kubectl cluster-info
# OR
oc cluster-infoRunning the operator locally allows you to develop and debug without building container images. The operator runs as a local process on your machine but connects to your OpenShift cluster.
DEPLOYMENT_NAMESPACE=ibm-fusion-access \
RELATED_IMAGE_OPENSHIFT_STORAGE_SCALE_OPERATOR_DEVICEFINDER=quay.io/sughosh/openshift-fusion-access-devicefinder:6.6.7 \
ENABLE_WEBHOOKS=false \
make install run-
Install CRDs (
make install):- Installs Custom Resource Definitions to your cluster
- Required before the operator can reconcile resources
- Includes:
FusionAccess,FileSystemClaim,LocalVolumeDiscovery, etc.
-
Run Operator Locally (
make run):- Compiles and runs the operator using
go run - No container image needed
- Connects to cluster using your
kubeconfig - Changes to code take effect immediately (restart required)
- Compiles and runs the operator using
-
DEPLOYMENT_NAMESPACE(Required):- Namespace where the operator will create resources
- Example:
ibm-fusion-access - The operator reads this to know where to deploy components
-
RELATED_IMAGE_OPENSHIFT_STORAGE_SCALE_OPERATOR_DEVICEFINDER(Optional):- Image URL for the devicefinder daemonset
- If not set, defaults to:
quay.io/openshift-storage-scale/openshift-fusion-access-devicefinder - Example:
quay.io/sughosh/openshift-fusion-access-devicefinder:6.6.7
-
ENABLE_WEBHOOKS(Optional):- Set to
falseto disable webhook registration - Recommended for local development to avoid TLS certificate issues
- Default:
true(webhooks enabled)
- Set to
# 1. Ensure you're connected to your cluster
export KUBECONFIG=/path/to/your/kubeconfig
kubectl cluster-info # Verify connection
# 2. Create namespace if it doesn't exist
oc create namespace ibm-fusion-access
# 3. Install CRDs and run operator locally
DEPLOYMENT_NAMESPACE=ibm-fusion-access \
RELATED_IMAGE_OPENSHIFT_STORAGE_SCALE_OPERATOR_DEVICEFINDER=quay.io/sughosh/openshift-fusion-access-devicefinder:6.6.7 \
ENABLE_WEBHOOKS=false \
make install run
# 4. In another terminal, verify it's running
oc get pods -n ibm-fusion-access
kubectl get crds | grep fusion.storage.openshift.ioFor debugging with breakpoints in VS Code, use the pre-configured launch configurations in .vscode/launch.json:
-
Install CRDs first (required before debugging):
make install
-
Select a debug configuration from the VS Code debug panel:
Launch Operator (gpfs-nick)- Uses specific kubeconfig pathLaunch Operator (Default Kubeconfig)- Uses default~/.kube/configLaunch Operator (Custom Kubeconfig)- UsesKUBECONFIGenvironment variable
-
Set breakpoints in your Go code
-
Press F5 to start debugging
The launch configurations include all required environment variables:
DEPLOYMENT_NAMESPACERELATED_IMAGE_OPENSHIFT_STORAGE_SCALE_OPERATOR_DEVICEFINDERENABLE_WEBHOOKS=falseKUBECONFIG(where applicable)
You can customize the configurations in .vscode/launch.json to match your environment.
For building container images and deploying the operator to your cluster:
📖 See docs/BUILD_AND_DEPLOY.md for complete instructions
The build documentation covers:
- Automated build and deployment with
fusion-access-operator-build.sh - Manual build process step-by-step
- Image registry configuration
- Pull secret setup
- Troubleshooting common build issues
- Build stability improvements and fixes
# Check kubeconfig
echo $KUBECONFIG
kubectl cluster-info
# Verify permissions
kubectl auth can-i create crds --all-namespacesIf you see webhook certificate errors:
- Set
ENABLE_WEBHOOKS=falsefor local development (recommended) - Or ensure certificates exist at
/tmp/k8s-webhook-server/serving-certs/
# Reinstall CRDs
make install
# Verify CRDs are installed
kubectl get crds | grep fusion.storage.openshift.ioEnsure you have cluster-admin or appropriate RBAC permissions:
oc adm policy who-can create crds- Frontend development: See
console/README.md - Operator SDK documentation: https://sdk.operatorframework.io/
- controller-runtime: https://pkg.go.dev/sigs.k8s.io/controller-runtime
This operator requires an IBM Fusion Entitlement. For support and additional information:
- IBM Fusion Access: https://access.ibmfusion.eu/
- Red Hat Documentation: https://docs.redhat.com/en/documentation/openshift_container_platform/4.19/html/virtualization/virtualization-with-ibm-fusion-access-for-san
Licensed under the Apache License, Version 2.0. See LICENSE file for details.