diff --git a/operators/openshift-container-storage/README.md b/operators/openshift-container-storage/README.md new file mode 100644 index 0000000..c0c56ec --- /dev/null +++ b/operators/openshift-container-storage/README.md @@ -0,0 +1,37 @@ +Openshift Container Storage on OKD +--- + +# Introduction + +Openshift Container Storage (OCS) on OKD is software-defined storage for containers, with the storage services running natively in containers. + +It's especially powerful on bare metal deployments or situations where you don't have a cloud integration for provision of storage. + +Underneath, OCS is an opinionated deployment of Rook (which in-turn is an opionated deployment of Ceph in K8s) and NooBa (an object gateway). + +There are many components to OCS which fit together to give the rather pleasant developer experience. + +Under Openshift, OCS is available within the OperatorHub for near-oneclick install. + +Under OKD, you must build and install OCS manually which is a somewhat involved process. + +At some point in the future, a version of OCS should end up in the OKD OperatorHub - please follow along with the OKD Working Group to track progress on that. + +When not using cloud-backed storage (e.g EBS) you will need to install the Local Storage Operator which allows you to use local block devices for the internal Ceph cluster. + +# Contents + +| Document | Overview | +|-|-| +| [Building LSO](building-lso.md) | How to download the code repository and build the Local Storage Operator in preparation for installation | +| [Building OCS](building-ocs.md) | How to download the code repository and build the OCS operators in preparation for installation | +| [Installing LSO+OCS and intial setup](setup-ocs.md) | Once the operators are in an image registry, how to install them within your cluster and setup the storage services | + + +# Useful Resources +- [Configure the OpenShift Image Registry to use Container Storage](https://www.openshift.com/blog/configure-the-openshift-image-registry-backed-by-openshift-container-storage) +- [Uninstalling OpenShift Container Storage](https://access.redhat.com/documentation/en-us/red_hat_openshift_container_storage/4.6/html/deploying_and_managing_openshift_container_storage_using_ibm_power_systems/assembly_uninstalling-openshift-container-storage_ibm-power)(4.6) +- [Local Storage Operator Github](https://github.com/openshift/local-storage-operator) +- [OpenShift Container Storage Operator Github](https://github.com/openshift/ocs-operator) +- [OKD](https://www.okd.io/) +- [Rafael's useful Cheat sheet](https://gist.github.com/rafaeltuelho/111850b0db31106a4d12a186e1fbc53e) diff --git a/operators/openshift-container-storage/_example/lso-csv-example.yml b/operators/openshift-container-storage/_example/lso-csv-example.yml new file mode 100644 index 0000000..65a3c1f --- /dev/null +++ b/operators/openshift-container-storage/_example/lso-csv-example.yml @@ -0,0 +1,455 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + name: local-storage-operator.v4.6.0 + namespace: placeholder + annotations: + alm-examples: |- + [ + { + "apiVersion": "local.storage.openshift.io/v1", + "kind": "LocalVolume", + "metadata": { + "name": "example" + }, + "spec": { + "storageClassDevices": [ + { + "devicePaths": [ + "/dev/disk/by-id/ata-crucial", + ], + "fsType": "ext4", + "storageClassName": "foobar", + "volumeMode": "Filesystem" + } + ] + } + }, + { + "apiVersion": "local.storage.openshift.io/v1alpha1", + "kind": "LocalVolumeSet", + "metadata": { + "name": "example-localvolumeset" + }, + "spec": { + "deviceInclusionSpec": { + "deviceMechanicalProperties": [ + "Rotational", + "NonRotational" + ], + "deviceTypes": [ + "RawDisk" + ], + "maxSize": "100G", + "minSize": "10G" + }, + "maxDeviceCount": 10, + "nodeSelector": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "kubernetes.io/hostname", + "operator": "In", + "values": [ + "worker-0", + "worker-1" + ] + } + ] + } + ] + }, + "storageClassName": "example-storageclass", + "volumeMode": "Block" + } + }, + { + "apiVersion": "local.storage.openshift.io/v1alpha1", + "kind": "LocalVolumeDiscovery", + "metadata": { + "name": "auto-discover-devices" + }, + "spec": { + "nodeSelector": { + "nodeSelectorTerms": [ + { + "matchExpressions": [ + { + "key": "kubernetes.io/hostname", + "operator": "In", + "values": [ + "worker-0", + "worker-1" + ] + } + ] + } + ] + } + } + } + ] + categories: Storage + "operatorframework.io/suggested-namespace": openshift-local-storage + capabilities: Full Lifecycle + ## UPDATE REGISTRY URL AND VERSION HERE! + containerImage: quay.io/my-org-or-username/local-storage-operator:4.6.0 + support: Red Hat + repository: https://github.com/openshift/local-storage-operator + createdAt: "2019-08-14T00:00:00Z" + description: > + Configure and use local storage volumes in kubernetes and OpenShift. + OpenShift 4.2 and above is only supported OpenShift versions. + olm.skipRange: ">=4.3.0 <4.7.0" + operators.operatorframework.io/internal-objects: '["localvolumediscoveryresults.local.storage.openshift.io"]' + labels: + operator-metering: "true" + "operatorframework.io/arch.amd64": supported + "operatorframework.io/arch.ppc64le": supported + "operatorframework.io/arch.s390x": supported +spec: + displayName: Local Storage + description: Local Storage Operator + keywords: + - storage + - local storage + links: + - name: Documentation + url: https://github.com/openshift/local-storage-operator/tree/master/docs + - name: Source Repository + url: https://github.com/openshift/local-storage-operator + version: 4.6.0 + maturity: stable + maintainers: + - email: aos-storage-staff@redhat.com + name: Red Hat + minKubeVersion: 1.14.0 + provider: + name: Red Hat + labels: + alm-owner-metering: local-storage-operator + alm-status-descriptors: local-storage-operator.v4.6.0 + selector: + matchLabels: + alm-owner-metering: local-storage-operator + installModes: + - type: OwnNamespace + supported: true + - type: SingleNamespace + supported: true + - type: MultiNamespace + supported: false + - type: AllNamespaces + supported: false + install: + strategy: deployment + spec: + permissions: + - rules: + - apiGroups: + - local.storage.openshift.io + resources: + - "*" + verbs: + - "*" + - apiGroups: + - "" + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + verbs: + - "*" + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - "*" + - apiGroups: + - events.k8s.io + resources: + - events + verbs: + - "*" + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - list + - watch + - create + - apiGroups: + - apps + resourceNames: + - local-storage-operator + resources: + - deployments/finalizers + verbs: + - update + serviceAccountName: local-storage-operator + - rules: + - apiGroups: + - local.storage.openshift.io + resources: + - "*" + verbs: + - get + - list + - watch + - create + - update + serviceAccountName: local-storage-admin + clusterPermissions: + - rules: + - apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - "*" + - apiGroups: + - "" + resources: + - persistentvolumeclaims + - events + verbs: + - "*" + - apiGroups: + - events.k8s.io + resources: + - events + verbs: + - "*" + - apiGroups: + - "" + resources: + - nodes + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - persistentvolumes + verbs: + - get + - list + - watch + - create + - delete + serviceAccountName: local-storage-operator + - rules: + - apiGroups: + - security.openshift.io + resources: + - securitycontextconstraints + verbs: + - use + resourceNames: + - privileged + - apiGroups: + - "" + resources: + - nodes + verbs: + - list + - get + - watch + - apiGroups: + - "" + - storage.k8s.io + resources: + - configmaps + - storageclasses + - persistentvolumeclaims + - persistentvolumes + verbs: + - "*" + - apiGroups: + - "" + - events.k8s.io + resources: + - events + verbs: + - get + - list + - watch + - create + - patch + - update + serviceAccountName: local-storage-admin + deployments: + - name: local-storage-operator + spec: + replicas: 1 + selector: + matchLabels: + name: local-storage-operator + template: + metadata: + labels: + name: local-storage-operator + spec: + serviceAccountName: local-storage-operator + containers: + - name: local-storage-operator + ## UPDATE REGISTRY URL AND VERSION HERE! + image: quay.io/my-org-or-username/local-storage-operator:4.6.0 + ports: + - containerPort: 60000 + name: metrics + command: + - local-storage-operator + imagePullPolicy: Always + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: "local-storage-operator" + - name: PROVISIONER_IMAGE + ## UPDATE REGISTRY URL AND VERSION HERE! + value: quay.io/my-org-or-username/local-storage-static-provisioner:4.6.0 + - name: DISKMAKER_IMAGE + ## UPDATE REGISTRY URL AND VERSION HERE! + value: quay.io/my-org-or-username/local-storage-diskmaker:4.6.0 + customresourcedefinitions: + owned: + - displayName: Local Volume + group: local.storage.openshift.io + kind: LocalVolume + name: localvolumes.local.storage.openshift.io + description: Manage local storage volumes for OpenShift + version: v1 + specDescriptors: + - description: User requested management state of this object + displayName: Requested management state + path: managementState + - description: Log level of local volume diskmaker and provisioner for this object + displayName: LogLevel + path: logLevel + - description: Selected nodes for local storage + displayName: NodeSelector + path: nodeSelector + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:selector' + - description: StorageClass devices configured by this object + displayName: StorageClassDevices + path: storageClassDevices + statusDescriptors: + - description: Last generation of this object + displayName: ObservedGeneration + path: observedGeneration + - description: Current management state of this object + displayName: Operator management state + path: managementState + - description: Last known condition of this object + displayName: Conditions + path: conditions + x-descriptors: + - 'urn:alm:descriptor:io.kubernetes.conditions' + - displayName: Local Volume Set + group: local.storage.openshift.io + kind: LocalVolumeSet + name: localvolumesets.local.storage.openshift.io + description: A Local Volume set allows you to filter a set of storage volumes, group them and create a dedicated storage class to consume storage from the set of volumes. + version: v1alpha1 + specDescriptors: + - description: Selected nodes for local storage + displayName: NodeSelector + path: nodeSelector + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:selector' + - description: StorageClassName to use for set of matched devices + displayName: StorageClassName + path: storageClassName + - description: VolumeMode determines whether the PV created is Block or Filesystem. By default it will be block + displayName: VolumeMode + path: volumeMode + - description: FSType type to create when volumeMode is Filesystem + displayName: FSType + path: fsType + - description: List of tolerations to pass to the discovery daemons + displayName: Tolerations + path: tolerations + x-descriptors: + - urn:alm:descriptor:io.kubernetes:Tolerations + - description: Filters for including a device in the device discovery + displayName: deviceInclusionSpec + path: deviceInclusionSpec + statusDescriptors: + - description: Last generation of this object + displayName: ObservedGeneration + path: observedGeneration + - description: Total devices over which the PVs has been provisioned + displayName: TotalProvisionedDeviceCount + path: totalProvisionedDeviceCount + - description: Last known condition of this object + displayName: Conditions + path: conditions + x-descriptors: + - 'urn:alm:descriptor:io.kubernetes.conditions' + - displayName: Local Volume Discovery + group: local.storage.openshift.io + kind: LocalVolumeDiscovery + name: localvolumediscoveries.local.storage.openshift.io + description: Discover list of potentially usable disks on the chosen set of nodes + version: v1alpha1 + specDescriptors: + - description: Selected nodes for discovery + displayName: NodeSelector + path: nodeSelector + x-descriptors: + - 'urn:alm:descriptor:com.tectonic.ui:selector' + - description: List of tolerations to pass to the discovery daemons + displayName: Tolerations + path: tolerations + x-descriptors: + - urn:alm:descriptor:io.kubernetes:Tolerations + statusDescriptors: + - description: Current phase of the discovery + displayName: Phase + path: phase + - description: Last generation of this object + displayName: ObservedGeneration + path: observedGeneration + - description: Last known condition of this object + displayName: Conditions + path: conditions + x-descriptors: + - 'urn:alm:descriptor:io.kubernetes.conditions' + - displayName: Local Volume Discovery Result + group: local.storage.openshift.io + kind: LocalVolumeDiscoveryResult + name: localvolumediscoveryresults.local.storage.openshift.io + description: Disc inventory of available disks from selected nodes + version: v1alpha1 + specDescriptors: + - description: Node on which the devices are discovered + displayName: NodeName + path: nodeName + statusDescriptors: + - description: DiscoveredTimeStamp is the last timestamp when the list of discovered devices was updated + displayName: DiscoveredTimeStamp + path: discoveredTimeStamp + - description: DiscoveredDevices contains the list of devices discovered on the node + displayName: DiscoveredDevices + path: discoveredDevices diff --git a/operators/openshift-container-storage/_img/create_storage_cluster_auto_step_1.png b/operators/openshift-container-storage/_img/create_storage_cluster_auto_step_1.png new file mode 100644 index 0000000..e3b7674 Binary files /dev/null and b/operators/openshift-container-storage/_img/create_storage_cluster_auto_step_1.png differ diff --git a/operators/openshift-container-storage/_img/create_storage_cluster_auto_step_1_troubleshoot.png b/operators/openshift-container-storage/_img/create_storage_cluster_auto_step_1_troubleshoot.png new file mode 100644 index 0000000..9730ede Binary files /dev/null and b/operators/openshift-container-storage/_img/create_storage_cluster_auto_step_1_troubleshoot.png differ diff --git a/operators/openshift-container-storage/_img/create_storage_cluster_auto_step_2.png b/operators/openshift-container-storage/_img/create_storage_cluster_auto_step_2.png new file mode 100644 index 0000000..e69de29 diff --git a/operators/openshift-container-storage/_img/create_storage_cluster_auto_step_3.png b/operators/openshift-container-storage/_img/create_storage_cluster_auto_step_3.png new file mode 100644 index 0000000..e69de29 diff --git a/operators/openshift-container-storage/_img/installed_operators.png b/operators/openshift-container-storage/_img/installed_operators.png new file mode 100644 index 0000000..ccc229a Binary files /dev/null and b/operators/openshift-container-storage/_img/installed_operators.png differ diff --git a/operators/openshift-container-storage/building-lso.md b/operators/openshift-container-storage/building-lso.md new file mode 100644 index 0000000..4e3dc7f --- /dev/null +++ b/operators/openshift-container-storage/building-lso.md @@ -0,0 +1,169 @@ +Building Local Storage Operator for OKD +--- + +# Introduction + +This guide shows you how to slap the Local Storage Operator together to deploy on OLM. + +Pre-requisites: + +- Latest stable version of GoLang is installed +- [Operator SDK is installed](https://github.com/operator-framework/operator-sdk/releases) +- [OPM is downloaded and in your path](https://github.com/operator-framework/operator-registry/releases/tag/v1.16.1) + +Some revisions of Local Storage Operator don't have all the build tools in the branch. You may need to do some branch hopping. + +# Building + +There are 3 major projects that we will need to build/push before we can deploy. We don't actually have to build these, but we can should we ever need to. + +- [Local Storage Operator](https://github.com/openshift/local-storage-operator) +- Local Storage DiskMaker (included in operator repo) +- [Local Storage Static Provisioner](https://github.com/openshift/sig-storage-local-static-provisioner/tree/release-4.6) ( A fork from the official Kubernetes version ) + +### 1. Building the Local Storage Operator + +Clone the Local Storage Operator into your local gopath. + +```bash +go get github.com/openshift/local-storage-operator +``` + +Navigate into the cloned repo + +```bash +cd $(go env GOPATH)/src/github.com/openshift/local-storage-operator +``` + +Checkout the desired branch + +```bash +git checkout release-4.6 +``` + +Set your desired environment variables + +```bash +export REGISTRY=quay.io/my-org-or-username/ +export VERSION=4.6.0 +``` + +Next we are going to make and push our images. + +You should probably log into the container registry you plan to push to to avoid 403s + +```bash +make push +``` + +Now verify that your images have successfully pushed and your cluster can access them over the network. + +### 2. Building the Local Storage Static Provisioner + +### TODO: Building the Local Static Provisioner [https://github.com/openshift/sig-storage-local-static-provisioner/](https://github.com/openshift/sig-storage-local-static-provisioner/tree/release-4.6) + +### 3. Building the bundle + +Next, we need to create a bundle image. The Bundle image is the base of the Operator. It contains custom resource definitions (CRDs) and other information needed by OKD to facilitate it's deployment. + +If you're missing the OPM-Bundle folder, download it from master. + +Change into the bundle directory + +```bash +cd opm-bundle +``` + +Modify the default file to fit your deployment and versions. + +```bash +vim manifests/local-storage-operator.clusterserviceversion.yaml +``` + +Modify the YML file to point to your newly built & pushed images. + +Here is an example: + +[LSO CSV Example](_example/lso-csv-example.yml) + +Build and tag your Bundle Image + +```bash +docker build -f ./bundle.Dockerfile -t ${REGISTRY}local-storage-bundle:${VERSION} . +``` + +Push the image + +```bash +docker push ${REGISTRY}local-storage-bundle:${VERSION} +``` + +### 4. Building the index + +Next, we need to build our Index Image. This image will simply point to our bundle, but it could point to multiple. This Index is what OLM searches to find available Operators. + +Use the OPM CLI to build the index image. + +Your Index image also needs a version + +```bash +export INDEX_VERSION=4.6.1 +opm index add --bundles ${REGISTRY}local-storage-bundle:${VERSION} --tag ${REGISTRY}local-storage-index:${INDEX_VERSION} --container-tool docker +``` + +Next push the image + +```bash +docker push ${REGISTRY}local-storage-index:${INDEX_VERSION} +``` + +### 5. Add CatalogSource to OLM + +Next, we need to tell OLM to search our index image for our bundle. We do this by using a CatalogSource. + +Modify the following file and save it as catalog-create-subscribe.yaml + +```yaml +apiVersion: v1 +kind: Namespace +metadata: + name: openshift-local-storage +--- +apiVersion: operators.coreos.com/v1alpha2 +kind: OperatorGroup +metadata: + name: local-operator-group + namespace: openshift-local-storage +spec: + targetNamespaces: + - openshift-local-storage +--- +apiVersion: operators.coreos.com/v1alpha1 +kind: CatalogSource +metadata: + name: localstorage-operator-manifests + namespace: openshift-local-storage +spec: + sourceType: grpc + # replace this with your index image + image: quay.io/my-org-or-username/local-storage-index:4.6.1 +--- +apiVersion: operators.coreos.com/v1alpha1 +kind: Subscription +metadata: + name: local-storage-subscription + namespace: openshift-local-storage +spec: + channel: preview # this is the default channel name defined in opm-bundle file + name: local-storage-operator + source: localstorage-operator-manifests + sourceNamespace: openshift-local-storage +``` + +Apply the image using the OC CLI. + +```yaml +oc apply -f catalog-create-subscribe.yaml +``` + +You should now be able to find the Local Storage Operator inside of the OpenShift Marketplace under the openshift-local-storage project! diff --git a/operators/openshift-container-storage/building-ocs.md b/operators/openshift-container-storage/building-ocs.md new file mode 100644 index 0000000..980c315 --- /dev/null +++ b/operators/openshift-container-storage/building-ocs.md @@ -0,0 +1,124 @@ +Building Openshift Contiainer Storage Operator for OKD +--- + +# Introduction + +This guide shows you how to build OpenShift Container Storage and deploy on OLM. + +Pre-requisites: + +- Latest stable version of Golang is installed +- [Operator SDK is installed](https://github.com/operator-framework/operator-sdk/releases) +- [OPM is downloaded and in your path](https://github.com/operator-framework/operator-registry/releases) + +# Building + +There are a few images that we will need to build. + +- OpenShift Container Storage (OCS) Operator +- Operator Bundle +- Operator Index + +### 1. Building the Operator + +Clone the operator Github repo + +```bash +git clone https://github.com/openshift/ocs-operator.git && cd ./ocs-operator +``` + +Checkout the desired branch + +```bash +git checkout release-4.6 +``` + +Set your desired environment variables (more can be found in the /hack scripts) + +```bash +export REGISTRY=quay.io +export IMAGE_TAG=4.6.0 +export REGISTRY_NAMESPACE=my-org-or-username +``` + +Build the OCS-Operator + +```bash +make ocs-operator +``` + +Push the OCS operator to your registry + +```bash +docker push $REGISTRY/$REGISTRY_NAMESPACE/ocs-operator:$IMAGE_TAG +``` + +Generate the latest ClusterServiceVersion files + +```bash +make gen-latest-csv +``` + +Make and push the bundle image + +```bash +make operator-bundle +``` + +```bash +docker push $REGISTRY/$REGISTRY_NAMESPACE/ocs-operator-bundle:$IMAGE_TAG +``` + +Next we need to create & push the index image + +```bash +make operator-index +``` + +```bash +docker push $REGISTRY/$REGISTRY_NAMESPACE/ocs-operator-index:$IMAGE_TAG +``` + +### 3. Adding OCS to the Catalog + +We next need to define a new CatalogSource & OperatorGroup for OCS. We can do this by running a simple multi-line command. + +Create a namespace + +```bash +oc create ns openshift-storage +``` + +Create the OperatorGroup + +```bash +cat < ⏱️ Wait about 15 minutes before proceeding to the next step. OKD is asynchronously installing the required operators. + +# Label the Nodes + +OpenShift Container Storage requires at least 3 nodes to operate correctly. You must label these nodes as "available" so OpenShift Container Storage can populate them with infrastructure and use their disks. + +You can label a node with the following command: + +```bash +oc label nodes cluster.ocs.openshift.io/openshift-storage='' +``` + +# Configure the Operators + +Open the OKD web interface. + +Select the "Administrator" view. + +Select "Operators → Installed Operators" on the left navigation menu + +You should now see an interface like the following: + +![The "Installed Operators" dashboard in the OKD console, with Openshift Container Storage listed](_img/installed_operators.png) + +If you are missing the "Local Storage" or "OpenShift Container Storage" packages: + +- Ensure that you have selected "All Projects" on the top navigation pane +- Ensure that you have waited at least 15 minutes since running the install commands and the operators are not still installing. + +Next, select the OpenShift Container Storage Operator. + +Navigate the following: Storage Cluster Tab → Create Storage Cluster + +You should see the Storage Cluster Creation page. **If it does not look similar at first, ensure you have "Internal - Attached Devices" selected at the top.** + +![The "Create Storage Cluster" page within the OKD console, "Internal - AttachedDevices" mode is selected and the main content window shows "Auto Detect Volume"](_img/create_storage_cluster_auto_step_1.png) + +Next select All Nodes or Select Nodes based on your deployment. If you are unsure, select All Nodes. This will allow the storage cluster to span across all available Storage nodes. + +Next, give your Volume Set a name. In this case I have chosen `my-example-volumeset`. + +![The "Create Storage Class" step within the OKD console, the "Volume Set Name" has been set to "my-example-volumeset" which also represented the Storage Class Name. There are options to filter the disks the volume set is allowed on.](_img/create_storage_cluster_auto_step_2.png) + +💡 Despite us having 1.4 TiB of available Raw disk capacity, we will only have approximately 500GB usable due to redundancy. + +Click the NEXT button and you should see a page like the following: + +![The "Create Storage Cluster" step within the OKD console. Select the correct Storage class as defined in previous step, enable/disable encryption as you please and then a table shows the nodes this will be deployed on to](_img/create_storage_cluster_auto_step_3.png) + +1. Select your Storage Class that you created in the previous step. +2. ENABLE / DISABLE Encryption based on the usage of the volume (You can't change this later) +3. Ensure all of your desired storage nodes are populated in the Nodes list. +4. Smack the create button + +**OpenShift will now install the Storage Operator. Time to sit back, cross your fingers and hope that it works.** + +# Troubleshooting + +## When opening the "Create Storage Cluster" window, it shows an interface like the following: + +![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9bc065a4-3c96-4035-8b9e-c2bc24e49ec4/Untitled.png](_img/create_storage_cluster_auto_step_1_troubleshoot.png) + +Solution: If OKD detects existing Storage Classes, it won't let you use the easy setup wizard. You can either manually create a Local Volume Spec or remove the existing storage classes. + +## When trying to create the storage cluster, one or more of the nodes is missing from the list. + +Solution: This is often caused by an old hold on the drive from a previous volume. + +> Log into the impacted nodes (the ones missing from the list) + +```bash +oc debug node/NODE-FQDN +``` + +> List the available claim mount points + +```bash +ls /mnt/local-storage/ +``` + +Sample output: + +```console +sh-5.0# ls /mnt/local-storage/ +an-old-volume my-example-volumeset +sh-5.0# +``` + +In our case, we can see an old `an-old-volume`. We want to remove any symlinks inside of that folder. + +```bash +rm /mnt/local-storage/an-example-volume/* +``` + +Now after a few minutes, the node should show up on the list. \ No newline at end of file