В мире оркестрации контейнеров Kubernetes стал широко распространенной платформой. Одной из его основных концепций является Pod, наименьшая развертываемая единица в Kubernetes. Модули могут содержать один или несколько контейнеров, и выбор между модулями с одним или несколькими контейнерами зависит от различных факторов. В этой статье мы рассмотрим различия между модулями с одним и несколькими контейнерами и предоставим примеры кода, иллюстрирующие различные сценарии развертывания.
- Модули с одним контейнером.
Модуль с одним контейнером содержит только один контейнер. Этот подход подходит для простых приложений или сценариев, в которых необходимо, чтобы один процесс выполнялся параллельно с основным контейнером приложения. Вот пример файла манифеста для модуля с одним контейнером:
apiVersion: v1
kind: Pod
metadata:
name: single-container-pod
spec:
containers:
- name: main-container
image: myapp:latest
ports:
- containerPort: 8080
В этом примере модуль состоит из одного контейнера с именем «main-container», в котором выполняется образ «myapp». Контейнер прослушивает порт 8080.
- Поды с несколькими контейнерами.
Поды с несколькими контейнерами позволяют запускать несколько контейнеров в одном модуле, используя одно и то же сетевое пространство имен и тома хранения. Этот подход подходит для сложных приложений, которым для расширения функциональности требуются дополнительные контейнеры, агрегаторы журналов или прокси-контейнеры. Вот пример файла манифеста для модуля с несколькими контейнерами:
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», а «сопутствующий-контейнер» запускает образ «сопутствующий». Оба контейнера используют одно и то же сетевое пространство имен и могут взаимодействовать друг с другом.
- Взаимодействие между контейнерами.
В модуле с несколькими контейнерами контейнеры могут взаимодействовать друг с другом, используя локальный хост или общие тома. Например, основной контейнер может взаимодействовать с дополнительным контейнером через localhost:
import requests
response = requests.get('http://localhost:8081')
- Общие тома.
Поды с несколькими контейнерами могут использовать общие тома, что позволяет совместно использовать данные между контейнерами. Вот пример определения общего тома в модуле с несколькими контейнерами:
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.