Openshift: Redimensionar PV y PVC

En versiones antiguas de Kubernetes u OpenShift no es posible redimensionar los PVC por lo que la forma de hacerlo es básicamente borrando el PVC y volviendo-lo a crear.

En la siguiente entrada hago un resumen de los pasos que tuve que dar para hacer esto mismo sobre un entorno Openshift que se ejecutaba en Azure y usaba azdisk.

Redimensionar los azdisk

Para poder redimensioanr los azdisk es necesario que no esten atachados a ninguna VM, en mi caso como los discos se atachaban a PODs solo necesité parar los PODs para que OpenShift automaticamente desatachara el azdisk del nodo.

Detener el POD para desvincular el disco.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[antonio.guillen@folio13 ~]$ oc get dc -n logging
NAME REVISION DESIRED CURRENT TRIGGERED BY
logging-curator 5 1 1 config
logging-es-data-master-qj25vqhi 20 1 1
logging-es-data-master-jp36wvh 10 1 1
logging-es-data-master-pl47qa23 10 1 1
logging-kibana 8 1 1 config
[antonio.guillen@folio13 ~]$ oc scale --replicas=0 dc logging-es-data-master-qj25vqhi
deploymentconfig "logging-es-data-master-qj25vqhi" scaled
[antonio.guillen@folio13 ~]$ oc scale --replicas=0 dc logging-es-data-master-jp36wvh
deploymentconfig "logging-es-data-master-jp36wvh" scaled
[antonio.guillen@folio13 ~]$ oc scale --replicas=0 dc logging-es-data-master-pl47qa23
deploymentconfig "logging-es-data-master-pl47qa23" scaled
[antonio.guillen@folio13 ~]$ oc get dc -n logging
NAME REVISION DESIRED CURRENT TRIGGERED BY
logging-curator 5 1 1 config
logging-es-data-master-qj25vqhi 20 0 0
logging-es-data-master-jp36wvh 10 0 0
logging-es-data-master-pl47qa23 10 0 0
logging-kibana 8 1 1 config

Redimensionar el disco

Este paso se puede ejecutar directamente desde el portal de Azure o via CLI.

Arrancar el POD y redimensionar el sistemas de archivos

En este punto el disco ya esta redimensionado pero no el sistema de archivos, por ello es necesario:

Iniciar el POD escalando el deployment:

1
2
[antonio.guillen@folio13 ~]$ oc scale --replicas=1 dc logging-es-data-master-pl47qa23
deploymentconfig "logging-es-data-master-pl47qa23" scaled

Redimensionar el disco desde el nodo en el cual esta corriendo el POD:

1
2
3
4
5
[antonio.guillen@ocp-node-3 ~]$ sudo resize2fs /dev/sde
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/sde is mounted on /var/lib/origin/openshift.local.volumes/plugins/kubernetes.io/azure-disk/mounts/m3816929790; on-line resizing required
old_desc_blocks = 25, new_desc_blocks = 64
The filesystem on /dev/sde is now 134217728 blocks long.

Apagar de nuevo el POD escalando el deployment:

1
2
[antonio.guillen@folio13 ~]$ oc scale --replicas=0 dc logging-es-data-master-pl47qa23
deploymentconfig "logging-es-data-master-pl47qa23" scaled

Modificar el PV de OpenShift

Aumentar el tamaño del PV

Editar el PV y modificar el capacity storage.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[antonio.guillen@DXC ~]$ oc get pv | grep logging-es
pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-0 storage-az-disk 27d
pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-1 storage-az-disk 27d
pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062 200Gi RWO Retain Bound logging/logging-es-2 storage-az-disk 27d
[antonio.guillen@DXC ~]$ oc edit pv/pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062
persistentvolume/pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062
[antonio.guillen@DXC ~]$ oc edit pv/pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062
persistentvolume/pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062 edited
[antonio.guillen@DXC ~]$ oc edit pv/pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062
persistentvolume/pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062
[antonio.guillen@DXC ~]$ oc get pv | grep logging-es
pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-0 storage-az-disk 27d
pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-1 storage-az-disk 27d
pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-2 storage-az-disk 27d

Modificar el PVC de OpenShift

