Вопрос или проблема
Добрый день, я столкнулся с проблемой: PVC не создается в кластере kubernetes в longhorn. У меня 3 мастера, 3 воркера и 3 отдельных воркера для longhorn. longhorn установлен только на отдельных выделенных узлах.
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready control-plane 37d v1.30.8
k8s-master-2 Ready control-plane 37d v1.30.8
k8s-master-3 Ready control-plane 37d v1.30.8
k8s-worker-1 Ready <none> 37d v1.30.8
k8s-worker-2 Ready <none> 37d v1.30.8
k8s-worker-3 Ready <none> 37d v1.30.8
k8s-worker-longhorn-1 Ready <none> 30h v1.30.9
k8s-worker-longhorn-2 Ready <none> 30h v1.30.9
k8s-worker-longhorn-3 Ready <none> 30h v1.30.9
Longhorn запустился, необходимые узлы подключены
entrar описание изображения здесь
storage-class, который я использую
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: data
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
numberOfReplicas: "1"
fsType: xfs
staleReplicaTimeout: "120"
replicaAutoBalance: "best-effort"
dataLocality: "best-effort"
fromBackup: ""
nodeSelector: "data"
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: data-db
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
numberOfReplicas: "1"
fsType: xfs
staleReplicaTimeout: "120"
replicaAutoBalance: "best-effort"
fromBackup: ""
nodeSelector: "db"
helm chart, который я использую
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: {{ .Values.storagepostgres.pvc_name }}
labels:
app: postgres
spec:
storageClassName: "data-db"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: postgres-svc
labels:
app: postgres
spec:
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.service.targetPort }}
type: {{ .Values.service.type }}
selector:
app: postgres
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
nodeName: worker-node-3
selector:
matchLabels:
app: postgres
replicas: {{ .Values.container.replicaCount }}
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: {{ .Values.container.images }}
imagePullPolicy: "IfNotPresent"
env:
- name: POSTGRES_USER
value: {{ .Values.container.user }}
- name: POSTGRES_PASSWORD
value: {{ .Values.container.password }}
- name: POSTGRES_DB
value: {{ .Values.container.db_name }}
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgredb
volumes:
- name: postgredb
persistentVolumeClaim:
claimName: {{ .Values.storagepostgres.pvc_name }}
Запрос создания появляется
введите описание изображения здесь
Но внутри pod возникает ошибка
Warning FailedAttachVolume 100s (x87 over 22h) attachdetach-controller AttachVolume.Attach failed for volume "pvc-850115cb-0452-4963-aa2b-90dae9e53d30" : rpc error: code = Internal desc = Bad response statusCode [404]. Status [404 Not Found]. Body: [detail=, message=unable to attach volume pvc-850115cb-0452-4963-aa2b-90dae9e53d30 to k8s-worker-3: node.longhorn.io "k8s-worker-3" not found, code=Not Found] from [http://longhorn-backend:9500/v1/volumes/pvc-850115cb-0452-4963-aa2b-90dae9e53d30?action=attach]
Лог Longhorn
time="2025-02-10T13:39:08Z" level=warning msg="Cannot auto-balance volume in unknown state" func="controller.(*VolumeController).getReplicaCountForAutoBalanceBestEffort" file="volume_controller.go:2416" accessMode=rwx controller=longhorn-volume frontend=blockdev migratable=false node=k8s-worker-longhorn-3 owner=k8s-worker-longhorn-3 replicaAutoBalanceOption=best-effort shareEndpoint= shareState=stopped state=detached volume=pvc-850115cb-0452-4963-aa2b-90dae9e53d30
Я также пытался создать PVC напрямую в longhorn, не используя storage-class, и там все то же самое. Я понимаю, что PVC
Ответ или решение
Здравствуйте. Кажется, вы столкнулись с проблемой конфигурации Longhorn в вашей кластерной среде Kubernetes, особенно в отношении выделения и закрепления персистентных томов (PVC) на определённых узлах.
Теория
Longhorn — это распределённая система хранения, работающая поверх Kubernetes. Каждый экземпляр Longhorn включает в себя данные и сервисные компоненты, такие как реплики и движок управления томами. Чтобы Longhorn функционировал правильно, требуется корректная конфигурация коммуникации между компонентами и узлами. В вашем случае, Longhorn функционирует на выделенных узлах, что, безусловно, требует внимательного подхода к настройке сетевого взаимодействия и меток.
Пример
Судя по наведённым логам и ошибкам, ключевая проблема заключается в невозможности Longhorn прикрепить том к узлу, названному "k8s-worker-3". Ошибка указывает на отсутствие узла с именем "k8s-worker-3" в системе Longhorn:
attachdetach-controller AttachVolume.Attach failed for volume "pvc-850115cb-0452-4963-aa2b-90dae9e53d30" : rpc error: code = Internal desc = Bad response statusCode [404].
Такое поведение объясняется тем, что Longhorn не распознает или не имеет доступа к указанному узлу.
Применение
Для исправления указанной проблемы вы можете предпринять следующие шаги:
-
Проверьте конфигурацию узлов в Longhorn: Убедитесь, что все критически важные узлы Longhorn видят друг друга и доступны для сети Kubernetes. Доступ должен быть обеспечен между узлами как на уровне IP, так и по использованию DNS. Это можно проверить с помощью
kubectl get nodes
иkubectl describe node <node-name>
. -
Проверьте метки на узлах: В конфигурации
StorageClass
вы используетеnodeSelector
. Убедитесь, что узлы имеют правильно настроенные метки. Например, если вы используетеnodeSelector: "data"
, убедитесь, что узлы Longhorn имеют эту метку:kubectl label node k8s-worker-longhorn-1 data=true kubectl label node k8s-worker-longhorn-2 data=true kubectl label node k8s-worker-longhorn-3 data=true
Также проверьте наличие аналогичных меток для
data-db
. -
Проверка конфигурации Longhorn: Перейдите в UI Longhorn и проверьте состояние узлов. Убедитесь, что все узлы находятся в состоянии Ready и не имеют ошибок подключения.
-
Сетевые настройки: Иногда проблема может быть связана с сетевой архитектурой. Убедитесь, что нет ошибок в сетевых политиках Kubernetes, которые могут блокировать необходимый трафик между узлами.
-
Проверка версии Longhorn: Убедитесь, что все ваши компоненты и Longhorn работают на совместимых версиях. Смешение несовместимых версий может вызывать неожиданные ошибки и проблемы.
-
Проявление ошибок: Для диагностики проблемных мест проверьте журналы событий Kubernetes и Longhorn. Это может предоставить более детализированные сведения об ошибках, как указание на то, что компонент не смог взаимодействовать с какой-либо частью системы.
-
Тестовая установка: Если вышеприведённые действия не помогли, попробуйте развернуть минимальную тестовую установку с простым манифестом и проверить поведение Longhorn.
Эти шаги должны помочь вам диагностировать и устранить проблему с конфигурацией Longhorn на отдельных узлах Kubernetes. Постарайтесь как можно более последовательно воспроизводить проблему и устранять её по мере диагностики, это поможет значительно снизить вероятность возникновения аналогичных проблем в будущем.