Идентификатор модуля Kubernetes

#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, например, мой основной образ будет начинаться с конфигурации, учитывающей этот индекс