Выбор одного модуля kubernetes среди набора копий для выполнения задачи - PullRequest
0 голосов
/ 31 января 2020

У меня есть приложение java, которое работает внутри модуля Kubernetes.

Приложение выполняет несколько задач (taskA, taskB и т. Д. c.). Приложение поддерживает запуск нескольких экземпляров в разных модулях. Все модули выполняют одинаковые задачи.

Однако есть задача, которая должна выполняться только одним из модулей (например, taskA должен выполняться только в одном из модулей). И если модуль, который выполняет заданную задачу c, умирает, один из других узлов должен начать выполнять эту задачу (пассивный узел, в отношении taskA, вступает во владение).

Есть ли какая-то поддержка этой функции в k8s, или мне нужно использовать какой-нибудь другой сервис (например, zookeeper)?

Ответы [ 2 ]

0 голосов
/ 31 января 2020

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

Более общая тема c, на которую вы можете посмотреть, это выборы лидера . В вашем примере лидер кластера - единственный, кто может выполнить taskA. ZooKeeper обычно используется для этого; есть более новый алгоритм под названием Raft , который тоже может работать. Вы должны написать поддержку для этого в своем приложении.

Самая близкая вещь в Kubernetes - StatefulSet . Полезная особенность StatefulSet состоит в том, что его реплики нумеруются, начиная с 0 , поэтому модуль может посмотреть на свое собственное имя хоста и выяснить, какое это имя. Если пакет с меньшим номером выходит из строя, Kubernetes перезапустит его с тем же именем. Вы можете установить правило, что только модуль 0 может выполнять taskA, что на практике может удовлетворить ваши требования.

0 голосов
/ 31 января 2020

Насколько я понимаю, я думаю, что вы должны использовать ReplicaSet .

Вы должны создать два ReplicaSet, первый для задачи A , а второй для задача B .

Набор ReplicaSet определен с полями, включая селектор, который указывает, как идентифицировать блоки, которые он может приобрести, количество реплик, указывающих, сколько пакетов он должен поддерживать, и шаблон модуля, указывающий данные новых модулей, которые он должен создать для соответствия критерию количества реплик. Затем ReplicaSet выполняет свое предназначение, создавая и удаляя блоки по мере необходимости для достижения желаемого числа. Когда ReplicaSet требуется для создания новых модулей, он использует свой шаблон модуля.

Ссылка, который ReplicaSet имеет на свои модули, осуществляется через поле metadata.ownerReferences модуля, которое указывает, какому ресурсу принадлежит текущий объект. Все блоки, приобретенные ReplicaSet, имеют свою идентификационную информацию ReplicaSet в своем поле ownerReferences. Именно по этой ссылке ReplicaSet знает о состоянии модулей, которые он поддерживает, и планирует соответственно.

ReplicaSet идентифицирует новые модули, которые необходимо приобрести с помощью своего селектора. Если есть Pod, у которого нет OwnerReference или OwnerReference не является Controller, и он соответствует селектору ReplicaSet, он будет немедленно получен указанным ReplicaSet.

ReplicaSet отвечает за выполнение указанного числа под реплики в любой момент времени.

Вот простой файл конфигурации yaml для ReplicaSet:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: example
  labels:
    app: guestbook
    tier: eg
spec:
  replicas: 1 #provided appreciated amount of replicas
  selector:
    matchLabels:
      tier: eg
  template:
    metadata:
      labels:
        tier: eg
    spec:
      containers:
      - name: php
        image: gcr.io/google_samples/gb-frontend:v3
...