Распределение стручков Kubernetes - PullRequest
0 голосов
/ 01 марта 2019

В последние годы я довольно много работал с Docker, но я новичок, когда дело доходит до Kubernetes.Я начинаю сегодня, и я борюсь с полезностью концепции Pod по сравнению с тем, как я привык думать в Docker Swarm.

Допустим, у меня есть кластер с 7 мощными машинами, и у меня естьследующий стек:

  • Мне нужны три реплики Cassandra, каждая из которых работает на выделенном компьютере (3/7)
  • Мне нужны две реплики Kafka, каждая работает на выделенном компьютере (5/7)
  • Я хочу, чтобы реплика MyProducer работала на своем компьютере, получала сообщения из Интернета и отправляла их в Kafka (6/7)
  • Я хочу, чтобы 3 реплики MyConsumer работали на последнем компьютере(7/7), которые вытаскивают из Кафки и вставляют в Кассандру.

С помощью Docker Swarm я использовал для управления распределением контейнеров метками узлов, например, я бы обозначил три машины и конфигурацию контейнера Cassandra как C_HOST, 2 машины и конфигурацию Kafka как K_HOST, ... Развертывание Swarm будетпоместите каждый контейнер правильно.

У меня есть следующие вопросы:

  • Приносит ли стручки Kubernetes какое-либо преимущество по сравнению с моим предыдущим подходом (например, простота)?Я понял, что мне по-прежнему необходимо настраивать метки, и если да, то я не вижу обращения.

  • Как правильно настроить эти модули?Будет ли это один модуль для реплик Cassandra, один модуль для реплик Kafka, один модуль для реплик MyConsumer и один модуль для MyProducer?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Используя антиаффинность pod, вы можете убедиться, что pod не совмещен с другими pod с определенными метками.

Так что у вас есть метка "app" со значениями "cassandra", "kafka""," мой-производитель "и" мой-потребитель ".

Поскольку вы хотите, чтобы кассандра, кафка и мой-производитель были на выделенных узлах сами по себе, вы просто настраиваете анти-сродство ко ВСЕМ существующимметки:

(см. https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ для полной схемы)

  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
      matchExpressions:
      - key: app
        operator: In
        values:
        - cassandra
        - kafka
        - my-producer
        - my-consumer

Это ресурс "Pod", поэтому вы должны определить это в развертывании (где вытакже определите, сколько реплик) в шаблоне pod.

Поскольку вы хотите, чтобы три экземпляра my-consumer работали на одном и том же узле (или на самом деле, вам все равно, где они запускаются, поскольку к настоящему времени только один узел)слева), вам не нужно ничего определять относительно аффинности или антиаффинности:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-consumer
  namespace: default
  labels:
    app: my-consumer
spec:
  selector:
    matchLabels:
      app: my-consumer
  replicas: 3 # here you set the number of replicas that should run
  template:   # this is the pod template
    metadata:
      labels:
        app: my-consumer # now this is the label you can set an anti-affinity to
    spec:
      containers:
      - image: ${IMAGE}
        name: my-consumer
#       affinity:
# now here below this you'd put the affinity-settings from above
# for the other deployments
0 голосов
/ 01 марта 2019

Вы все еще можете использовать метки узлов и использовать nodeSelector параметр.

Вы можете добавить метки узлов, используя kubectl ...

kubectl label nodes <node-name> <label-key>=<label-value> длядобавьте метку к выбранному вами узлу.

Но более продвинутым способом является использование affinity для распределения по модулю ...

...