Понимание подов с одним и несколькими контейнерами в Kubernetes: подробное руководство

В мире оркестрации контейнеров Kubernetes стал широко распространенной платформой. Одной из его основных концепций является Pod, наименьшая развертываемая единица в Kubernetes. Модули могут содержать один или несколько контейнеров, и выбор между модулями с одним или несколькими контейнерами зависит от различных факторов. В этой статье мы рассмотрим различия между модулями с одним и несколькими контейнерами и предоставим примеры кода, иллюстрирующие различные сценарии развертывания.

  1. Модули с одним контейнером.
    Модуль с одним контейнером содержит только один контейнер. Этот подход подходит для простых приложений или сценариев, в которых необходимо, чтобы один процесс выполнялся параллельно с основным контейнером приложения. Вот пример файла манифеста для модуля с одним контейнером:
apiVersion: v1
kind: Pod
metadata:
  name: single-container-pod
spec:
  containers:
    - name: main-container
      image: myapp:latest
      ports:
        - containerPort: 8080

В этом примере модуль состоит из одного контейнера с именем «main-container», в котором выполняется образ «myapp». Контейнер прослушивает порт 8080.

  1. Поды с несколькими контейнерами.
    Поды с несколькими контейнерами позволяют запускать несколько контейнеров в одном модуле, используя одно и то же сетевое пространство имен и тома хранения. Этот подход подходит для сложных приложений, которым для расширения функциональности требуются дополнительные контейнеры, агрегаторы журналов или прокси-контейнеры. Вот пример файла манифеста для модуля с несколькими контейнерами:
apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
    - name: main-container
      image: myapp:latest
      ports:
        - containerPort: 8080
    - name: sidecar-container
      image: sidecar:latest

В этом примере модуль состоит из двух контейнеров. «Основной-контейнер» запускает образ «myapp», а «сопутствующий-контейнер» запускает образ «сопутствующий». Оба контейнера используют одно и то же сетевое пространство имен и могут взаимодействовать друг с другом.

  1. Взаимодействие между контейнерами.
    В модуле с несколькими контейнерами контейнеры могут взаимодействовать друг с другом, используя локальный хост или общие тома. Например, основной контейнер может взаимодействовать с дополнительным контейнером через localhost:
import requests
response = requests.get('http://localhost:8081')
  1. Общие тома.
    Поды с несколькими контейнерами могут использовать общие тома, что позволяет совместно использовать данные между контейнерами. Вот пример определения общего тома в модуле с несколькими контейнерами:
apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  volumes:
    - name: shared-data
      emptyDir: {}
  containers:
    - name: main-container
      image: myapp:latest
      volumeMounts:
        - name: shared-data
          mountPath: /data
    - name: sidecar-container
      image: sidecar:latest
      volumeMounts:
        - name: shared-data
          mountPath: /data

В этом примере как основной, так и дополнительный контейнеры могут читать/записывать данные в общий том, смонтированный в «/data».

Выбор между модулями с одним или несколькими контейнерами зависит от сложности приложения и конкретных требований. Модули с одним контейнером подходят для простых приложений, а модули с несколькими контейнерами обеспечивают большую гибкость и расширенную функциональность за счет дополнительных контейнеров, агрегаторов журналов и общих томов. Понимание различий между этими подходами поможет вам эффективно проектировать и развертывать приложения в Kubernetes.