Исходная ситуация: есть сервис, который использует PV, который необходимо увеличить. Примем, что другого (кроме стандартных утилит кубера) доступа к дискам нет от слова совсем.
В моем случае я увеличивал размер /data для prometheus.
Для начала запускаю копирование данных на локальную машину.
kubectl cp --container prometheus-server prometheus-server-6966b574d7-5svfw:/data data/
Создаю новый диск и под к нему
$ cat pv.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/gce-pd
name: prometheus-server-new
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
$ cat pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: prom-transfer-pod
spec:
volumes:
- name: storage
persistentVolumeClaim:
claimName: prometheus-server-new
containers:
- name: container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/data"
name: storage
kubectl apply -f pv.yaml
kubectl apply -f pod.yaml
Теперь для ускорения заливки данных назад архивирую скачанное и заливаю назад
cd data tar zcvf data.tar . kubectl cp data.tar prom-transfer-pod:/data/
Заходим на под и распаковываем.
Теперь начинается самое интересное. Торможу сервис, не убивая его. Это необходимо, что бы pv перестал меняться.
kubectl scale deployment prometheus-server --replicas=0
Редактирую PV
kubectl edit pv pvc-6ef4e067-6012-11e8-a42f-42010a840193
Где меняю persistentVolumeReclaimPolicy на Retain. Это необходимо, что бы PV не удалился при удалении/изменении PVC.
Делаю полностью аналогичное для нового PV и удаляю новый же PVC. Теперь у меня есть старый и новый PV. Опять редактирую новый PV, на этот раз убивая секцию claimRef. Это “отцепит” новый PV от несуществующего уже PVC и разрешит его монтировать куда угодно.
Теперь можно заменить volumeName в старом PVC. Ну или тупо грохнуть и создать новый по образцу
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: prometheus-server
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
volumeName: pvc-bd24792e-785c-11e8-a42f-42010a840193
Все, после того, как PV сменит статус на Bound, можно запустить сервер назад
kubectl scale deployment prometheus-server --replicas=1
После проверки работоспособности старый PV можно удалить.