Pod & containers
Pod (под)
Pod это уровень абстракции. Он включает:
- совместное использование ресурсов
- управление планировщиком
- тестирование на рабочеспособность
- политики перезапуска
- политики безопасности
- контроль завершения
- тома
Он также абстрагирует детали рабочей нагрузки (контейнер, виртуальная машина, Wasm) но для некоторых могут потребоваться дополнительные модули (например KubeVirt для виртуалок).
Под смертен (после завершения или ошибки он удаляется без возможности перезапуска) и постоянны (для изменения нужно удалить старый и создать новый).
Настройка ноды для пода
NodeSelectors - список меток нодов. Простейший случай.
Affinity and anti-affinity - продвинутый способ Позволяет
attract
• Anti-affinity rules repel
• Hard rules must be obeyed
• Soft rules are only suggestions
Topology spread constraints - ограничения на топологию
Resource requests and resource limits
Теория процесса запуска pod
- Создать YAML манифест
- Отправить манифест на API сервер
- Запрос будет аутентифицирован и авторизован
- Спецификация будет проверена
- Планировщик отфильтрует ноды на основе ограничений
- Под будет привязан к удовлетворяющей требованиям ноде
- Сервис kubelet на ноде получит задание
- Сервис kubelet скачает спецификацию и сформирует задачу для исполнения
- Сервис kubelet мониторит статус поды и в случае изменения направляет информацию на планировщик
Запуск пода
Есть два варианта: непосредственно через манифест на ноде или через контроллер. Первый вариант быстрый но без большинства возможностей (статический под, типа docker container). Второй вариант используется обычно.
Кластер создает сеть подов и автоматически подключает все поды к ней. Это одноуровневая L2 overlay сеть
Статусы пода
Pending под еще не создан, поиск ноды для запуска
Running нода найдена, запуск произведен
Политики перезапуска настраиваются для контейнера. Поэтому пока идет перезапуск контейнера, считается что под еще работает. При обновлении под удаляется и создается новый. Это необходимо учитывать при разработке архитектуры.
Структура YAML файла
Верхний уровень
Параметр | Описание |
Kind |
Тип определяемого объекта. Pod: обычный под Deploymen: для деплоймент подов |
apiVersion |
Версия API |
metadata |
Метаданные |
spec |
Спецификация контейнеров |
Metadata: метаданные пода
Параметр | Описание |
name |
Имя пода |
labels |
Метки пода |
Spec: containers описание параметров контейнера, внутри для каждого контейнера - name: имя_контейнера
Параметр | Описание |
image |
Образ |
ports |
Порты |
resources |
ограничения на ресурсы |
Пример 1.
kind: Pod
apiVersion: v1
metadata:
name: hello-pod
labels:
zone: prod
version: v1
spec:
containers:
- name: hello-ctr
image: nigelpoulton/k8sbook:1.0
ports:
- containerPort: 8080
resources:
limits:
memory: 128Mi
cpu: 0.5
Основные команды
Команда | Доп. пар. | Описание |
kubectl explain pods --recursive | Вывод всех параметров, доступных для конфигурирования Pod | |
kubectl get pods | список контейнеров |
Container (контейнер)
Паттерны мультиконтейнеров
Init контейнеры - специальный тип контейнеров, для которых K8s гарантирует единственный запуск и завершение, перед остальными контейнерами. Пример: есть приложение и внешнее API с которым обязательно должно быть взаимодействие при старте. Вместо нагрузки на основную логику, можно процесс проверки вывести в init контейнер.
Slidecar контейнеры - выполняют периферийные задачи. Пока что бета.