Размещение подов в Kubernetes

  • У меня есть кластер Kubernetes, который распределен по 2 зонам - zone1 и zone2.

  • У меня есть 2 приложения - веб-приложение и база данных. Конфигурации веб-приложения хранятся в базе данных. И приложение, и база данных развертываются как приложения с отслеживанием состояния.

  • Идея состоит в том, чтобы развернуть 2 набора реплик для веб-приложения (приложение-0 и приложение-1) и 2 реплики для базы данных (база данных-0 и база данных-1). приложение-0 указывает на базу данных-0, приложение-1 указывает на базу данных-1.

  • Включена антиаффинность стручка. Поэтому желательно, чтобы приложение-0 и приложение-1 не находились в одной зоне. Также база данных-0 и база-данных-1 не будут находиться в одной зоне.

  • Я хочу, чтобы приложение 0 и база данных 0 находились в одной зоне. А приложение-1 и база данных-1 находятся в другой зоне. Так что производительность веб-приложения не будет снижена. Это возможно?


person Rana    schedule 23.11.2019    source источник


Ответы (3)


Если вы хотите строго разделить рабочие нагрузки по двум зонам - я бы предложил использовать nodeSelector в зоне узла.

Аналогичный результат возможен с привязкой к поду, но он более сложен и позволяет получить четкое разделение, которое вы описываете. Вам нужно будет использовать правила requiredDuringScheduling / Execution, которых обычно лучше избегать, если они вам действительно не нужны.

person Charlie Egan    schedule 23.11.2019
comment
Как будет работать nodeSelector в случае наборов с отслеживанием состояния? Разве приложение-0 и приложение-1 не будут помещены в одну и ту же зону, если я поставлю условие nodeSelector на основе зон? - person Rana; 23.11.2019
comment
StatefulSets по-прежнему создает поды, которые необходимо запланировать для узлов. Итак, nodeSelector по-прежнему работает, поскольку он работает на уровне пода. - person Charlie Egan; 23.11.2019

Точно так же, как вы использовали правила анти-сродства, чтобы избежать подготовки обоих приложений в одной зоне, вы можете использовать сродство для подготовки app-0 только в зоне, где существует db-0, технически это будет означать, что вы можете полностью отказаться от анти-сродства из приложения. как если бы вы сказали, чтобы он планировал только в зоне db, а db определен для распространения зон с анти-сродством, вы наследуете распределение от части базы данных.

person Radek 'Goblin' Pieczonka    schedule 23.11.2019
comment
Я не получил желаемых результатов. Я выполнил его 2 раза - первый раз app-0 и db-0 были на узле 0, а приложение-1 и db-1 были на узле-1. Второй раз app-0 и db-1 были на node-0, а app-1 и db-0 были на node-1. Желаемый результат - это то, что я нашла впервые. - person Rana; 24.11.2019

PodAntiAffinity для распространения на зоны

Для вашей базы данных

metadata:
  labels:
    app: db
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - db
        topologyKey: "kubernetes.io/hostname"

Для вашего веб-приложения

metadata:
  labels:
    app: web-app
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - web-app
        topologyKey: "kubernetes.io/hostname"

PodAffinity для размещения модулей на узлах

Кроме того, вы добавляете podAffinity в свое веб-приложение (не в базу данных), чтобы разместить его на узлах с вашей базой данных.

С добавлением podAffinity для вашего веб-приложения:

metadata:
  labels:
    app: web-app
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - web-app
        topologyKey: "kubernetes.io/hostname"
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - db
        topologyKey: "kubernetes.io/hostname"

Результат

С PodAntiAffinity и PodAffinity вы получите web-app-X, расположенный вместе с db-X.

web-app-1     web-app-2
db-1          db-2

В документации Kubernetes есть пример разместить кеш вместе с приложением на узлах около PodAffinity и «PodAntiAffinity».

Стабильная сетевая идентификация для StatefulSet

Чтобы обратиться к одному конкретному экземпляру StatefulSet, создать Headless Service с ClusterIP: None для каждого реплика db. Это позволяет вашим веб-приложениям подключаться к определенному экземпляру.

Доступ к ближайшему экземпляру БД

Теперь ваши веб-приложения могут подключаться к db-0 и db-1 через безголовые сервисы. Позвольте вашим веб-приложениям изначально подключаться к обоим и использовать одно с самым коротким временем отклика - скорее всего, оно находится на том же узле.

person Jonas    schedule 23.11.2019
comment
Я не получил желаемых результатов. Я выполнил его 2 раза - первый раз app-0 и db-0 были на узле 0, а приложение-1 и db-1 были на узле-1. Второй раз app-0 и db-1 были на узле 0, а приложение-1 и db-0 были на узле-1. Желаемый результат - это то, что я нашла впервые. - person Rana; 24.11.2019
comment
@ user3623483 веб-приложение всегда будет совмещено с экземпляром db с этой настройкой. Почему важно иметь одинаковые порядковые номера, при такой настройке они обеспечивают наилучшую производительность, как вы ожидали. Почему важен один и тот же порядковый номер веб-приложения и db? - person Jonas; 24.11.2019
comment
В своем веб-приложении я упоминаю такие детали подключения. app-0 подключается к db-0, а app-1 подключается к db-1. db-0 и db-1 реплицируются между собой. Должен ли я создать службу для БД и вместо этого указать на нее? Сможет ли K8s самостоятельно позаботиться о производительности, если я сделаю это? - person Rana; 24.11.2019
comment
@ user3623483 см. мое обновление для возможного решения, где вы выбираете db-instance с самым коротким временем отклика. - person Jonas; 25.11.2019
comment
@ user3623483 помогло ли мое обновленное предложение? В качестве альтернативы вы можете посмотреть, какой IP-диапазон имеет IP для db-0 и db-1, для модулей на одном узле должен быть выделен IP из одного и того же диапазона узлов, но это решение может быть непростым или стабильным. - person Jonas; 27.11.2019