Nano Hash - криптовалюты, майнинг, программирование

AKS PersistentVolume Affinity?

Отказ от ответственности: этот вопрос очень специфичен для используемых платформ и сценария использования, который мы пытаемся решить с его помощью. Также он сравнивает два подхода, которые мы в настоящее время используем, по крайней мере, на стадии разработки и пытаемся сравнить, но, возможно, еще не полностью понимаем. Я прошу совета по этой очень конкретной теме ...

A) Мы запускаем кластер Kafka как задачи Kafka на DC / OS, где сохраняемость данных поддерживается через локальное дисковое хранилище, которое предоставляется на том же хосте, что и соответствующий экземпляр брокера kafka.

B) Мы пытаемся запустить Kafka в Kubernetes (через оператора Strimzi), в частности в службе Azure Kubernetes (AKS), и изо всех сил пытаемся добиться надежного сохранения данных с помощью StorageClasses, которые вы получаете в AKS. Мы попробовали три возможности:

  1. (По умолчанию) Диск Azure
  2. Файл Azure
  3. emptyDir

Я вижу две основные проблемы с Azure Disk, поскольку мы можем настроить привязку Kafka Pod таким образом, чтобы они не попадали в одну и ту же зону обслуживания / хост, у нас нет инструмента для привязки соответствующего PersistentVolume где-либо рядом с Pod. Нет ничего лучше NodeAffinity для AzureDisks. Кроме того, довольно часто диск Azure оказывается на другом хосте, а не на соответствующем модуле, что может быть ограничено пропускной способностью сети?

С файлом Azure у нас нет проблем из-за зон обслуживания, которые временно отключаются, но в качестве варианта хранения с высокой задержкой он не кажется подходящим, а также у Kafka есть проблемы с удалением / обновлением файлов при хранении.

Итак, я закончил тем, что использовал временный кластер хранения, который обычно НЕ рекомендуется, но не имеет проблем, описанных выше. Том находится рядом с модулем и доступен ему до тех пор, пока сам модуль работает на любом узле. В случае обслуживания капсула И том умирают вместе. Пока у меня есть кворум, я не вижу, где это может вызвать проблемы.

  • Есть ли что-нибудь вроде podAffinity для PersistentVolumes, поскольку диск Azure по определению привязан к узлу?
  • Каковы основные недостатки использования emptyDir для сохранения в кластере Kafka в Kubernetes?

Ответы:


1

Есть ли что-нибудь вроде podAffinity для PersistentVolumes, поскольку диск Azure по определению привязан к узлу?

Насколько я знаю, для PersistentVolumes как Azure-Disk нет ничего лучше podaffinity. Лазурный диск должен быть подключен к узлу, поэтому, если модуль меняет узел хоста, модуль не может использовать том на этом диске. Только файловый ресурс Azure - podAffinity.

Каковы основные недостатки использования emptyDir для сохранения в кластере Kafka в Kubernetes?

Вы можете взглянуть на emptyDir:

временное пространство, например, для сортировки слиянием на диске

Это самое главное, на что нужно обращать внимание при использовании AKS. Вам нужно рассчитать дисковое пространство, возможно, вам нужно подключить к узлам несколько дисков Azure.

