1. Обзор
Имея дело с контейнерными приложениями, мы могли бы захотеть узнать, какую роль в этом контексте играют Docker Compose и Kubernetes.
В этом руководстве мы обсудим некоторые из наиболее распространенных вариантов использования, чтобы увидеть разницу между ними.
2. Создание докеров
Docker Compose — это инструмент командной строки для запуска нескольких контейнеров Docker с определением шаблона YAML. Мы можем создавать контейнеры из существующих изображений или определенного контекста.
Мы можем добавить версию
формата файла компоновки и хотя бы одну службу
. По желанию мы можем добавить тома
и сети.
Кроме того, мы можем определить зависимости и переменные среды.
2.1. Шаблон создания Docker
Давайте создадим файл docker-compose.yml
для API, подключающегося к базе данных PostgreSQL:
version: '3.8'
services:
db:
image: postgres:latest
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- '5432:5432'
volumes:
- db:/var/lib/postgresql/data
networks:
- mynet
api:
container_name: my-api
build:
context: ./
image: my-api
depends_on:
- db
networks:
- mynet
ports:
- 8080:8080
environment:
DB_HOST: db
DB_PORT: 5432
DB_USER: postgres
DB_PASSWORD: postgres
DB_NAME: postgres
networks:
mynet:
driver: bridge
volumes:
db:
driver: local
Наконец, мы можем начать работать локально или в продакшене, запустив:
docker-compose up
2.2. Общие случаи использования Docker Compose
Обычно мы используем Docker Compose для создания среды инфраструктуры микросервисов, которая связывает различные сервисы по сети.
Кроме того, Docker Compose широко используется для создания и уничтожения изолированных сред тестирования для наших наборов тестов.
Более того, если нас интересует масштабируемость, мы можем взглянуть на Docker Swarm — проект, созданный Docker для работы на уровне оркестровки, как Kubernetes.
Однако, по сравнению с Kubernetes, Docker Swarm имеет ограниченные предложения.
3. Кубернет
С помощью Kubernetes (также называемого K8s) мы автоматизируем развертывание и управление приложениями в контейнерной и кластерной среде . Первоначальная работа Google над K8s прошла путь от открытого исходного кода до пожертвования Linux Foundation и, в конечном итоге, в качестве исходной технологии для создания Cloud Native Computing Foundation (CNCF) .
В эпоху контейнеров Kubernetes привлек настолько большое внимание, что стал самым популярным оркестратором распределенных систем.
Доступен полный API для описания спецификаций и состояния объектов Kubernetes. Он также позволяет интеграцию со сторонним программным обеспечением.
В Kubernetes различные компоненты являются частью кластера, состоящего из набора рабочих машин, называемых узлами.
Узлы запускают наши контейнерные приложения внутри
подов
. ``
Kubernetes — это управление артефактами, развернутыми в модулях
на виртуальных машинах или узлах
. Узлы и контейнеры, которые
они запускают, сгруппированы в кластер, и каждый контейнер имеет конечные точки, DNS, хранилище и масштабируемость.
Поды
— непостоянные ресурсы. Например, Deployment
может создавать и уничтожать их динамически. Обычно мы можем предоставлять приложения как службы
, чтобы они всегда были доступны в одной и той же конечной точке.
3.1. Шаблон Kubernetes
Kubernetes предоставляет декларативный или императивный подход, поэтому мы можем использовать шаблоны для создания, обновления, удаления или даже масштабирования объектов . В качестве примера давайте определим шаблон для Deployment
:
-- Postgres Database
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgresql
namespace: Database
spec:
selector:
matchLabels:
app: postgresql
replicas: 1
template:
metadata:
labels:
app: postgresql
spec:
containers:
- name: postgresql
image: postgresql:latest
ports:
- name: tcp
containerPort: 5432
env:
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_PASSWORD
value: postgres
- name: POSTGRES_DB
value: postgres
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgredb
volumes:
- name: postgredb
persistentVolumeClaim:
claimName: postgres-data
-- My Api
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-api
namespace: Api
spec:
selector:
matchLabels:
app: my-api
replicas: 1
template:
metadata:
labels:
app: my-api
spec:
containers:
- name: my-api
image: my-api:latest
ports:
- containerPort: 8080
name: "http"
volumeMounts:
- mountPath: "/app"
name: my-app-storage
env:
- name: POSTGRES_DB
value: postgres
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_PASSWORD
value: password
resources:
limits:
memory: 2Gi
cpu: "1"
volumes:
- name: my-app-storage
persistentVolumeClaim:
claimName: my-app-data
Затем мы можем использовать объекты по сети с помощью командной строки kubectl
.
3.2. Kubernetes и облачные провайдеры
Kubernetes — это не сама инфраструктура как код (IaC). Однако он интегрируется с контейнерными службами облачных провайдеров, например, ECS или EKS от Amazon, GKE от Google и OpenShift от RedHat.
Или мы можем использовать его, например, с такими инструментами, как Helm .
Мы часто видим Kubernetes в общедоступных облачных инфраструктурах. Однако мы можем настроить Minikube
или локальный кластер Kubeadm
.
Также одобренный CNCF, мы можем проверить K3s , облегченную версию K8s.
4. Различия между Kubernetes и Docker Compose
В то время как Docker Compose предназначен для создания и запуска одного или нескольких контейнеров, Kubernetes больше служит платформой для создания сети, в которой мы можем оркестровать контейнеры.
Kubernetes смог решить многие важные проблемы в управлении приложениями:
- Оптимизация ресурсов
- Самовосстановление контейнеров
- Время простоя при повторном развертывании приложений
- Автомасштабирование
Наконец, Kubernetes выводит несколько изолированных контейнеров на этап, на котором ресурсы всегда доступны с потенциально оптимальным распределением.
Однако когда дело доходит до разработки, Docker Compose может настроить все сервисные зависимости приложения, чтобы приступить к работе, например, с нашими автоматическими тестами. Таким образом, это мощный инструмент для местного развития.
5. Вывод
В этой статье мы увидели разницу между Docker Compose и Kubernetes. Docker Compose может помочь, когда нам нужно определить и запустить многоконтейнерные приложения Docker.
Kubernetes — это мощная, но сложная платформа для управления контейнерными приложениями в кластерной среде.