Исходная ситуация: есть сервис, который использует 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 можно удалить.