Как настроить Longhorn на отдельном узле в k8s?

Вопрос или проблема

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

Применение

Для исправления указанной проблемы вы можете предпринять следующие шаги:

  1. Проверьте конфигурацию узлов в Longhorn: Убедитесь, что все критически важные узлы Longhorn видят друг друга и доступны для сети Kubernetes. Доступ должен быть обеспечен между узлами как на уровне IP, так и по использованию DNS. Это можно проверить с помощью kubectl get nodes и kubectl describe node <node-name>.

  2. Проверьте метки на узлах: В конфигурации 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.

  3. Проверка конфигурации Longhorn: Перейдите в UI Longhorn и проверьте состояние узлов. Убедитесь, что все узлы находятся в состоянии Ready и не имеют ошибок подключения.

  4. Сетевые настройки: Иногда проблема может быть связана с сетевой архитектурой. Убедитесь, что нет ошибок в сетевых политиках Kubernetes, которые могут блокировать необходимый трафик между узлами.

  5. Проверка версии Longhorn: Убедитесь, что все ваши компоненты и Longhorn работают на совместимых версиях. Смешение несовместимых версий может вызывать неожиданные ошибки и проблемы.

  6. Проявление ошибок: Для диагностики проблемных мест проверьте журналы событий Kubernetes и Longhorn. Это может предоставить более детализированные сведения об ошибках, как указание на то, что компонент не смог взаимодействовать с какой-либо частью системы.

  7. Тестовая установка: Если вышеприведённые действия не помогли, попробуйте развернуть минимальную тестовую установку с простым манифестом и проверить поведение Longhorn.

Эти шаги должны помочь вам диагностировать и устранить проблему с конфигурацией Longhorn на отдельных узлах Kubernetes. Постарайтесь как можно более последовательно воспроизводить проблему и устранять её по мере диагностики, это поможет значительно снизить вероятность возникновения аналогичных проблем в будущем.

Оцените материал
Добавить комментарий

Капча загружается...