02.04.2021
  • Спасибо за ваш ответ, но, боюсь, это не совсем так ... Довольно часто модуль в aks получает azure-диск, который прикреплен к совершенно другому узлу хоста .... вот почему у нас возникли проблемы когда зона (где находился диск) вышла из строя на техническое обслуживание, в то время как контейнер был еще жив, но без диска. Мне интересно, должно ли это работать именно так? 02.04.2021
  • @ JürgenZornig Зона доступности - это функция, позволяющая защитить виртуальную машину от сбоя. Когда вы используете управляемый диск в качестве тома, он не использует зону доступности. Таким образом, узел восстановится, а диск - нет. По этой причине модуль все еще жив, но без диска. И вы не можете контролировать зону доступности. Так что для вашей цели это бесполезно. 02.04.2021
  • Да, это то, что мы также узнали, используя azure-disk в качестве серверной части хранилища kafka. Так что, похоже, нет лучшего решения, чем придерживаться emptyDir StorageClass и никогда не исчерпывать достаточное количество реплик kafka. 02.04.2021
  • @ JürgenZornig Да, по крайней мере, то, что я знаю. 02.04.2021
  • @ JürgenZornig Есть еще новости по этому вопросу? Решает ли это вашу проблему? 05.04.2021
  • Что ж, это на самом деле не решает нашу проблему, но когда такая ситуация возникает на этой платформе, я приму это как ответ. Большое Вам спасибо 05.04.2021

  • 2

    Начиная - я не уверен, что вы имеете в виду, когда диск Azure заканчивается на узле, отличном от того, где назначен модуль - это невозможно, на мой взгляд (для полноты вы можете сделать это на виртуальной машине с помощью функция общих дисков вне AKS, но насколько мне известно, это не поддерживается в AKS для динамических дисков на момент написания). Если вы смотрите на аннотацию volume.kubernetes.io/selected-node на PVC, я не верю, что она обновилась после первоначального создания.

    Вы можете достичь нужной конфигурации, используя набор состояний с антиаффинитетом. Рассмотрим этот набор состояний. Он создает три модуля, которые должны находиться в разных зонах доступности. Я развертываю это в кластере AKS с пулом узлов (nodepool2) с двумя узлами в каждой зоне доступности:

    ❯ kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{","}{.metadata.labels.topology\.kubernetes\.io\/zone}{"\n"}{end}'
    aks-nodepool1-25997496-vmss000000,0
    aks-nodepool2-25997496-vmss000000,westus2-1
    aks-nodepool2-25997496-vmss000001,westus2-2
    aks-nodepool2-25997496-vmss000002,westus2-3
    aks-nodepool2-25997496-vmss000003,westus2-1
    aks-nodepool2-25997496-vmss000004,westus2-2
    aks-nodepool2-25997496-vmss000005,westus2-3
    

    После того, как набор состояний развернут и развернут, вы увидите, что каждый модуль был назначен одному из узлов nodepool2:

    ❯ kubectl get pods -o wide
    NAME     READY   STATUS    RESTARTS   AGE     IP             NODE                                NOMINATED NODE   READINESS GATES
    echo-0   1/1     Running   0          3m42s   10.48.36.102   aks-nodepool2-25997496-vmss000001   <none>           <none>
    echo-1   1/1     Running   0          3m19s   10.48.36.135   aks-nodepool2-25997496-vmss000002   <none>           <none>
    echo-2   1/1     Running   0          2m55s   10.48.36.72    aks-nodepool2-25997496-vmss000000   <none>           <none>
    

    Каждый модуль создал PVC на основе шаблона:

    ❯ kubectl get pvc
    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
    demo-echo-0   Bound    pvc-bf6104e0-c05e-43d4-9ec5-fae425998f9d   1Gi        RWO            managed-premium   25m
    demo-echo-1   Bound    pvc-9d9fbd5f-617a-4582-abc3-ca34b1b178e4   1Gi        RWO            managed-premium   25m
    demo-echo-2   Bound    pvc-d914a745-688f-493b-9b82-21598d4335ca   1Gi        RWO            managed-premium   24m
    

    Давайте посмотрим на один из созданных клипов:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/bound-by-controller: "yes"
        pv.kubernetes.io/provisioned-by: kubernetes.io/azure-disk
        volumehelper.VolumeDynamicallyCreatedByKey: azure-disk-dynamic-provisioner
      creationTimestamp: "2021-04-05T14:08:12Z"
      finalizers:
      - kubernetes.io/pv-protection
      labels:
        failure-domain.beta.kubernetes.io/region: westus2
        failure-domain.beta.kubernetes.io/zone: westus2-3
      name: pvc-9d9fbd5f-617a-4582-abc3-ca34b1b178e4
      resourceVersion: "19275047"
      uid: 945ad69a-92cc-4d8d-96f4-bdf0b80f9965
    spec:
      accessModes:
      - ReadWriteOnce
      azureDisk:
        cachingMode: ReadOnly
        diskName: kubernetes-dynamic-pvc-9d9fbd5f-617a-4582-abc3-ca34b1b178e4
        diskURI: /subscriptions/02a062c5-366a-4984-9788-d9241055dda2/resourceGroups/rg-sandbox-aks-mc-sandbox0-westus2/providers/Microsoft.Compute/disks/kubernetes-dynamic-pvc-9d9fbd5f-617a-4582-abc3-ca34b1b178e4
        fsType: ""
        kind: Managed
        readOnly: false
      capacity:
        storage: 1Gi
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        name: demo-echo-1
        namespace: zonetest
        resourceVersion: "19275017"
        uid: 9d9fbd5f-617a-4582-abc3-ca34b1b178e4
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: failure-domain.beta.kubernetes.io/region
              operator: In
              values:
              - westus2
            - key: failure-domain.beta.kubernetes.io/zone
              operator: In
              values:
              - westus2-3
      persistentVolumeReclaimPolicy: Delete
      storageClassName: managed-premium
      volumeMode: Filesystem
    status:
      phase: Bound
    

    Как видите, у этого PV есть требуемый nodeAffinity для узлов в failure-domain.beta.kubernetes.io/zone со значением westus2-3. Это гарантирует, что модуль, которому принадлежит этот PV, когда-либо будет размещен только на узле в westus2-3, и что PV будет привязан к узлу, на котором работает диск при запуске модуля.

    На этом этапе я удалил все поды, чтобы разместить их на других узлах:

    ❯ kubectl get pods -o wide
    NAME     READY   STATUS    RESTARTS   AGE     IP             NODE                                NOMINATED NODE   READINESS GATES
    echo-0   1/1     Running   0          4m4s    10.48.36.168   aks-nodepool2-25997496-vmss000004   <none>           <none>
    echo-1   1/1     Running   0          3m30s   10.48.36.202   aks-nodepool2-25997496-vmss000005   <none>           <none>
    echo-2   1/1     Running   0          2m56s   10.48.36.42    aks-nodepool2-25997496-vmss000003   <none>           <none>
    

    Невозможно увидеть его через Kubernetes, но вы можете увидеть через портал Azure, что управляемый диск kubernetes-dynamic-pvc-bf6104e0-c05e-43d4-9ec5-fae425998f9d, который поддерживает pv pvc-bf6104e0-c05e-43d4-9ec5-fae425998f9d, который поддерживает PVC zonetest/demo-echo-0, указан как Managed by: aks-nodepool2-25997496-vmss_4, поэтому он был удален и назначен узлу, на котором находится модуль. Бег.

    Снимок экрана портала, показывающий диск, подключенный к узлу 4

    Если бы мне пришлось удалить узлы так, чтобы у меня не было узлов в АЗ 3, я бы не смог запустить под echo-1, так как он привязан к диску в АЗ 3, который не может быть подключен к узлу, не находящемуся в АЗ 3. АЗ 3.

    05.04.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..