Выбор конкретных узлов для использования модуля
Чтобы ограничить использование модуля определёнными узлами кластера, необходимо задать лейблы в поле nodeSelector в настройках модуля.
Для отображения и редактирования настроек модуля выполните команду:
d8 k edit mc sds-local-volume
Пример конфигурации:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: sds-local-volume
spec:
enabled: true
settings:
dataNodes:
nodeSelector:
my-custom-label-key: my-custom-label-value
status:
message: ""
version: "1"
Чтобы просмотреть текущие лейблы в поле nodeSelector, используйте следующую команду:
d8 k get mc sds-local-volume -o=jsonpath={.spec.settings.dataNodes.nodeSelector}
Пример вывода:
nodeSelector:
my-custom-label-key: my-custom-label-value
Модуль выбирает в качестве целевых только те узлы, у которых установлены все указанные в nodeSelector лейблы. Изменяя это поле, можно управлять списком узлов, на которых будет работать модуль.
В nodeSelector можно указать несколько лейблов. Однако для корректной работы модуля все эти лейблы должны присутствовать на каждом узле, на котором предполагается запуск sds-local-volume-csi-node.
После настройки лейблов убедитесь, что на целевых узлах запущены поды sds-local-volume-csi-node. Проверить их наличие можно командой:
d8 k -n d8-sds-local-volume get pod -owide
Проверка создания PVC на выбранном узле
Убедитесь, что на выбранном узле работает pod sds-local-volume-csi-node. Для этого выполните команду:
d8 k -n d8-sds-local-volume get po -owide
При отсутствии пода проверьте, что на узле установлены все лейблы, указанные в настройках модуля в поле nodeSelector. Подробнее о способах решения проблемы с отсутствием подов на нужном узле можно прочитать в этом разделе.
Вывод узла из-под управления модуля
Чтобы вывести узел из-под управления модуля, необходимо удалить лейблы, заданные в поле nodeSelector в настройках модуля sds-local-volume.
Для проверки текущих лейблов выполните команду:
d8 k get mc sds-local-volume -o=jsonpath={.spec.settings.dataNodes.nodeSelector}
Пример вывода:
nodeSelector:
my-custom-label-key: my-custom-label-value
Снимите указанные лейблы с узлов командой:
d8 k label node %node-name% %label-from-selector%-
После ключа лейбла необходимо указать знак минуса для её удаления.
После этого под sds-local-volume-csi-node должен быть удален с узла. Проверьте его состояние командой:
d8 k -n d8-sds-local-volume get po -owide
Если под остаётся после удаления метки, убедитесь, что метки из конфигурации d8-sds-local-volume-controller-config действительно удалены. Это можно проверить с помощью следующей команды:
d8 k get node %node-name% --show-labels
Если лейблы отсутствуют, проверьте, что на узле нет ресурсов LVMVolumeGroup, используемых ресурсами LocalStorageClass. Подробнее об этой проверке можно прочитать в этом разделе.
Обратите внимание, что для ресурсов LVMVolumeGroup и LocalStorageClass, из-за которых не удается вывести узел из-под управления модуля, будет назначен лейбл storage.deckhouse.io/sds-local-volume-candidate-for-eviction.
На самом узле будет присутствовать лейбл storage.deckhouse.io/sds-local-volume-need-manual-eviction.
Проверка зависимых ресурсов LVMVolumeGroup на узле
Для проверки зависимых ресурсов выполните следующие шаги:
-
Отобразите имеющиеся ресурсы LocalStorageClass:
d8 k get lsc -
Проверьте у каждого из них список используемых ресурсов LVMVolumeGroup.
Вы можете сразу отобразить содержимое всех LocalStorageClass ресурсов, выполнив команду:
d8 k get lsc -oyamlПримерный вид LocalStorageClass:
apiVersion: v1 items: - apiVersion: storage.deckhouse.io/v1alpha1 kind: LocalStorageClass metadata: finalizers: - localstorageclass.storage.deckhouse.io name: test-sc spec: lvm: lvmVolumeGroups: - name: test-vg type: Thick reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer status: phase: Created kind: ListОбратите внимание на поле
spec.lvm.lvmVolumeGroups— именно в нем указаны используемые ресурсы LVMVolumeGroup. -
Отобразите список существующих ресурсов LVMVolumeGroup:
d8 k get lvgПримерный вывод LVMVolumeGroup:
NAME HEALTH NODE SIZE ALLOCATED SIZE VG AGE lvg-on-worker-0 Operational node-worker-0 40956Mi 0 test-vg 15d lvg-on-worker-1 Operational node-worker-1 61436Mi 0 test-vg 15d lvg-on-worker-2 Operational node-worker-2 122876Mi 0 test-vg 15d lvg-on-worker-3 Operational node-worker-3 307196Mi 0 test-vg 15d lvg-on-worker-4 Operational node-worker-4 307196Mi 0 test-vg 15d lvg-on-worker-5 Operational node-worker-5 204796Mi 0 test-vg 15d -
Проверьте, что на узле, который вы собираетесь вывести из-под управления модуля, не присутствует какой-либо ресурс LVMVolumeGroup, используемый в ресурсах LocalStorageClass. Во избежание непредвиденной потери контроля за уже созданными с помощью модуля томами вручную удалите зависимые ресурсы, совершив необходимые операции над томом.
Оставшийся под sds-local-volume-csi-node после удаления лейблов
Если после удаления лейблов с узла под sds-local-volume-csi-node продолжает работать, это, вероятнее всего, связано с наличием на узле ресурсов LVMVolumeGroup, которые используются в одном из ресурсов LocalStorageClass. Процесс проверки описан выше.
Отсутствие служебных подов на нужном узле
Проблема может быть связана с некорректно установленными лейблами. Узлы, используемые модулем, определяются лейблами, заданными в поле nodeSelector в настройках модуля. Для просмотра текущих лейблов выполните:
d8 k get mc sds-local-volume -o=jsonpath={.spec.settings.dataNodes.nodeSelector}
Пример вывода:
nodeSelector:
my-custom-label-key: my-custom-label-value
Дополнительно можно проверить селекторы, используемые модулем, в конфигурации секрета d8-sds-local-volume-controller-config в пространстве имён d8-sds-local-volume:
d8 k -n d8-sds-local-volume get secret d8-sds-local-volume-controller-config -o jsonpath='{.data.config}' | base64 --decode
Пример вывода:
nodeSelector:
kubernetes.io/os: linux
my-custom-label-key: my-custom-label-value
В выводе данной команды должны быть указаны все лейблы из настроек модуля data.nodeSelector, а также kubernetes.io/os: linux.
Проверьте лейблы на нужном узле:
d8 k get node %node-name% --show-labels
При необходимости добавьте недостающие лейблы на желаемый узел:
d8 k label node %node-name% my-custom-label-key=my-custom-label-value
Если метки присутствуют, проверьте наличие лейбла storage.deckhouse.io/sds-local-volume-node= на узле. Если лейбл отсутствует, убедитесь, что работает sds-local-volume-controller, и ознакомьтесь с его логами:
d8 k -n d8-sds-local-volume get po -l app=sds-local-volume-controller
d8 k -n d8-sds-local-volume logs -l app=sds-local-volume-controller
Перемещение данных между PVC
Скопируйте следующий скрипт в файл migrate.sh на любом master-узле:
#!/bin/bash
ns=$1
src=$2
dst=$3
if [[ -z $3 ]]; then
echo "You must give as args: namespace source_pvc_name destination_pvc_name"
exit 1
fi
echo "Creating job yaml"
cat > migrate-job.yaml << EOF
apiVersion: batch/v1
kind: Job
metadata:
name: migrate-pv-$src
namespace: $ns
spec:
template:
spec:
containers:
- name: migrate
image: debian
command: [ "/bin/bash", "-c" ]
args:
-
apt-get update && apt-get install -y rsync &&
ls -lah /src_vol /dst_vol &&
df -h &&
rsync -avPS --delete /src_vol/ /dst_vol/ &&
ls -lah /dst_vol/ &&
du -shxc /src_vol/ /dst_vol/
volumeMounts:
- mountPath: /src_vol
name: src
readOnly: true
- mountPath: /dst_vol
name: dst
restartPolicy: Never
volumes:
- name: src
persistentVolumeClaim:
claimName: $src
- name: dst
persistentVolumeClaim:
claimName: $dst
backoffLimit: 1
EOF
d8 k create -f migrate-job.yaml
d8 k -n $ns get jobs -o wide
kubectl_completed_check=0
echo "Waiting for data migration to be completed"
while [[ $kubectl_completed_check -eq 0 ]]; do
d8 k -n $ns get pods | grep migrate-pv-$src
sleep 5
kubectl_completed_check=`d8 k -n $ns get pods | grep migrate-pv-$src | grep "Completed" | wc -l`
done
echo "Data migration completed"
Для запуска скрипта выполните команду:
migrate.sh NAMESPACE SOURCE_PVC_NAME DESTINATION_PVC_NAME
Создание снимков томов
Подробную информацию о снимках и используемых ресурсах можно найти в документации Kubernetes.
-
Включите модуль
snapshot-controller:d8 k apply -f -<<EOF apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: snapshot-controller spec: enabled: true version: 1 EOF -
Теперь вы можете создавать снимки томов. Для этого выполните следующую команду с необходимыми параметрами:
d8 k apply -f -<<EOF apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot namespace: <name of the namespace where the PVC is located> spec: volumeSnapshotClassName: sds-local-volume-snapshot-class source: persistentVolumeClaimName: <name of the PVC to snapshot> EOFОбратите внимание, что
sds-local-volume-snapshot-classсоздается автоматически, и егоdeletionPolicyустановлена вDelete, что означает, что ресурс VolumeSnapshotContent будет удален при удалении связанного ресурса VolumeSnapshot. -
Чтобы проверить статус созданного снимка, выполните команду:
d8 k get volumesnapshotДанная команда выведет список всех снимков и их текущий статус.