Как обеспечить запуск только одного модуля на моем узле в GKE?

#kubernetes #google-kubernetes-engine

#kubernetes #google-kubernetes-engine

Вопрос:

В моем приложении у меня есть сервер rest, который локально взаимодействует с базой данных через командную строку (это долгая история). В любом случае, база данных смонтирована на локальном SSD-диске на узле. Я могу гарантировать, что в пуле узлов будут запланированы только модули этого типа, поскольку я изменил узлы и добавил допуски к своим модулям.

Что я хочу знать, так это то, как я могу запретить kubernetes планировать несколько экземпляров моего модуля на одном узле? Я хочу избежать этого, поскольку я хочу, чтобы мой модуль мог потреблять как можно больше процессора, и я также не хочу, чтобы несколько модулей взаимодействовали через локальный ssd.

Как мне предотвратить размещение более одного модуля моего типа на узле? Сначала я думал о наборах демонов, но, думаю, в дальнейшем я хочу настроить для своего пула узлов автоматическое масштабирование, таким образом, когда у меня в пуле будет n узлов и я запрошу n 1 реплики, пул узлов автоматически увеличится.

Комментарии:

1. Я думаю, вы просто создаете набор демонов и настраиваете масштабирование узла независимо от этого. при добавлении нового узла на нем будет автоматически запущен модуль. Я вижу, что более чистый способ

Ответ №1:

Вы можете использовать Daemonsets в сочетании с nodeSelector или affinity . В качестве альтернативы вы могли бы настроить podAntiAffinity на своих Pod компьютерах, например:

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: rest-server
spec:
  selector:
    matchLabels:
      app: rest-server
  replicas: 3
  template:
    metadata:
      labels:
        app: rest-server
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - rest-server
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: rest-server
        image: nginx:1.12-alpine
  

Ответ №2:

В зависимости от того, чего вы пытаетесь достичь, наборы демонов могут быть неполным ответом, потому что DaemonSet НЕ масштабируется автоматически, и он поместит модуль только в новый узел; когда вы добавляете новые узлы в свой пул.

Если вы хотите изменить свою рабочую нагрузку с помощью n 1 реплик, лучше использовать podAntiAffinity, контролирующий планирование с помощью node taints’ов и автоматического масштабирования кластера; это гарантирует, что новый узел будет добавлен при увеличении количества модулей и удален при уменьшении размера модулей:

 apiVersion: v1
kind: ReplicationController
metadata:
 name: echoheaders
spec:
 replicas: 1
 template:
   metadata:
     labels:
       app: echoheaders
   spec:
     affinity:
       podAntiAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
         - labelSelector:
             matchExpressions:
             - key: app
               operator: In
               values:
               - echoheaders
           topologyKey: "kubernetes.io/hostname"
     containers:
     - name: echoheaders
       image: k8s.gcr.io/echoserver:1.4
       ports:
       - containerPort: 8080
     tolerations:
     - key: dedicated
       operator: Equal
       value: experimental
       effect: NoSchedule
  

Комментарии:

1. ReplicationController больше не рекомендуется . Вместо этого используйте развертывание, которое настраивает набор реплик для настройки репликации.

Ответ №3:

Я могу предложить два способа решения этой проблемы. Один из них заключается в ограничении количества модулей, планируемых на узле, а другой — в назначении модуля данному узлу при запросе всех ресурсов, доступных на узле.

1. Ограничение количества планируемых модулей на узел

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

введите описание изображения здесь

2. Назначение модуля определенному узлу и использование всех ресурсов

Другой вариант — установить номера запросов ресурсов таким образом, чтобы они соответствовали ресурсам узла, и назначить его данному узлу, используя nodeSelector и labels .

Ознакомьтесь с этой ссылкой, чтобы узнать, как назначить модули определенному узлу.