OpenShift Container Platform supports Microsoft Azure File volumes. You can provision your OpenShift Container Platform cluster with persistent storage using Azure. Some familiarity with Kubernetes and Azure is assumed.

High availability of storage in the infrastructure is left to the underlying storage provider.

Before you begin

  1. Install samba-client, samba-common, and cifs-utils on all nodes:

    $ sudo yum install samba-client samba-common cifs-utils
  2. Enable SELinux booleans on all nodes:

    $ /usr/sbin/setsebool -P virt_use_samba on
    $ /usr/sbin/setsebool -P virt_sandbox_use_samba on
  3. Run the mount command to check dir_mode and file_mode permissions, for example:

    $ mount

If the dir_mode and file_mode permissions are set to 0755, change the default value 0755 to 0777 or 0775. This manual step is required because the default dir_mode and file_mode permissions changed from 0777 to 0755 in OpenShift Container Platform 3.9. The following examples show configuration files with the changed values.

Considerations when using MySQL and PostgreSQL with Azure file
  • The owner UID of the Azure File mounted directory is different from the UID of a container.

  • MySQL containers change the file owner permission in the mounted directory. Because of the mismatch between the owner UID and container process UID, this operation fails. Therefore to run MySQL with Azure File:

    • Specify the Azure File mounted directory UID in the runAsUser variable in the PV configuration file.

          runAsUser: <mounted_dir_uid>
    • Specify the container process UID under mountOptions in the PV configuration file.

        - dir_mode=0700
        - file_mode=0600
        - uid=<container_process_uid>
        - gid=0
  • PostgreSQL does not work with Azure file. This is because PostgreSQL requires hard links in the Azure File directory, and since Azure File does not support hard links the pod fails to start.

PV configuration file example
# azf-pv.yml
apiVersion: "v1"
kind: "PersistentVolume"
  name: "azpv"
    storage: "1Gi"
    - "ReadWriteMany"
    secretName: azure-secret
    shareName: azftest
    readOnly: false
    - dir_mode=0777
    - file_mode=0777
Storage class configuration file example
$ azure-file-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
  name: azurefile
provisioner: kubernetes.io/azure-file
  - dir_mode=0777
  - file_mode=0777
  storageAccount: ocp39str
  location: centralus

Configuring Azure File for regional cloud

While Azure Disk is compatible with multiple regional clouds, Azure File supports only the Azure public cloud, because the endpoint is hard-coded.

Creating the PV

Azure File does not support the Recycle reclaim policy.

Creating the Azure Storage Account secret

Define the Azure Storage Account name and key in a secret configuration, which is then converted to base64 for use by OpenShift Container Platform.

  1. Obtain an Azure Storage Account name and key and encode to base64:

    apiVersion: v1
    kind: Secret
      name: azure-secret
    type: Opaque
      azurestorageaccountname: azhzdGVzdA==
      azurestorageaccountkey: eElGMXpKYm5ub2pGTE1Ta0JwNTBteDAyckhzTUsyc2pVN21GdDRMMTNob0I3ZHJBYUo4akQ2K0E0NDNqSm9nVjd5MkZVT2hRQ1dQbU02WWFOSHk3cWc9PQ==
  2. Save the secret definition to a file, for example azure-secret.yaml, then create the secret:

    $ oc create -f azure-secret.yaml
  3. Verify that the secret was created:

    $ oc get secret azure-secret
    NAME          TYPE      DATA      AGE
    azure-secret   Opaque    1         23d
  4. Define the PV in an object definition before creating it in OpenShift Container Platform:

    PV object definition using Azure File example
    apiVersion: "v1"
    kind: "PersistentVolume"
      name: "pv0001" (1)
        storage: "5Gi" (2)
        - "ReadWriteMany"
      azureFile: (3)
        secretName: azure-secret (4)
        shareName: example (5)
        readOnly: false (6)
    1 The name of the volume. This is how it is identified via PV claims or from pods.
    2 The amount of storage allocated to this volume.
    3 This defines the volume type being used: azureFile plug-in.
    4 The name of the secret used.
    5 The name of the file share.
    6 Defaults to false (read/write). ReadOnly here forces the ReadOnly setting in VolumeMounts.
  5. Save your definition to a file, for example azure-file-pv.yaml, and create the PV:

    $ oc create -f azure-file-pv.yaml
    persistentvolume "pv0001" created
  6. Verify that the PV was created:

    $ oc get pv
    pv0001    <none>    5Gi        RWM           Available                       2s

You can now request storage using PV claims, which can now use your new PV.

PV claims only exist in the user’s namespace and can only be referenced by a pod within that same namespace. Any attempt to access a PV from a different namespace causes the pod to fail.