WEKA Operator full deployment workflow
Deploy WEKA on Kubernetes end-to-end: from environment preparation and operator installation through resource provisioning and post-deployment storage configuration.
Workflow
2
Configure control plane readiness, HugePages, Kubelet settings, image pull secrets, and failure domains.
4
Select external or local driver distribution and apply the required policy.
6
Deploy the WekaCluster, create the optional client secret, and install the WekaClient when needed.
7
Optionally expose WEKA management endpoints through an operator-managed Service and Ingress.
8
Assign unique proxy subnets when multiple WEKA clusters share the same Kubernetes environment.
9
Configure CSI behavior and storage provisioning for WEKA clients.
1. Obtain setup information
Identify and record the credentials required to pull WEKA container images and the specific version tags for your deployment.
Before you begin
Contact the WEKA Customer Success Team to receive your authorized registry credentials.
Procedure
Access WEKA Operator page to identify the latest
WEKA_OPERATOR_VERSIONandWEKA_IMAGE_VERSION_TAG.Record the following credentials for your image pull secret:
Registry:
quay.ioQUAY_USERNAME
QUAY_PASSWORD
QUAY_SECRET_KEY: Typically
quay-io-robot-secret.
Replace all placeholders in your setup files with these values before proceeding.

2. Prepare Kubernetes environment
Ensure the infrastructure meets the performance and resiliency requirements of the WEKA data plane. This step covers control plane configuration, node hardware and software requirements, HugePages, port requirements, and Kubelet CPU policy.
Control plane high availability
Configure the Kubernetes control plane for high availability to match WEKA resiliency. High availability depends on etcd quorum.
Quorum rule: etcd requires an odd number of members (N) and tolerates failures up to (N-1)/2 failures.
Recommendation: Use five or nine etcd members for production storage backends.
Consider using an external etcd cluster or distributing control plane components across multiple failure domains. For more information, see the Kubernetes HA topology guidance.
Node hardware and software requirements
Verify that every node in the cluster meets these specifications:
Kubernetes version: 1.25 or later (OpenShift 4.17 or later).
Storage allocation: Reserve approximately 20 GiB per WEKA container plus 10 GiB per allocated CPU core in
/opt/k8s-weka. Do not use NFS or network-attached storage.Kernel headers: Ensure kernel headers exactly match the running kernel version to allow driver compilation.
Configure HugePages for Kubernetes worker nodes
WEKA processes require dedicated HugePages memory. Configure HugePages on every worker node before deploying the WekaCluster. Nodes without HugePages configured will fail to schedule WEKA pods.
Memory allocation requirements
Use the following formula to calculate the required number of 2 MiB HugePages for your server:
Variables:
Server capacity
Total usable capacity of all drives assigned to WEKA on the server, measured in GiB.
Ratio
Controls the metadata memory component in the HugePages calculation. Server capacity is divided by this value, so a higher ratio allocates less memory to metadata, which reduces total HugePages consumption. The default is 1000. Set to 2000 to lower HugePages usage on servers where reduced metadata allocation is acceptable.
Cores for WEKA
Number of CPU cores allocated to the WEKA container on the server.
WEKA Container factor
Fixed HugePages allocation of 1.7 GiB for each WEKA container.
Headroom
Additional 10% buffer, expressed as 1.1, to account for memory fragmentation and operational variance. If you plan to run additional workloads that require HugePages, add their planned requirements on top of the calculated value.
Example calculation
Server specifications:
CPU cores: 64 total; 63 dedicated to WEKA.
Storage: 16 drives × 15.3 TiB = 244.8 TiB usable (250,675 GiB).
Step 1: Calculate total GiB:
Step 2: Convert to MiB:
Step 3: Calculate HugePages:
Apply HugePages settings
Before you begin:
Identify the number of drives and CPU cores allocated to WEKA on the server.
Ensure you have root or
sudopermissions on the worker nodes.
Procedure:
Check the current HugePages status on the server:
Apply the calculated HugePages value. Replace
<calculated-value>with the value computed for your server:Persist the setting to ensure it remains active after a reboot:
Kubernetes port requirements
The WEKA Operator automatically allocates ports to prevent collisions in multi-cluster environments. Manual configuration is typically unnecessary unless specific infrastructure or policy requirements apply.
WEKA Operator (v1.10+) / WEKA (v5.1.0+)
35000
260 ports per cluster
WEKA Operator / WEKA (previous versions)
35000
500 ports per cluster
WEKA client connectivity
45000
Maximum: 65535
Reserve ports on each node
To prevent the Linux kernel from assigning WEKA ports to other processes, add the following to /etc/sysctl.d/99-weka.conf on every node. For example:
The range 35000–37600 covers 2,600 ports, which supports up to 10 WekaCluster instances at 260 ports each. If you plan to deploy more than 10 clusters, extend the upper bound by 260 ports per additional cluster.
For full kernel parameter configuration, see Set custom kernel parameters.
Configure Kubelet requirements
Enable the static CPU Manager policy on all worker nodes to give WEKA processes dedicated CPU cores. Without this, the Kubernetes scheduler can place other workloads on the same cores, causing contention and reducing I/O throughput.
On Kubernetes v1.32 and later, also enable strict-cpu-reservation to prevent Burstable and Best Effort pods from scheduling onto reserved cores.
For the full rationale, sibling-pair guidance, and version-specific reservation details, see WEKA Operator best practices.
Before you begin: identify HyperThreading sibling cores
On hyperthreaded systems, each physical core exposes two logical CPUs. Include both logical CPUs from the same physical core in reservedSystemCPUs to ensure full isolation. Reserving only one sibling of a physical core leaves that core shared.
Run the following commands to identify sibling pairs on the node:
Example output for a 12-logical-CPU, single-socket server with HyperThreading enabled:
In this example, there are 6 physical cores and 12 logical CPUs. CPUs that share the same
CORE and SOCKET values are HyperThreading siblings:
0
0
6
1
1
7
2
2
8
3
3
9
4
4
10
5
5
11
The thread_siblings_list confirms these pairs directly:
Do not treat CPUs on different sockets with the same core index as siblings. Always verify pairs using thread_siblings_list rather than relying on the CORE column alone.
Procedure
Edit the Kubelet configuration file on each worker node and add the following settings. In this example, physical core 0 is reserved for the OS.
reservedSystemCPUsincludes both logical CPUs of that core (CPU 0 and its HT sibling, CPU 6):
Adjust reservedSystemCPUs to match the sibling pairs reported by thread_siblings_list on your node. Reserve at least one physical CPU (two sibling cores) for the Kubelet. Reserve additional physical cores, including both logical CPUs for each core, when OS or platform workloads require more capacity.
Kubelet configuration methods vary by Kubernetes distribution. Some environments manage KubeletConfiguration centrally, while others require per-node file or bootstrap changes. Treat this example as the target Kubelet state and apply the equivalent settings by using the method your platform supports on every worker node that hosts WEKA processes.
CPUManagerPolicyAlphaOptions and strict-cpu-reservation require Kubernetes v1.32 or later. Omit the featureGates and cpuManagerPolicyOptions blocks on earlier versions. Without strict reservation, Burstable and Best Effort pods can schedule onto reserved cores under load, reducing WEKA I/O throughput.
Save the file and restart the Kubelet:
Related information
Control CPU Management Policies on the Node
Configure image pull secrets
Set up Kubernetes secrets to enable secure image pulling from the WEKA container registry. These secrets must exist in every namespace where WEKA resources are deployed.
Before you begin
Identify your QUAY_USERNAME, QUAY_PASSWORD, and QUAY_SECRET_KEY from step 1.
Procedure
Define the target namespaces and ensure they do not overlap to prevent configuration conflicts.
Create the secret in the
weka-operator-systemnamespace. Repeat the same step in every namespace where you plan to create a WEKA CR. For example, if you deploy WEKA resources in thedefaultnamespace, create the secret there as well:
Configure failure domains
Group backend nodes into failure domains to ensure high availability and data protection. A failure domain represents a set of processes that share a common physical risk, such as a rack, power circuit, or network switch.
The system distributes data and parity blocks from the same stripe across different failure domains. If an entire failure domain fails, the cluster reconstructs the missing data from the remaining domains.
Select a failure domain mode
Implicit (default)
Assigns every process as its own independent failure domain.
Deployments where infrastructure shared risks cannot be identified by Kubernetes node labels.
Explicit
Groups processes into named domains based on physical node labels.
Deployments where containers share a rack, switch, or power source.
Prefer explicit mode when Kubernetes node labels can represent shared infrastructure boundaries. Explicit mode provides better failure protection by separating processes across known physical domains such as racks, power feeds, or switches. To use it, ensure the required topology labels are present on the nodes.
Determine stripe width and domain count
Coordinate the number of failure domains with the stripe width and protection level during cluster formation. Stripe width and protection levels are permanent once set.
Constraint to prevent data loss: blocks lost during a failure domain failure = stripe width / number of failure domains. This value must not exceed the parity block count (P).
Minimum healthy server requirements:
5+2
4
16+ 2
9
5+4
3
16+4
5
Map a single node label
Label every backend node with a physical grouping value:
Configure the
failureDomainfield in theWekaClusterCR:label: The node label key identifying the failure domain.skew: The permitted difference in container count between domains.
Use composite topology labels
Combine existing Kubernetes topology labels, such as zone and rack, into a compound failure domain identity.
Procedure
Identify the existing labels on your nodes:
Add the
compositeLabelslist to theWekaClusterCR:The operator combines these values. For example, a node in zone
us-east-1aonrack-1becomes failure domainus-east-1a/rack-1.
Verify the configuration
Confirm the distribution of containers across the defined domains.
Procedure
Apply the CR changes:
Check the container status:
Verify that the
FAILURE DOMAINcolumn displays your custom label values instead ofAUTO.
3. Install the WEKA Operator
Manage the lifecycle of WEKA resources by installing the WEKA Operator. This process involves applying Custom Resource Definitions (CRDs) and deploying the operator controller with specific configurations for the Container Storage Interface (CSI) and drive types.
Before you begin
Ensure the
QUAY_SECRET_KEYis created in theweka-operator-systemnamespace (completed in step 2).Install Helm on a local server, unless using a higher-level deployment tool such as Argo CD:
Confirm
kubectlis installed and configured against the target cluster.Identify your deployment configuration before running the Helm command:
ConditionRequired flagOperator v1.7.0 and later
--set csi.installationEnabled=trueOperator v1.10 and later with AlloyFlash
--set driveSharing.driveTypesRatio='{tlc: 9, qlc: 1}'Operator v1.10 and later with single drive type
--set driveSharing.driveTypesRatio='{qlc: 0}'
Procedure
Download and apply the CRDs so the Kubernetes API can recognize WEKA resources. Replace
<WEKA_OPERATOR_VERSION>with your version:
Deploy the WEKA Operator using the Helm flags that match your configuration. The following examples show the two most common layouts:
Mixed flash configuration (AlloyFlashTM):
This setting allocates 9/10 capacity to TLC and 1/10 to QLC.
Single drive type:
This setting configures a single drive type and disables Hybrid Flash.
Verify the installation. The
weka-operator-controller-managerpod must showRunningstatus:
Expected output:
If the pod does not reach Running state, see Troubleshoot WEKA Operator deployments.
4. Manage driver distribution
If outbound access to drivers.weka.io is available, use the pre-built driver service. Configure driver distribution only when you need a local build and distribution path for client and backend processes.
Choose a distribution method
Standard Linux distribution with supported kernel, outbound access to drivers.weka.io
Pre-built drivers (recommended): No build infrastructure required. By default, the drivers are pulled from https://drivers.weka.io.
Air-gapped environment, custom or patched kernel, or no external network access
Local driver builder: Configure driver distribution policy.
For architectural details on how driver distribution works, see WEKA Operator driver management.
Before you begin
Ensure a WEKA-compatible image (
weka-in-container) and a validimagePullSecretare accessible.Confirm that builder container versions match the target WEKA version.
For local distribution: ensure kernel headers matching the running kernel are installed on the build server. On Ubuntu, install
linux-headers-$(uname -r). On Rocky Linux, installkernel-devel-$(uname -r)andkernel-headers-$(uname -r). Also confirm port 60002 is open for communication between the operator, Drivers-Builder, Drivers-Dist, and Drivers-Loader.
Local driver distribution components
When using a local builder, the operator deploys three components:
Drivers-Builder: Compiles the kernel module for specific WEKA and kernel version combinations.
Drivers-Dist: An internal HTTP server that stores and serves compiled driver packages.
Service: A Kubernetes Service that exposes Drivers-Dist at a stable internal endpoint.
When configuring driver distribution manually, the following elements must be preserved exactly as shown in the configuration examples: ports, network modes, core configurations, and spec.name.
Procedure
Define node selection using a
nodeSelectorto identify target Kubernetes nodes that require the driver.Apply a WekaPolicy to deploy the driver distribution service. Use the example that matches your environment:
Example 2: Manual deployment of distribution and builder containers
Use this example only when direct resource control is required instead of a WekaPolicy:
On Rocky Linux, replace the preRunScript value with dnf install -y gcc.
Example 3: WekaPolicy with proactive driver pre-building
Use this example when you need to pre-build drivers for specific images beyond those detected from existing WekaCluster and WekaClient resources:
Ubuntu
Rocky Linux
Install a compiler in the builder container.
The driver builder compiles kernel modules in the builder container. Install a compiler that matches the node kernel requirements.
Add
builderPreRunScriptto theWekaPolicyspecification:
For RPM-based builder images (for example, Rocky Linux):
Ubuntu 22.04 with kernel 6.5 or later requires
gcc-12.Ubuntu 24.04 typically requires
gcc-13.Alternatively, install
gccand kernel headers withapt-get install -y gcc linux-headers-$(uname -r).
WekaPolicy additional attributes
Review the WekaPolicy API reference for all available resource options.
image
The WEKA container image used for the distributor and default builder.
interval
How often the operator reconciles the policy. Default: 1m.
builderPreRunScript
Optional script to run before the build, for example to install a compiler.
ensureNICsPayload
Defines the configuration for ensuring a specific number of data NICs on selected nodes.
signDrivesPayload
Configures parameters to scan and sign drives for WEKA backend containers.
Apply the configuration:
5. Discover and sign drives
Identify and prepare physical storage devices before provisioning the WEKA cluster.
How drive discovery works
When a drive discovery operation runs, the operator performs three actions on each node:
Annotates the node with a list of known serial IDs for all accessible drives.
Creates the extended resource
weka.io/driveson the node to indicate the count of ready drives.Marks only healthy, unblocked drives as available. Drives with errors or manual blocks are excluded.
Choose a discovery method
WekaManualOperation
One-time action for initial manual provisioning.
WekaPolicy
Automated periodic discovery. Initiates immediately when it detects node updates or hardware additions. Recommended for production.
Understand the shared field
The shared field in the signDrivesPayload controls whether SSD Proxy is enabled on the signed drives.
Whole drives are assigned directly to WEKA processes. This is the simpler configuration and suits deployments where clusters are large enough to use full drives.
Consider false when:
You intend to assign complete drives to one or more WekaCluster CRs.
Your clusters are consistently active and you want to avoid sharing drive workload across tenants.
Running multiple WekaCluster CRs on the same hardware does not require drive sharing. With 6 drives available, you can assign each drive to a separate WekaCluster without enabling shared.
Enables SSD Proxy, which introduces a layer between WEKA processes and the physical drives. This enables two capabilities:
Drive slicing: A single physical drive can be divided into logical slices, each used by a different WekaCluster. This is useful when clusters are smaller and do not need full drives.
Higher aggregate throughput: When clusters are not all fully loaded at the same time, drive sharing increases the number of drives used in parallel, which can improve overall performance. If clusters are consistently active simultaneously, drive workload is shared across tenants.
SSD Proxy enables allocating multiple CPU cores per physical drive.
For details on SSD Proxy operation and resource requirements,, see Drive sharing.
Procedure
Review the WekaPolicy API reference for all available resource options.
Define drive sharing and signing: Apply a WekaPolicy to sign compatible drives.
all-not-root
Signs all detected block devices except the root device.
aws-all
Detects NVMe devices using AWS PCI identifiers.
device-paths
Targets specific device paths listed in the manifest.
6. Provision WEKA resources
Deploy the WekaCluster and WekaClient Custom Resources to provision the backend storage and connect your Kubernetes nodes.
Run cluster-level WEKA CLI commands from Compute or Drive pods only. Do not run WEKA CLI commands inside WekaClient pods or application client pods.
Perform these steps in sequence:
Install the WekaCluster CR.
Create the WEKA cluster client secret (only required if WekaCluster and WekaClient are not deployed on the same Kubernetes cluster)
Install the WekaClient CR.
6.1. Install the WekaCluster CR
Provision the WEKA cluster backend using the WekaCluster CR. This resource defines the storage containers, drive configurations, and networking for the cluster.
Review the WekaCluster API reference for all available resource options.
Before you begin
Verify that drives are signed and discovered (step 5).
Verify the driver distribution service is accessible. WEKA recommends the external service at
https://drivers.weka.io.If you set
shared: truewhen signing drives, select a sizing method for the dynamic template:clusterCapacity: Sets the target usable capacity for the whole cluster. The operator derives the container and drive layout automatically.containerCapacity: Sets the capacity per drive container. Required whenshared: trueis set andclusterCapacityis not set.numDrives: Assigns whole drives per drive container. Applies whenshared: falseis set. Optional, defaults to1.
Procedure
Create
weka-cluster.yaml:
If your cluster requires settings that cannot be applied through standard configuration, for example overriding the default bucket count on a small or non-standard cluster, set
spec.overrides.postFormClusterScriptin the manifest before applying it. The operator runs this script once, after the cluster forms and beforestart-io. Use it only when no standard configuration option achieves the required result:
To inspect the field definition, run:
postFormClusterScript runs privileged debug commands on a cluster that is not yet serving I/O. Validate the script on a non-production cluster before applying it to production.
Apply the manifest:
Related information
6.2. Create the WEKA cluster client secret
Create a Kubernetes Secret that stores the credentials WekaClient uses to join the WEKA cluster. This is required only when WekaClient and WekaCluster are not deployed in the same Kubernetes cluster.
Before you begin
Obtain the org, join-secret, password, and username from your WEKA backend.
Procedure
Encode each credential value to base64.
Create
secret.yaml:
Apply the secret:
6.3. Install the WekaClient CR
If you need WEKA clients on Kubernetes, deploy the WekaClient CR on the designated Kubernetes nodes. WekaClient works like a DaemonSet and provisions one pod per selected node to provide a persistent WEKA data plane for your workloads.
Review the WekaClient API reference for all available resource options.
Before you begin
Label every worker node intended to host WEKA client pods:
Example:
Ensure the label matches the nodeSelector property in the WekaClient CR.
Verify that the Kubernetes Secret (for example,
weka-cluster-dev) exists in theweka-operator-systemnamespace and contains base64-encoded cluster credentials (org,join-secret,password, andusername).Identify whether you are using the external driver distribution service (
https://drivers.weka.io) or a local service endpoint.
Procedure
Create
weka-client.yamlusing the connection type that matches your environment:
Apply the manifest.
WekaClient parameters reference
For the full list of configurable fields, see WekaClient parameters.
image
The WEKA container image version to deploy.
—
imagePullSecret
Secret name used to authenticate with the image registry.
—
port
Defines a range of 100 ports for the container.
Dynamic
agentPort
Specifies a single port used by the agent process.
Dynamic
portRange
Defines a basePort for automatic port allocation.
—
nodeSelector
Selects the nodes where WEKA containers are scheduled.
—
network
Network configuration map. Sub-keys: ethDevice (single device), ethDevices (multiple devices), and udpMode (true/false). Defaults to UDP mode when not set.
UDP
driversDistService
URL for the driver distribution service.
—
targetCluster
Name and namespace of the WekaCluster CR to connect to. Applies when the WekaCluster runs in the same Kubernetes cluster.
—
joinIpPorts
IP addresses used to join a cluster outside the local environment.
—
wekaSecretRef
Reference to the Kubernetes Secret containing cluster credentials.
—
coresNum
Number of physical CPU cores to allocate to each container.
1
cpuPolicy
Defines core allocation behavior: auto, manual, shared, dedicated or dedicated_ht
auto
upgradePolicy
Sets the upgrade strategy: rolling, manual, or all-at-once.
rolling
gracefulDestroyDuration
Pause duration for local data and drive allocations during pod deletion.
24h
7. Manage the WEKA cluster management proxy
Optionally - access WEKA management endpoints through an operator-managed Service, and optionally expose them outside the Kubernetes cluster using a Kubernetes Ingress.
Required infrastructure
WEKA does not install or configure the following components. These remain the responsibility of the platform administrator:
Ingress controller
Manages incoming traffic, for example NGINX or Traefik.
External connectivity
A load balancer or equivalent mechanism to route traffic from outside the cluster.
DNS resolution
Configured hostnames that resolve to the Ingress controller's external IP.
TLS termination
Optional platform-managed certificate management for secure HTTPS communication.
Ingress configuration
WEKA simplifies basic setups by managing Ingress configuration through a single ingressClass setting. For advanced or customized networking scenarios, wrap or modify the service using standard Kubernetes Ingress resources.
8. Assign network space proxy subnets for multiple WEKA clusters
Optionally, allocate a unique proxy subnet to each WEKA cluster when you deploy more than one WekaCluster on the same Kubernetes environment. Each WEKA cluster uses an internal proxy subnet for its network space. When two clusters share the same subnet, their address ranges overlap and cause routing conflicts.
Assign a non-overlapping subnet to every WEKA cluster so that each cluster keeps a dedicated address range and isolates its traffic from other tenants on the same Kubernetes nodes.
Before you begin
Deploy the WEKA Operator on the target Kubernetes environment.
Identify every WEKA cluster already deployed on the same Kubernetes environment.
Important: Assign a unique proxy subnet to each WEKA cluster on the same Kubernetes environment. This prevents overlapping address ranges and routing conflicts when you deploy additional clusters.
Procedure
Record the proxy subnets already assigned to the existing WEKA clusters:
For each new WEKA cluster, choose a subnet in CIDR notation that no other WEKA cluster on the same Kubernetes environment uses.
Assign the subnet to the WEKA cluster:
Confirm the assignment by listing the proxy subnets again and verifying that each WEKA cluster holds a distinct range:
9. Perform post-deployment storage configuration on WEKA client
If your deployment includes a WEKA client on Kubernetes and embedded CSI is enabled, configure the CSI plugin and storage classes based on your operator version to enable persistent volume provisioning.
v1.7.0 and later
Embedded CSI is supported. When embedded CSI is enabled during operator installation, the operator configures the CSI plugin and StorageClass automatically.
Proceed to create a Persistent Volume Claim (PVC). See Dynamic and static provisioning.
v1.6.2 and earlier
Embedded CSI is not available. CSI requires manual installation.
See WEKA CSI Plugin.
For v1.7.0 and later, when embedded CSI installation is enabled, the operator creates storage classes following the pattern weka-<groupName>-<fsName>. To disable automatic storage class creation, set csi.storageClassCreationDisabled: true in your Helm values.
Last updated