Disaggregated installation


In a disaggregated deployment of Portworx, the storage nodes are separate from the compute (or storageless) nodes. Based on the environment in which you are deploying Portworx, the installation instructions for disaggregated mode change.

Cloud based autoscaling environments

In a cloud autoscaling environment, Portworx recommends using two separate node groups—one for storage nodes and the other for compute (storageless) nodes. This architecture enables you to scale up and scale down your compute cluster based on your application needs while keeping the storage node group constant.

Prepare your nodes

Before you deploy Portworx, you need to designate your nodes as storage and storageless (compute). Portworx looks for the following labels on the Kubernetes nodes to identify them as a part the storage node group or the storageless node group:

portworx.io/node-type: storage
portworx.io/node-type: storageless

When using a managed Kubernetes cluster in the cloud, such as AKS or EKS, add these label pairs to your node groups when you create the node groups. This way, the cloud will ensure that these labels are always present on the Kubernetes nodes.

Install Portworx

Follow the installation instructions for your cloud provider, making sure to select Operator based deployment.

Once you have generated the StorageCluster spec, you will need to add the following environment variable in the env section:

spec:
  env:
  - name: ENABLE_ASG_STORAGE_PARTITIONING
    value: "true"

You can also add the environment variables from the spec generator using the Environment Variables dropdown menu.

A sample StorageCluster spec for AWS looks like this:

kind: StorageCluster
apiVersion: core.libopenstorage.org/v1
metadata:
  name: px-cluster-496f87a3-9ea4-4b7e-b221-7c14bab91672
  namespace: kube-system
  annotations:
    portworx.io/install-source: "https://install.portworx.com/?operator=true&mc=false&kbver=&b=true&kd=type%3Dgp2%2Csize%3D150&s=%22type%3Dgp2%2Csize%3D150%22&c=px-cluster-496f87a3-9ea4-4b7e-b221-7c14bab91672&stork=true&csi=true&mon=true&tel=false&st=k8s&e=ENABLE_ASG_STORAGE_PARTITIONING%3Dtrue&promop=true"
spec:
  image: portworx/oci-monitor:2.10.1
  imagePullPolicy: Always
  kvdb:
    internal: true
  cloudStorage:
    deviceSpecs:
    - type=gp2,size=150
    kvdbDeviceSpec: type=gp2,size=150
  secretsProvider: k8s
  stork:
    enabled: true
    args:
      webhook-controller: "false"
  autopilot:
    enabled: true
  monitoring:
    prometheus:
      enabled: true
      exportMetrics: true
  featureGates:
    CSI: "true"
  env:
  - name: "ENABLE_ASG_STORAGE_PARTITIONING"
    value: "true"

Once this environment variable is set, Portworx will run the nodes which are labeled as portworx.io/node-type=storage as storage nodes, and it will run the nodes labeled as portworx.io/node-type=storageless as storageless nodes.

On-premises environments

In an on-premises environment, you can use a disaggregated deployment model when you have a heterogeneous cluster configuration, where some of your nodes have storage disks while the rest of the nodes are compute only with no disks configured.

Preparing your nodes

Before you deploy Portworx, you need to designate your nodes as storage and storageless (compute). Portworx looks for the following labels on the Kubernetes nodes to identify them as a part the storage node group or the compute (storageless) node group:

portworx.io/node-type: storage
portworx.io/node-type: storageless

Installing Portworx

Follow the installation instructions for your on-premises environment, making sure to select Operator based deployment.

Once you have generated the StorageCluster spec, you will need to create two separate node sections in it to define the device settings for the storage and storageless (compute) nodes.

Here is a sample StorageCluster spec that uses node-specific overrides:

apiVersion: core.libopenstorage.org/v1
kind: StorageCluster
metadata:
  name: portworx
  namespace: kube-system
spec:
  image: portworx/oci-monitor:2.10.1
  storage:
    devices:
    - /dev/sda
    - /dev/sdb
  nodes:
  - selector:
      labelSelector:
        matchLabels:
          portworx.io/node-type: "storage"
    storage:
      devices:
      - /dev/nvme1
      - /dev/nvme2
  - selector:
      labelSelector:
        matchLabels:
          portworx.io/node-type: "storageless"
    storage:
      devices: []

In this example, Portworx on the nodes labeled as portworx.io/node-type=storage expects two disks, /dev/nvme1 and /dev/nvme2, and it will run them as storage nodes. On the other hand, Portworx on the nodes labeled as portworx.io/node-type=storageless will ignore any disks that might be found on the node and run as storageless nodes.



Last edited: Friday, Sep 16, 2022