Exportar el manifiesto del PVC

El primer paso es exportar el archivo de manifiesto del PVC:

1
oc export pvc logging-es-2 > /tmp/pvc_logging-es-2.yaml

Eliminar el PVC

A continuación eliminar el PVC, por supuesto el POD que hace uso de él no debe estar ejecutandose.

1
oc delete pvc logging-es-2

Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
[antonio.guillen@DXC ~]$ oc get pvc | grep logging
logging-es-0 Bound pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062 500Gi RWO storage-az-disk 51m
logging-es-1 Bound pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062 500Gi RWO storage-az-disk 15m
logging-es-2 Bound pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062 200Gi RWO storage-az-disk 27d
[antonio.guillen@DXC ~]$ oc delete pvc logging-es-2
persistentvolumeclaim "logging-es-2" deleted
[antonio.guillen@DXC ~]$ oc get pv | grep logging
pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-0 storage-az-disk 27d
pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-1 storage-az-disk 27d
pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Released logging/logging-es-2 storage-az-disk 27d
[antonio.guillen@DXC ~]$ oc get pvc | grep logging
logging-es-0 Bound pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062 500Gi RWO storage-az-disk 51m
logging-es-2 Bound pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062 500Gi RWO storage-az-disk 16m

Eliminar el claimRef del PV

Este punto depende de la política de la política de reclamo (persistentVolumeReclaimPolicy) definida en los volumenes. En caso de que el persistentVolumeReclaimPolicy este definido en Delete este paso no será necesario ya que el PV habrá desaparecido sin embargo si el esta definido como Retain o Recycle este paso será necesario ya que el PV seguirá existinedo como Released siendo necesario eliminar el claimRef:

1
oc patch pv/pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062 --type json -p '[{"op":"remove","path":"/spec/claimRef"}]'

Ejemplo:

1
2
3
4
5
6
7
8
9
[antonio.guillen@DXC ~]$ oc get pv | grep logging
pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-0 storage-az-disk 27d
pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-1 storage-az-disk 27d
pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Released logging/logging-es-2 storage-az-disk 27d
[antonio.guillen@DXC ~]$ oc patch pv/pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062 --type json -p '[{"op":"remove","path":"/spec/claimRef"}]'
persistentvolume/pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062 patched
[antonio.guillen@DXC ~]$ oc get pv | grep logging
pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-0 storage-az-disk 27d
pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-1 storage-az-disk 27d

Si exportamos antes y después de modificar el PV, podemos observar los cambios con diff:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[antonio.guillen@DXC ~]$ diff -y /tmp/pv_pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062_before-path.yaml /tmp/pv_pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062_after-path.yaml
apiVersion: v1 apiVersion: v1
kind: PersistentVolume kind: PersistentVolume
metadata: metadata:
annotations: annotations:
pv.kubernetes.io/bound-by-controller: "yes" pv.kubernetes.io/bound-by-controller: "yes"
pv.kubernetes.io/provisioned-by: kubernetes.io/azure-disk pv.kubernetes.io/provisioned-by: kubernetes.io/azure-disk
volumehelper.VolumeDynamicallyCreatedByKey: azure-disk-dy volumehelper.VolumeDynamicallyCreatedByKey: azure-disk-dy
creationTimestamp: null creationTimestamp: null
name: pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062 name: pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062
spec: spec:
accessModes: accessModes:
- ReadWriteOnce - ReadWriteOnce
azureDisk: azureDisk:
cachingMode: ReadWrite cachingMode: ReadWrite
diskName: kubernetes-dynamic-pvc-c4b13588-2ebe-11e9-890e- diskName: kubernetes-dynamic-pvc-c4b13588-2ebe-11e9-890e-
diskURI: /subscriptions/2cc8342e-e40f-557e-9b1c-f2f999d1b diskURI: /subscriptions/2cc8342e-e40f-557e-9b1c-f2f999d1b
fsType: ext4 fsType: ext4
kind: Managed kind: Managed
readOnly: false readOnly: false
capacity: capacity:
storage: 500Gi storage: 500Gi
claimRef: <
apiVersion: v1 <
kind: PersistentVolumeClaim <
name: logging-es-1 <
namespace: logging <
resourceVersion: "35390962" <
uid: 5fa363c4-2ebe-11e9-890e-000d3a2fd062 <
persistentVolumeReclaimPolicy: Retain persistentVolumeReclaimPolicy: Retain
storageClassName: storage-az-disk storageClassName: storage-az-disk
status: status:
phase: Released | phase: Available

