Как настроить развертывание Kubernetes Multi-Pod

Я хотел бы развернуть кластер приложений, управляя моим развертыванием через объект развертывания k8s. Документация меня очень смущает. В моей базовой компоновке есть следующие компоненты, которые масштабируются независимо:

  • Сервер API
  • Сервер пользовательских интерфейсов
  • Redis cache
  • Сервер задач Timer/Scheduled

Технически все 4 выше относятся к отдельным стручкам, которые масштабируются независимо.

Мои вопросы:

  • Нужно ли создавать файлы pod.yml, а затем как-то ссылаться на них в файле deployment.yml или может ли файл развертывания также вставлять определения pod?
  • Документация K8s, по-видимому, подразумевает, что часть spec Deployment эквивалентна определению одного элемента. Это верно? Что делать, если я хочу декларативно описать многопотоковые развертывания? Нужно ли мне несколько файлов deployment.yml?

Ответ 1

Ответ Pagids имеет большинство основ. Вы должны создать 4 Deployments для своего сценария. Каждое развертывание создаст ReplicaSet, который планирует и контролирует коллекцию PODs для Deployment.

Каждый Deployment, скорее всего, также потребует Service перед ним для доступа. Обычно я создаю один файл yaml, в котором есть Deployment и соответствующий Service. Вот пример для nginx.yaml, который я использую:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
  name: nginx
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    name: nginx
    targetPort: 80
    nodePort: 32756
  selector:
    app: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginxdeployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginxcontainer
        image: nginx:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80

Вот некоторая дополнительная информация для уточнения:

  • A POD не является масштабируемой единицей. A Deployment, который планирует PODs.
  • A Deployment предназначен для представления одной группы POD, выполняющей единую цель вместе.
  • У вас может быть много Deployments работать вместе в виртуальной сети кластера.
  • Для доступа к Deployment, который может состоять из множества PODs, запущенных на разных узлах, вам необходимо создать Сервис.
  • Развертывания предназначены для размещения служб без состояния. Если вам нужно сохранить состояние, вам нужно создать вместо него StatefulSet (например, для службы базы данных).

Ответ 2

Вы можете использовать ссылку API Deployment, и вы обнаружите, что поле spectemplate имеет тип PodTemplateSpec вместе с соответствующим комментарием ( Шаблон описывает контейнеры, которые будут созданы.) Он отвечает на ваши вопросы. Более подробное описание можно, конечно, найти в Руководство по развертыванию.

Чтобы ответить на ваши вопросы...

1) Pods управляется Deployment и их определение отдельно не имеет смысла, поскольку они создаются по требованию с помощью развертывания. Имейте в виду, что может быть больше реплик одного и того же типа.

2) Для каждого из приложений в вашем списке вам нужно будет определить один Deployment - что также имеет смысл, когда дело доходит до разницей реплик разницы и развертывания приложений.

3), вы не спросили об этом, но это связано с отдельными Deployments для каждого из ваших приложений также потребуется специальный Service чтобы другие могли получить к нему доступ.