#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 автоматически перезапустил модуль.
Если вы можете создать два развертывания в 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. Мой второй вопрос был больше о том, как в случае полного отказа первичного, как мы сделаем первичным один из вторичных экземпляров. Я думаю, что это возможно с алгоритмами выборов лидеров.