Cambiar el tamaño del manifiesto del PVC

En el siguiente ejemplo se modifica el manifiesto del PVC de 200Gi a 500Gi:

1
2
3
CURRENT_STORAGE=200Gi
NEXT_STORAGE=500Gi
sed -i "s|storage: $CURRENT_STORAGE|storage: $NEXT_STORAGE|g" /tmp/pvc_logging-es-2.yaml

Crear el PVC

Crear el PVC reimportando el manifiesto modificado en el punto anterior:

1
oc create -f /tmp/pvc_logging-es-2.yaml

Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
[antonio.guillen@DXC ~]$ oc get pvc | grep logging
logging-es-0 Bound pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062 500Gi RWO storage-az-disk 56m
logging-es-2 Bound pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062 500Gi RWO storage-az-disk 20m
[antonio.guillen@DXC ~]$ oc create -f /tmp/pvc_logging-es-2.yaml
persistentvolumeclaim/logging-es-2 created
[antonio.guillen@DXC ~]$ oc get pv | grep logging
pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-0 storage-az-disk 27d
pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-1 storage-az-disk 27d
pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062 500Gi RWO Retain Bound logging/logging-es-2 storage-az-disk 27d
[antonio.guillen@DXC ~]$ oc get pvc | grep logging
logging-es-0 Bound pvc-a4fa74f6-2ebe-11e9-890e-000d3a2fd062 500Gi RWO storage-az-disk 57m
logging-es-1 Bound pvc-b4a363c4-2ebe-11e9-890e-000d3a2fd062 500Gi RWO storage-az-disk 29s
logging-es-2 Bound pvc-c4b13588-2ebe-11e9-890e-000d3a2fd062 500Gi RWO storage-az-disk 21m

Escalar el deployment

Por último solo queda escalar el deployment, ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[antonio.guillen@folio13 ~]$ oc get dc -n logging
NAME REVISION DESIRED CURRENT TRIGGERED BY
logging-curator 5 1 1 config
logging-es-data-master-qj25vqhi 20 1 1
logging-es-data-master-jp36wvh 10 1 1
logging-es-data-master-pl47qa23 10 0 0
logging-kibana 8 1 1 config
[antonio.guillen@folio13 ~]$ oc scale --replicas=1 dc logging-es-data-master-pl47qa23
deploymentconfig "logging-es-data-master-pl47qa23" scaled
[antonio.guillen@folio13 ~]$ oc get dc -n logging
NAME REVISION DESIRED CURRENT TRIGGERED BY
logging-curator 5 1 1 config
logging-es-data-master-qj25vqhi 20 1 1
logging-es-data-master-jp36wvh 10 1 1
logging-es-data-master-pl47qa23 10 1 1
logging-kibana 8 1 1 config
[antonio.guillen@folio13 ~]$
Contenidos
  1. 1. Redimensionar los azdisk
    1. 1.1. Detener el POD para desvincular el disco.
    2. 1.2. Redimensionar el disco
    3. 1.3. Arrancar el POD y redimensionar el sistemas de archivos
      1. 1.3.1. Iniciar el POD escalando el deployment:
      2. 1.3.2. Redimensionar el disco desde el nodo en el cual esta corriendo el POD:
      3. 1.3.3. Apagar de nuevo el POD escalando el deployment:
  2. 2. Modificar el PV de OpenShift
    1. 2.1. Aumentar el tamaño del PV
  3. 3. Modificar el PVC de OpenShift
    1. 3.1. Exportar el manifiesto del PVC
    2. 3.2. Eliminar el PVC
    3. 3.3. Eliminar el claimRef del PV
    4. 3.4. Cambiar el tamaño del manifiesto del PVC
    5. 3.5. Crear el PVC
    6. 3.6. Escalar el deployment