#kubernetes
Вопрос:
У меня есть набор реплик Kubernetes с 5 репликами. Я хочу иметь идентификатор модуля, который увеличивается для каждой реплики, однако он не должен увеличиваться при повторном создании модуля из-за его сбоя.
Пример:
* ReplicaSet starts with 4 replicas *
* Replica 1 starts with the ID 1 *
* Replica 2 starts with the ID 2 *
* Replica 3 starts with the ID 3 *
* Replica 4 starts with the ID 4 *
* Replica 3 dies *
* Replica 5(3) starts with ID 3 *
Ответ №1:
Вы ищете набор состояний
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
Именование начинается с идентификатора 0, но это в какой-то степени то поведение, которое вы ищете.
Отвечаю на ваш комментарий. Когда мой набор данных использует изображение, которое я создал бы сам, я могу использовать что-то подобное, разрешая индекс контейнера, прежде чем запускать приложение:
if test -z "$HOSTNAME"; then
HOSTNAME=`hostname 2>/dev/null`
fi
if echo "$HOSTNAME" | grep -E '.*-[0-9][0-9]*' >/dev/null ; then
POD_IDX=`echo "$HOSTNAME" | sed 's|.*-([0-9]*)$|1|'`
fi
#echo My index is $POD_IDX
В других случаях я могу развернуть образ из общедоступного реестра. Затем я бы нашел способ передать это приложение с конфигурацией, контекстуализированной некоторым initContainer, например, с помощью Prometheus, который не использует индекс Pod, хотя он мог бы повторно использовать блок сверху,…:
initContainers:
- args:
- -c
- |
set -x;
sed "/external_labels:.*/ascrape_by: $REPLICA" /etc/prometheus.yml.tpl |
sed "s|^scrape_by:| scrape_by:|" >/etc/prometheus/prometheus.yml;
command: [ /bin/sh ]
env:
- name: REPLICA
valueFrom:
fieldRef:
fieldPath: metadata.name
image: docker.io/prom/prometheus:xx
Комментарии:
1. могу ли я также получить доступ к идентификатору через метаданные? (чтобы я мог добавить его в env)
2. Не совсем. Когда я имею дело со своим собственным изображением, я бы добавил в свою точку входа что-нибудь, что проверило бы имя хоста контейнера, извлекло бы числовую часть, если бы я ее нашел. В других случаях я могу реализовать это в каком-либо initContainer, например, мой основной образ будет начинаться с конфигурации, учитывающей этот индекс