как установить разные переменные среды реплик развертывания в kubernetes

У меня есть 4 модуля k8s, установив реплики Deployment на 4 сейчас.

apiVersion: v1
kind: Deployment
metadata:
  ...
spec:
  ...
  replicas: 4
...

POD будет получать элементы в базе данных и потреблять их, элементы в базе данных имеют столбец class_name.

теперь я хочу, чтобы один стручок получил только один предмет class_name. например, pod1 получает только элемент, который class_name равен class_name_1, а pod2 получает только элемент, который class_name равен class_name_2...

Поэтому я хочу передать разные class_name в качестве переменных среды для разных POD развертывания. Могу ли я определить его в файле yaml развертывания?

Или есть другой способ достичь моей цели? (например, что-то кроме развертывания в k8s)


person hxidkd    schedule 24.04.2019    source источник


Ответы (3)


Для распределенной обработки заданий развертывания не очень хороши, потому что они не имеют какого-либо порядка или согласованных имен хостов модулей. Вам лучше использовать для этого StatefulSet, потому что они имеют согласованные имена, такие как pod-0, pod-1, pod-2. Вы можете положиться на этот индекс имени хоста.

Например, если ваш class_name_idx — это индекс имени класса в списке имен классов, num_replicas — это количество реплик в StatefulSet и pod_idx — это индекс пода в StatefulSet, то под должен запускать задание, только если: class_name_idx % num_replicas == pod_idx.

К сожалению, количество реплик StatefulSet не может быть получено внутри модуля динамически с помощью Downward API, поэтому вы можете либо жестко запрограммировать его, либо использовать API Kubernetes для получения его из кластера.

person Vasili Angapov    schedule 24.04.2019

Ни Deployment, ни что-либо еще не помогут в достижении вашей цели. Ваша цель — это какая-то логика, и она должна быть реализована через код в вашем приложении.

Поскольку развертывание — это несколько экземпляров одного и того же приложения, единственное, что может быть вам полезно, это: использование нескольких развертываний, каждое для своей задачи. Первый может получить class_name_1 предмет, а другой class_name_2, class_name_3 и т.д. Но это не очень хорошая идея

person Konstantin Vustin    schedule 24.04.2019

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

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

apiVersion: v1
kind: Service
metadata:
  name: kuard
  labels:
    app: kuard
spec:
  type: NodePort
  ports:
  - port: 8080
    name: web
  selector:
    app: kuard
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kuard
spec:
  serviceName: "kuard"
  replicas: 3
  selector:
    matchLabels:
      app: kuard
  template:
    metadata:
      labels:
        app: kuard
    spec:
      containers:
      - name: kuard
        image: gcr.io/kuar-demo/kuard-amd64:1 
        ports:
        - containerPort: 8080
          name: web

Поды, созданные statefulset, будут называться так:

kuard-0
kuard-1
kuard-2

Таким образом, вы можете назвать набор с сохранением состояния в соответствии с классами, то есть: class-name, и созданный модуль будет class-name-0, и вы можете заменить _ на -. Или просто удалите имя, чтобы получить индекс в конце.

Чтобы получить имя, просто прочитайте переменную окружения HOSTNAME

Это наименование является последовательным, поэтому вы можете убедиться, что у вас всегда есть 0, 1, 2, 3 после имени. И если 2 выйдет из строя, он будет воссоздан.

Как я уже сказал, я бы не рекомендовал этот подход, потому что вы привязываете инфраструктуру к своему коду, а также не можете масштабировать (при необходимости), потому что каждая служба уникальна, и добавление новых экземпляров приведет к получению новых идентификаторов.

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

person Diego Mendes    schedule 24.04.2019