Когда следует использовать LVM, а когда LVMThin?
- LVM проще и обладает высокой производительностью, сравнимой с производительностью накопителя;
- LVMThin позволяет использовать overprovisioning, но производительность ниже, чем у LVM.
Overprovisioning в LVMThin нужно использовать с осторожностью, контроллируя наличие свободного места в пуле (В системе мониторинга кластера есть отдельные события при достижении 20%, 10%, 5% и 1% свободного места в пуле)
При отсутствии свободного места в пуле будет наблюдатся деградация в работе модуля в целом, а также существует реальная вероятность потери данных!
Как назначить StorageClass по умолчанию?
Добавьте аннотацию storageclass.kubernetes.io/is-default-class: "true"
в соответствующий ресурс StorageClass:
1kubectl annotate storageclasses.storage.k8s.io <storageClassName> storageclass.kubernetes.io/is-default-class=true
Я не хочу, чтобы модуль использовался на всех узлах кластера. Как мне выбрать желаемые узлы?
Узлы, которые будут задействованы модулем, определяются специальными метками, указанными в поле nodeSelector
в настройках модуля.
Для отображения и редактирования настроек модуля, можно выполнить команду:
1kubectl edit mc sds-local-volume
Примерный вывод команды:
1apiVersion: deckhouse.io/v1alpha1
2kind: ModuleConfig
3metadata:
4 name: sds-local-volume
5spec:
6 enabled: true
7 settings:
8 dataNodes:
9 nodeSelector:
10 my-custom-label-key: my-custom-label-value
11status:
12 message: ""
13 version: "1"
Для отображения существующих меток, указанных в поле nodeSelector
, можно выполнить команду:
1kubectl get mc sds-local-volume -o=jsonpath={.spec.settings.dataNodes.nodeSelector}
Примерный вывод команды:
1nodeSelector:
2 my-custom-label-key: my-custom-label-value
Узлы, метки которых включают в себя набор, указанный в настройках, выбираются модулем как целевые для использования. Соответственно, изменяя поле nodeSelector
Вы можете влиять на список узлов, которые будут использованы модулем.
В поле nodeSelector
может быть указано любое количество меток, но важно, чтобы каждая из указанных меток присутствовала на узле, который Вы собираетесь использовать для работы с модулем. Именно при наличии всех указанных меток на выбранном узле, произойдет запуск pod-а sds-local-volume-csi-node
.
После добавление меток на узлах должны быть запущены pod-ы sds-local-volume-csi-node
. Проверить их наличие можно командой:
1 kubectl -n d8-sds-local-volume get pod -owide
Почему не удается создать PVC на выбранном узле с помощью модуля?
Пожалуйста, проверьте, что на выбранном узле работает pod sds-local-volume-csi-node
.
1kubectl -n d8-sds-local-volume get po -owide
Если pod отсутствует, пожалуйста, убедитесь, что на выбранном узле присутствуют все метки, указанные в настройках модуля в поле nodeSelector
. Подробнее об этом здесь.
Я хочу вывести узел из-под управления модуля, что делать?
Для вывода узла из-под управления модуля необходимо убрать метки, указанные в поле nodeSelector
в настройках модуля sds-local-volume
.
Проверить наличие существующих меток в nodeSelector
можно командой:
1kubectl get mc sds-local-volume -o=jsonpath={.spec.settings.dataNodes.nodeSelector}
Примерный вывод команды:
1nodeSelector:
2 my-custom-label-key: my-custom-label-value
Снимите указанные в nodeSelector
метки с желаемых узлов.
1kubectl label node %node-name% %label-from-selector%-
Для снятия метки необходимо после его ключа вместо значения сразу же поставить знак минуса.
В результате pod sds-local-volume-csi-node
должен быть удален с желаемого узла. Для проверки состояния можно выполнить команду:
1kubectl -n d8-sds-local-volume get po -owide
Если pod sds-local-volume-csi-node
после удаления метки nodeSelector
все же остался на узле, пожалуйста, убедитесь, что указанные в конфиге d8-sds-local-volume-controller-config
в nodeSelector
метки действительно успешно снялись с выбранного узла.
Проверить это можно командой:
1kubectl get node %node-name% --show-labels
Если метки из nodeSelector
не присутствуют на узле, то убедитесь, что данному узлу не принадлежат LVMVolumeGroup
ресурсы, использующиеся LocalStorageClass
ресурсами. Подробнее об этой проверке можно прочитать здесь.
Обратите внимание, что на ресурсах LVMVolumeGroup
и LocalStorageClass
, из-за которых не удается вывести узел из-под управления модуля будет отображена метка storage.deckhouse.io/sds-local-volume-candidate-for-eviction
.
На самом узле будет присутствовать метка storage.deckhouse.io/sds-local-volume-need-manual-eviction
.
Как проверить, имеются ли зависимые ресурсы LVMVolumeGroup
на узле?
Для проверки таковых ресурсов необходимо выполнить следующие шаги:
-
Отобразить имеющиеся
LocalStorageClass
ресурсы1kubectl get lsc
-
Проверить у каждого из них список используемых
LVMVolumeGroup
ресурсовВы можете сразу отобразить содержимое всех
LocalStorageClass
ресурсов, выполнив команду:1kubectl get lsc -oyaml
1kubectl get lsc %lsc-name% -oyaml
Примерный вид
LocalStorageClass
1apiVersion: v1 2items: 3- apiVersion: storage.deckhouse.io/v1alpha1 4 kind: LocalStorageClass 5 metadata: 6 finalizers: 7 - localstorageclass.storage.deckhouse.io 8 name: test-sc 9 spec: 10 lvm: 11 lvmVolumeGroups: 12 - name: test-vg 13 type: Thick 14 reclaimPolicy: Delete 15 volumeBindingMode: WaitForFirstConsumer 16 status: 17 phase: Created 18kind: List
Обратите внимание на поле spec.lvm.lvmVolumeGroups - именно в нем указаны используемые
LVMVolumeGroup
ресурсы. -
Отобразите список существующих
LVMVolumeGroup
ресурсов1kubectl get lvg
Примерный вывод
LVMVolumeGroup
ресурсов:1NAME HEALTH NODE SIZE ALLOCATED SIZE VG AGE 2lvg-on-worker-0 Operational node-worker-0 40956Mi 0 test-vg 15d 3lvg-on-worker-1 Operational node-worker-1 61436Mi 0 test-vg 15d 4lvg-on-worker-2 Operational node-worker-2 122876Mi 0 test-vg 15d 5lvg-on-worker-3 Operational node-worker-3 307196Mi 0 test-vg 15d 6lvg-on-worker-4 Operational node-worker-4 307196Mi 0 test-vg 15d 7lvg-on-worker-5 Operational node-worker-5 204796Mi 0 test-vg 15d
-
Проверьте, что на узле, который вы собираетесь вывести из-под управления модуля, не присутствует какой-либо
LVMVolumeGroup
ресурс, используемый вLocalStorageClass
ресурсах.Во избежание непредвиденной потери контроля за уже созданными с помощью модуля томами пользователю необходимо вручную удалить зависимые ресурсы, совершив необходимые операции над томом.
Я убрал метки с узла, но pod sds-local-volume-csi-node
остался. Почему так произошло?
Вероятнее всего, на узле присутствуют LVMVolumeGroup
ресурсы, которые используются в одном из LocalStorageClass
ресурсов.
Во избежание непредвиденной потери контроля за уже созданными с помощью модуля томами пользователю необходимо вручную удалить зависимые ресурсы, совершив необходимые операции над томом.
Процесс проверки на наличие вышеуказанных ресурсов описан здесь.
Служебные pod-ы компонентов sds-local-volume
не создаются на нужном мне узле. Почему?
С высокой вероятностью проблемы связаны с метками на узле.
Узлы, которые будут задействованы модулем, определяются специальными метками, указанными в поле nodeSelector
в настройках модуля.
Для отображения существующих меток, указанных в поле nodeSelector
, можно выполнить команду:
1kubectl get mc sds-local-volume -o=jsonpath={.spec.settings.dataNodes.nodeSelector}
Примерный вывод команды:
1nodeSelector:
2 my-custom-label-key: my-custom-label-value
Узлы, метки которых включают в себя набор, указанный в настройках, выбираются модулем как целевые для использования.
Также Вы можете дополнительно проверить селекторы, которые используются модулем в конфиге секрета d8-sds-local-volume-controller-config
в пространстве имен d8-sds-local-volume
.
1kubectl -n d8-sds-local-volume get secret d8-sds-local-volume-controller-config -o jsonpath='{.data.config}' | base64 --decode
Примерный вывод команды:
1nodeSelector:
2 kubernetes.io/os: linux
3 my-custom-label-key: my-custom-label-value
В выводе данной команды должны быть указаны все метки из настроек модуля data.nodeSelector
, а также kubernetes.io/os: linux
.
Проверьте метки на нужном вам узле:
1kubectl get node %node-name% --show-labels
При необходимости добавьте недостающие метки на желаемый узел:
1kubectl label node %node-name% my-custom-label-key=my-custom-label-value
Если метки присутствуют, необходимо проверить наличие метки storage.deckhouse.io/sds-local-volume-node=
на узле. Если метка отсутствует, следует проверить работает ли sds-local-volume-controller
, и в случае его работоспособности, проверить логи:
1kubectl -n d8-sds-local-volume get po -l app=sds-local-volume-controller
2kubectl -n d8-sds-local-volume logs -l app=sds-local-volume-controller
Как переместить данные между PVC?
Скопируйте следующий скрипт в файл migrate.sh на любом master узле. Использование: migrate.sh NAMESPACE SOURCE_PVC_NAME DESTINATION_PVC_NAME
1#!/bin/bash
2
3ns=$1
4src=$2
5dst=$3
6
7if [[ -z $3 ]]; then
8 echo "You must give as args: namespace source_pvc_name destination_pvc_name"
9 exit 1
10fi
11
12echo "Creating job yaml"
13cat > migrate-job.yaml << EOF
14apiVersion: batch/v1
15kind: Job
16metadata:
17 name: migrate-pv-$src
18 namespace: $ns
19spec:
20 template:
21 spec:
22 containers:
23 - name: migrate
24 image: debian
25 command: [ "/bin/bash", "-c" ]
26 args:
27 -
28 apt-get update && apt-get install -y rsync &&
29 ls -lah /src_vol /dst_vol &&
30 df -h &&
31 rsync -avPS --delete /src_vol/ /dst_vol/ &&
32 ls -lah /dst_vol/ &&
33 du -shxc /src_vol/ /dst_vol/
34 volumeMounts:
35 - mountPath: /src_vol
36 name: src
37 readOnly: true
38 - mountPath: /dst_vol
39 name: dst
40 restartPolicy: Never
41 volumes:
42 - name: src
43 persistentVolumeClaim:
44 claimName: $src
45 - name: dst
46 persistentVolumeClaim:
47 claimName: $dst
48 backoffLimit: 1
49EOF
50
51kubectl create -f migrate-job.yaml
52kubectl -n $ns get jobs -o wide
53kubectl_completed_check=0
54
55echo "Waiting for data migration to be completed"
56while [[ $kubectl_completed_check -eq 0 ]]; do
57 kubectl -n $ns get pods | grep migrate-pv-$src
58 sleep 5
59 kubectl_completed_check=`kubectl -n $ns get pods | grep migrate-pv-$src | grep "Completed" | wc -l`
60done
61echo "Data migration completed"