как установить разные переменные среды реплик развертывания в kubernetes - PullRequest
2 голосов
/ 24 апреля 2019

У меня есть 4 модуля k8s, теперь для реплик развертывания установлено значение 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 Развертывания?

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

Ответы [ 3 ]

2 голосов
/ 24 апреля 2019

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

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

2 голосов
/ 24 апреля 2019

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

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

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

0 голосов
/ 24 апреля 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

Модули, созданные набором состояний, будут иметь имена:

kuard-0
kuard-1
kuard-2

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

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

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

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

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

...