Развернуть наименьшую возможную, совместно расположенную единицу рабочей нагрузки.
→Определите ресурс `Pod`. Поды могут содержать один или несколько контейнеров, которые совместно используют сеть и хранилище.
Почему: Pod является атомарной единицей планирования в Kubernetes. Контейнеры всегда развертываются внутри Pod.
Источник↗
Обеспечьте, чтобы состояние кластера непрерывно соответствовало желаемому состоянию.
→Положитесь на `kube-controller-manager`. Он запускает циклы управления, которые отслеживают ресурсы (например, ReplicaSet, Deployment) и устраняют различия.
Почему: Это основной декларативный, самовосстанавливающийся механизм. Если Pod, управляемый ReplicaSet, выходит из строя, контроллер автоматически заменяет его.
Автоматически назначать вновь созданные Pods наиболее подходящему рабочему узлу.
→Положитесь на `kube-scheduler`. Он фильтрует узлы на основе требований Pod (например, запросов ресурсов) и оценивает их для выбора наиболее подходящего.
Почему: Планировщик принимает решения о размещении на основе политики, близости и доступности, абстрагируя выбор узла от пользователя.
Обеспечьте, чтобы контейнеры, указанные в Pods, работали и были здоровы на данном рабочем узле.
→Агент `kubelet` работает на каждом узле, взаимодействует с API-сервером и управляет жизненным циклом контейнера (запуск, остановка, проверки работоспособности) через среду выполнения контейнера.
Почему: Kubelet является связующим звеном между плоскостью управления и рабочим узлом; он выполняет спецификации Pod.
Надежно сохранять все состояние и конфигурацию кластера Kubernetes.
→Используйте `etcd`, согласованное и высокодоступное хранилище "ключ-значение". Оно служит единственным источником достоверной информации для кластера.
Почему: Все объекты кластера (Pods, Services и т. д.) хранятся в etcd. Только API-сервер напрямую взаимодействует с ним.
Реализовать сетевые правила на каждом узле для обеспечения связи через Kubernetes Services.
→Компонент `kube-proxy` на каждом узле поддерживает сетевые правила (например, iptables, IPVS), которые перенаправляют трафик с IP Service на соответствующие backend Pods.
Почему: Kube-proxy — это деталь реализации абстракции Service, отвечающая за балансировку нагрузки и маршрутизацию.
Логически разделить один кластер Kubernetes для нескольких команд, проектов или сред.
→Создавайте ресурсы `Namespace`. Namespaces предоставляют область действия для имен и способ прикрепления авторизации и политик (например, ResourceQuota).
Почему: Namespaces обеспечивают многопользовательскую работу и организацию ресурсов без накладных расходов на несколько кластеров.
Предоставить стабильную сетевую конечную точку (IP и DNS) для набора эфемерных Pods.
→Определите ресурс `Service`, который нацелен на набор Pods с использованием селектора меток.
Почему: Pods эфемерны, и их IP-адреса меняются. Service предоставляет надежную абстракцию, которая балансирует нагрузку трафика на правильные Pods.
Источник↗
Выставить приложение, работающее в Pods, в различные сетевые области.
→Выберите `type` Service: `ClusterIP` (только внутренний, по умолчанию), `NodePort` (выставляет на каждом узле IP:порт) или `LoadBalancer` (предоставляет облачный балансировщик нагрузки).
Почему: Тип Service определяет доступность приложения, от чисто внутреннего до полностью внешнего.
Включить прямое сетевое обнаружение отдельных Pods, минуя прокси Service.
→Создайте `Service` с `clusterIP: None`. Это создает записи DNS A для каждого Pod, позволяя клиентам напрямую подключаться к Pods.
Почему: Необходимо для stateful-приложений, таких как базы данных (часто с StatefulSets), где требуется одноранговая связь или стабильная идентификация Pod.
Организовать и выбрать подмножество объектов Kubernetes.
→Прикрепите пары "ключ-значение" `labels` к объектам (например, `app: my-api`). Используйте `label selectors` в других объектах (например, Services, Deployments) для их выбора.
Почему: Метки являются основным механизмом группировки в Kubernetes, обеспечивая слабую связанность между ресурсами.
Отделить конфигурацию приложения от образа контейнера.
→Храните нечувствительные данные конфигурации в `ConfigMap`. Подключайте его как том или внедряйте ключи как переменные среды в Pods.
Почему: Это позволяет управлять конфигурацией независимо от кода приложения, следуя принципам The Twelve-Factor App.
Хранить конфиденциальные данные, такие как пароли, токены или ключи API, для использования приложением.
→Используйте объект `Secret`. Подключайте как том или внедряйте как переменную среды.
Почему: Secrets предназначены специально для конфиденциальных данных и обрабатываются более безопасно, чем ConfigMaps (например, по умолчанию не отображаются в `kubectl describe`, могут быть зашифрованы в состоянии покоя).
Предоставить stateful-приложениям хранилище, которое сохраняется после перезапусков Pod.
→Pod создает `PersistentVolumeClaim` (PVC) для запроса хранилища. Администратор предоставляет `PersistentVolume` (PV), который удовлетворяет запрос.
Почему: Это разделяет потребление хранилища (PVC) от предоставления хранилища (PV), что позволяет создавать переносимые определения рабочих нагрузок.
Управлять выделением CPU и памяти для контейнеров.
→Установите `resources.requests` для гарантированных ресурсов (используются для планирования) и `resources.limits` для максимально допустимого использования (применяется во время выполнения).
Почему: Requests гарантируют, что Pods имеют достаточно ресурсов для работы; Limits предотвращают потребление Pods слишком большого количества ресурсов и влияние на другие рабочие нагрузки.
Установить совокупные ограничения ресурсов для пространства имен.
→Создайте объект `ResourceQuota` для ограничения общего количества CPU, памяти или числа объектов (Pods, Services), которые могут быть созданы в пространстве имен.
Почему: ResourceQuota необходимы для многопользовательских сред для обеспечения справедливого распределения ресурсов и предотвращения чрезмерного потребления.
Управлять ресурсами Kubernetes с помощью версионированных файлов конфигурации.
→Используйте `kubectl apply -f <filename.yaml>`. Эта команда создает или обновляет ресурсы на основе содержимого файла.
Почему: `apply` является декларативным, что делает его идеальным для GitOps и CI/CD. Он отслеживает изменения и выполняет трехстороннее слияние, что безопаснее, чем императивные `create` или `replace`.
Диагностировать, почему Pod работает некорректно (например, застрял в Pending, ContainerCreating или CrashLoopBackOff).
→Используйте `kubectl describe pod <pod-name>`. Проверьте раздел `Events` внизу на наличие подробных сообщений от планировщика, kubelet или контроллеров.
Почему: `describe` предоставляет хронологический журнал событий, который является основным инструментом для отладки проблем жизненного цикла ресурсов.
Предоставить сетевую функциональность для контейнеров, обеспечивая связь между Pods по всему кластеру.
→Используйте плагин Container Network Interface (CNI) (например, Calico, Flannel, Cilium). Kubelet на каждом узле использует плагин CNI для настройки сети для каждого Pod.
Почему: CNI предоставляет стандартный интерфейс, позволяя интегрировать Kubernetes с различными сетевыми решениями без изменения основных компонентов.
Контролировать доступ к ресурсам Kubernetes API для пользователей и приложений.
→Используйте управление доступом на основе ролей (RBAC). Определите `Role` (для пространства имен) или `ClusterRole` (для всего кластера) с разрешениями и привяжите его к субъекту (User, Group, ServiceAccount) с помощью `RoleBinding` или `ClusterRoleBinding`.
Почему: RBAC является стандартом для защиты Kubernetes, обеспечивая принцип наименьших привилегий для всех взаимодействий с API.
Источник↗