Масштабирование службы с отслеживанием состояния, имеющей первичную/вторичную архитектуру, путем установки свойства

#java #mongodb #kubernetes

Вопрос:

У меня есть веб-служба java с отслеживанием состояния, которая подключается к mongodb, и в настоящее время она развертывается в виде jar непосредственно на виртуальной машине. Эта служба имеет свойство в файле свойств, т. е. primary .

Если мы установим primary значение true, то это основной экземпляр приложения, и в этом случае произойдет агрегация mongodb.

Если мы установим primary значение false, то это вторичный экземпляр приложения, и в этом случае агрегация mongodb не произойдет, но она будет обслуживать все запросы на чтение и запись.

Теперь мы переходим к развертыванию k8s.

Проблемы заключаются в :

Как мы устанавливаем значение primary во время развертывания модуля k8s с несколькими репликами ?

Как мы справляемся с отказом основного экземпляра модуля приложений ?

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

Заранее спасибо.

Ответ №1:

Для первичного и вторичного вы можете передать переменные среды в модуль, и на основе этого модуля начнется соответствующая конфигурация.

 import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n",
                              envName,
                              env.get(envName));
        }
    }
}
 

Вы можете создать ДВА разных развертывания в K8s: одно для основного, а второе для дополнительного.

Как мы устанавливаем значение primary во время развертывания модуля k8s с несколькими репликами ?

Вы можете задать переменную среды, которая будет одинаковой для всех реплик первичной и различных переменных среды для вторичной.

Как мы справляемся с отказом основного экземпляра модуля приложений ?

Вы можете использовать зонд готовности и жизнестойкости для развертывания, чтобы в случае возникновения какого-либо сбоя K8s автоматически перезапустил модуль.

https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

Если вы можете создать два развертывания в K8s

 apiVersion: apps/v1
kind: deployment
metadata:
  name: primary
  labels:
    purpose: primary
spec:
  containers:
  - name: primary
    image: gcr.io/google-samples/node-hello:1.0
    env:
    - name: primary
      value: "True"
 

Вторые переменные среды развертывания будут выглядеть следующим образом

 apiVersion: apps/v1
kind: deployment
metadata:
  name: secondary
  labels:
    purpose: secondary
spec:
  containers:
  - name: secondary
    image: gcr.io/google-samples/node-hello:1.0
    env:
    - name: secondary
      value: "False"
 

Если вы используете набор с отслеживанием состояния, вы также можете настроить его в нем, если не используете развертывание.

Комментарии:

1. Мой второй вопрос был больше о том, как в случае полного отказа первичного, как мы сделаем первичным один из вторичных экземпляров. Я думаю, что это возможно с алгоритмами выборов лидеров.