Контрольная точка контейнеров в Kubernetes с пользовательским API

Проблема

Вызов

Организации, работающие с контейнеризированными приложениями в Kubernetes, часто должны захватывать и сохранять состояние запущенных контейнеров для:

  • Восстановления после катастрофы
  • Миграции приложений
  • Отладки/поиска неисправностей
  • Сохранения состояния
  • Воспроизведения среды

Однако нет прямого автоматизированного способа:

  1. Создать контрольные точки контейнеров по требованию
  2. Сохранить эти контрольные точки в стандартизированном формате
  3. Сделать их легко доступными на разных кластерах
  4. Запустить создание контрольной точки через стандартный интерфейс

Текущие ограничения

  • Создание контрольной точки вручную требует прямого доступа к кластеру
  • Нет стандартизированного формата хранения контрольных точек
  • Ограниченная интеграция с контейнерными реестрами
  • Отсутствие программного доступа для автоматизации
  • Сложная координация между контейнером и системами хранения

Решение

Сервис-сопровождающее приложение Kubernetes, которое:

  1. Предоставляет функциональность контрольных точек через REST API
  2. Автоматически преобразует контрольные точки в образы, совместимые с OCI
  3. Хранит изображения в ECR для удобного распространения
  4. Интегрируется с существующей инфраструктурой Kubernetes
  5. Предоставляет стандартизированный интерфейс для автоматизации

Это решает основные проблемы:

  • Автоматизация процесса создания контрольной точки
  • Стандартизация хранения контрольных точек
  • Сделать контрольные точки переносимыми
  • Обеспечение программного доступа
  • Упрощение интеграции с существующими рабочими процессами

Целевая аудитория:

  • Команды DevOps
  • Инженеры платформы
  • Разработчики приложений
  • Инженеры по надежности сайтов (SRE)

Форенсическая контрольная точка контейнера основана на Checkpoint/Restore In Userspace (CRIU) и позволяет создавать состояния копии работающего контейнера, не уведомляя контейнер о том, что он подвергается контрольной точке. Копия контейнера может быть проанализирована и восстановлена в песочнице несколько раз без ведома оригинального контейнера. Форенсическая контрольная точка контейнера была введена как альфа-функция в Kubernetes v1.25.

Эта статья поможет вам развернуть код на Golang, который можно использовать для создания контрольной точки контейнера с помощью API.

Код принимает идентификатор пода, извлекает идентификатор контейнера из containerd в качестве входных данных, а затем использует команду ctr для создания контрольной точки конкретного контейнера в пространстве имен k8s.io containerd:

Предварительные условия

  • Кластер Kubernetes
  • Установите инструмент ctr commandline. Если вы можете выполнять команды ctr на kubelet или рабочем узле; если нет, установите или настройте AMI, чтобы содержать ctr.
  • kubectl настроен для взаимодействия с вашим кластером
  • Docker установлен локально
  • Доступ к реестру контейнеров (например, Docker Hub, ECR)
  • Helm (для установки контроллера входа Nginx)

Шаг 0: Код для создания контрольной точки контейнера с использованием GO

Создайте файл с именем checkpoint_container.go со следующим содержимым:

Go

 

Шаг 1: Инициализация модуля go

Shell

 

Измените файл go.mod:

Go

 

Выполните следующую команду:

Shell

 

Шаг 2: Создание и публикация образа Docker

Создайте Dockerfile в том же каталоге:

Dockerfile

 

Этот Dockerfile выполняет следующее:

  1. Использует golang:1.20 в качестве этапа сборки для компиляции вашего Go приложения.
  2. Использует amazonlinux:2 в качестве окончательного базового образа.
  3. Устанавливает AWS CLI, Docker (в который входит containerd), и skopeo с помощью yum и amazon-linux-extras.
  4. Копирует скомпилированный бинарный файл Go из этапа сборки.
Shell

 

Замените <your-docker-repo> на ваш фактический репозиторий Docker.

Шаг 3: Примените ресурсы RBAC

Создайте файл с именем rbac.yaml:

YAML

 

