Mi primer volume plugin de docker con ONTAP

El software de contenedores docker habilita la integración de volúmenes con sistemas de almacenamiento de datos externos, permitiendo la existencia de datos persistentes a través de los plugins de volúmen.

Existe un ‘volume plugin’ para las cabinas de NetApp ONTAP, E-series y SolidFire. Este plugin es open source y puede verse el código en el repositorio de GitHub.

Instalación

El primer paso es la instalación del software docker en el sistema operativo correspondiente. El procedimiento para cada uno es detallado en la propia documentación de Docker. En el caso de Fedora simplemente es necesario instalarlo a través del comando:

$ yum install docker

Antes de comenzar con la integración del plugin de Docker con ONTAP, es siempre recomendable probar el funcionamiento de docker con un contenedor simple tipo Hello World y montar un volúmen NFS desde la cabina ONTAP que se desea utilizar.

Requisitos

Para poder delegar el control de la gestión de los volúmenes a los aplicativos, solo la primera vez el administrador del almacenamiento debería revisar en la cabina ONTAP que:

  • Exista y esté habilitado un usuario en el SVM (Storage Virtual Machine) con los permisos necesarios.
cluster1::> security login show -vserver svm1 -user-or-group-name vsadmin

                             Authentication             Acct   Is-Nsswitch
User/Group Name  Application Method    Role Name        Locked Group
---------------- ----------- --------- ---------------- ------ -----------
vsadmin          http        password  vsadmin          no     no
vsadmin          ontapi      password  vsadmin          no     no
vsadmin          ssh         password  vsadmin          no     no
  • En el SVM que se desea utilizar existe una LIF (Logical Interface) para la gestión y una LIF para los datos.
cluster1::> network interface show -vserver svm1 -fields address,data-protocol,firewall-policy

vserver lif                     data-protocol address       firewall-policy
------- ----------------------- ------------- ------------- ---------------
svm1    svm1_admin_lif1         none          192.168.0.130 mgmt
svm1    svm1_cifs_nfs_lif1      nfs,cifs      192.168.0.135 data
  • Los volúmenes existentes y la política de exportación NFS aplicada es correcta.
cluster1::> volume show -vserver svm1 -fields junction-path, policy

vserver volume            policy  junction-path
------- ----------------- ------- ------------------
svm1    svm1_root         default /
  • La política aplicada tenga las reglas necesarias para que se pueda montar los volúmenes NFS.
cluster1::> export-policy rule show -vserver svm1 -policyname default
             Policy          Rule    Access   Client                RO
Vserver      Name            Index   Protocol Match                 Rule
------------ --------------- ------  -------- --------------------- ---------
svm1         default         1       nfs      0.0.0.0/0             any

Ejemplo

Tras esto y tal y como se muestra en la documentación del volume plugin de NetApp, lo siguiente que hay que realizar es crear el directorio de trabajo para el plugin y crear un fichero JSON.

$ mkdir /etc/netappdvp

$ cat << EOF > /etc/netappdvp/config.json
{
    "version": 1,
    "storageDriverName": "ontap-nas",
    "managementLIF": "192.168.0.101",
    "dataLIF": "192.168.0.135",
    "svm": "svm1",
    "username": "admin",
    "password": "Netapp1!",
    "aggregate": "aggr1_01"
}
EOF

Tras ello ya es posible la instalación del plugin de NetApp como se muestra a continuación.

$ docker plugin install netapp/ndvp-plugin:17.07 --alias netapp --grant-all-permissions

Se verifica que el estado del plugin es correcto con el siguiente comando.

$ docker plugin ls
ID                  NAME                DESCRIPTION                          ENABLED
0f7575ad513c        netapp:latest       nDVP - NetApp Docker Volume Plugin   true

Y se ejecuta la creación de un volumen según se ha definido previamente en el fichero JSON:

docker volume create -d netapp --name my_data -o size=10g

Se puede comprobar los volúmenes existentes:

$ docker volume ls
DRIVER              VOLUME NAME
netapp:latest       my_data

Y ver los detalles de un volumen en concreto:

$ docker volume inspect my_data
[
    {
        "CreatedAt": "0001-01-01T00:00:00Z",
        "Driver": "netapp:latest",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/plugins/0f7575ad513c26bb75843bd7650dfa2d90cb083e1136e5a716de71093b3566f9/rootfs",
        "Name": "my_data",
        "Options": {
            "size": "10g"
        },
        "Scope": "global",
        "Status": {
            "Snapshots": null
        }
    }
]

Desde la cabina ONTAP se puede verificar que se ha generado el volumen correctamente:

cluster1::> volume show -vserver svm1 -volume *my_data*
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
svm1      netappdvp_my_data aggr1_01 online    RW         10GB     9.50GB    5%

Una vez creado el volumen persistente en la cabina ONTAP, se pueden ejecutar uno o varios contenedores montando este volumen persistente desde uno o varios hosts.

En el ejemplo de a continuación se ejecuta un contenedor usando el volumen creado y montándolo sobre el path /data. Se observa que el volumen se ha montado desde dentro del contenedor.

$ docker run -it --name mycont -v my_data:/data busybox /bin/sh

$ mount | grep my_data
192.168.0.135:/netappdvp_my_data on /data type nfs (rw,relatime,vers=3,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.0.135,mountvers=3,mountport=635,mountproto=udp,local_lock=none,addr=192.168.0.135)