Примените ресурсы RBAC:

Shell

 

Шаг 4: Создание развертывания Kubernetes

Создайте файл с именем deployment.yaml:

YAML

 

Примените развертывание:

Shell

 

В deployment.yaml обновите следующее:

YAML

Шаг 5: Служба Kubernetes

Создайте файл с именем service.yaml:

YAML

 

Примените службу:

Shell

 

Шаг 6: Установка контроллера Ngnix Ingress

Shell

 

Шаг 7: Создание ресурса Ingress

Создайте файл с именем ingress.yaml:

YAML

 

Примените Ingress:

Shell

 

Шаг 8: Тестирование API

Shell

 

Shell

 

Замените <EXTERNAL-IP> на фактический внешний IP.

Дополнительные соображения

  1. Безопасность.
    • Реализуйте HTTPS, настроив TLS сертификаты
    • Добавьте аутентификацию к API
  2. Мониторинг. Настройте регистрацию и мониторинг для API и процесса контрольных точек.
  3. Управление ресурсами. Настройте запросы ресурсов и ограничения для контейнера sidecar.
  4. Обработка ошибок. Реализуйте надежную обработку ошибок в приложении Go.
  5. Тестирование. Тщательно протестируйте настройку в среде, не предназначенной для производства, перед развертыванием в производственной среде.
  6. Документация. Поддерживайте четкую документацию о том, как использовать API контрольных точек.

Заключение

Эта настройка разворачивает контейнер Checkpoint в качестве побочного контейнера в Kubernetes и предоставляет его функционал через API, к которому можно получить доступ извне кластера. Он предоставляет гибкое решение для управления контейнерными точками контроля в среде Kubernetes.

AWS/EKS Specific

Шаг 7: Установите контроллер балансировщика нагрузки AWS

Вместо использования контроллера входа Nginx, мы будем использовать контроллер балансировщика нагрузки AWS. Этот контроллер будет создавать и управлять ALB для наших ресурсов входа.

1. Добавьте репозиторий EKS в Helm:

Shell

 

2. Установите контроллер балансировщика нагрузки AWS:

Shell

 

Замените <имя-вашего-кластера> на имя вашего кластера EKS.

Примечание: Убедитесь, что у вас есть необходимые разрешения IAM настроены для контроллера балансировщика нагрузки AWS. Подробную политику IAM можно найти в документации AWS.

Шаг 8: Создайте ресурс Ingress

Создайте файл с именем ingress.yaml:

YAML

 

Примените Ingress:

Shell

 

Шаг 9: Проверьте работу API

1. Получите имя DNS ALB:

Shell

 

Найдите поле ADDRESS, которое будет именем DNS ALB.

2. Отправьте тестовый запрос:

Shell

 

Замените <ALB-DNS-NAME> на фактическое имя DNS вашего ALB из шага 1.

Дополнительные соображения для AWS ALB

1. Группы безопасности. ALB будет автоматически создана. Убедитесь, что разрешен входящий трафик на порт 80 (и 443, если вы настроили HTTPS).

2. SSL/TLS: Чтобы включить HTTPS, вы можете добавить следующие аннотации к вашему Ingress:

YAML

 

3. Журналы доступа. Включите журналы доступа для вашего ALB, добавив следующее:

YAML

 

4. Интеграция с WAF. Если вы хотите использовать AWS WAF с вашим ALB, вы можете добавить:

YAML

 

5. Аутентификация. Вы можете настроить аутентификацию, используя Amazon Cognito или OIDC, используя соответствующие аннотации ALB Ingress Controller.

Эти изменения настроят ваш Ingress, используя балансировщик нагрузки приложений AWS вместо Nginx. Контроллер входа ALB автоматически предоставит и настроит ALB на основе ресурса Ingress.

Заключение

Не забудьте убедиться, что ваш кластер EKS имеет необходимые разрешения IAM для создания и управления ALB. Обычно это включает создание политики IAM и учетной записи службы с соответствующими разрешениями.

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

Source:
https://dzone.com/articles/container-checkpointing-kubernetes-api