логотип PurpleSchool
логотип PurpleSchool

Настройка базовых параметров Kubernetes

Автор

Олег Марков

Введение

Kubernetes сегодня — это стандарт де-факто для управления контейнеризированными приложениями. Однако эффективная работа кластера невозможна без правильной настройки базовых параметров. Здесь я расскажу, как подходит к этой задаче, на какие моменты стоит обратить внимание, и как добиться безопасности и стабильности вашей инфраструктуры с первого шага. Мы подробно разберём ключевые параметры, способы их изменения и рекомендации по их использованию.

Родоначальные понятия: Как устроен Kubernetes

Прежде чем настраивать кластер, полезно понять, что из себя представляет Kubernetes. Вся система строится на так называемых ресурсах — это сущности, описывающие приложения, вычислительные ресурсы кластера, сетевые политики и многое другое. Самыми базовыми объектами выступают узлы (nodes), на которых запускаются контейнеры, и управляющие компоненты Control Plane.

Control Plane и рабочие узлы (worker nodes)

  • Control Plane — принимает решения о расписании контейнеров, хранит состояние кластера, контролирует коммуникацию.
  • Worker nodes — именно здесь ваши контейнеры запускаются и обслуживаются.

Общение между этими компонентами осуществляется через API сервер, а вся конфигурация хранится в etcd.

Теперь, когда есть базовое понимание, давайте перейдём к первичным настройкам после установки кластера.

Базовые параметры и их настройка

Настройка kubelet'а — сердца node

kubelet — это агент, который устанавливается на каждом узле. Он следит за тем, чтобы контейнеры соответствовали желаемому состоянию, описанному в параметрах Kubernetes.

Пример настройки флага max-pods

Этот параметр регулирует максимальное количество Pod'ов на одном worker-узле. Вот как можно изменить его в файле запуска kubelet:

# Добавьте параметр max-pods при запуске kubelet
--max-pods=110

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

Изменение значения на уже работающем узле (пример для systemd)

# Откройте файл конфигурации kubelet
sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# Найдите строку с Environment="KUBELET_CONFIG_ARGS=..." и добавьте/отредактируйте
--max-pods=80 \
# Перезапустите сервис
sudo systemctl daemon-reload
sudo systemctl restart kubelet

Настройка сети: параметры kubernetes networking

Kubernetes поддерживает разные модели сетей. Важнейшие параметры — это CIDR под сеть подов и услуг.

Пример задания сети для подов и сервисов

Обычно эти параметры передаются при инициализации кластера через kubeadm:

# Пример инициализации кластера с указанием сетевых диапазонов
kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --service-cidr=10.96.0.0/12

Комментарий:
CIDR-диапазоны больше менять нельзя, когда кластер уже создан. Они определяют, где будут размещаться IP подов и сервисов, и должны совпадать с поддерживаемыми вашими сетевыми плагинами (например, Flannel, Calico).

API Server: важные параметры и доступ

Kube-apiserver — центральное место общения между пользователями, автоматикой и компонентами кластера. Через его параметры можно регулировать многое: от безопасности до лимитов обращения.

Пример задания лимита на входящий трафик

--max-requests-inflight=400
--max-mutating-requests-inflight=200

Комментарий:
Эти параметры полезны, чтобы защитить кластер от резких всплесков нагрузки. Значения чаще всего подбирают опытным путем, чтобы избежать перегрузки Control Plane.

Включение RBAC-аутентификации

RBAC — это система контроля доступа на основе ролей.

# Включаем RBAC как флаг apiserver
--authorization-mode=Node,RBAC

Комментарий:
Без этой настройки любые пользователи с доступом к API смогут выполнять опасные действия!

Настройка resource limits и requests

Вы должны управлять ресурсами, выделяемыми подам. Это помогает предотвратить «захват» ресурсов одним контейнером.

Пример описания в манифесте (YAML)

apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: demo
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

Комментарий:
requests — это минимум, который будет выделен, а limits — максимум, который сможет занять контейнер. Если контейнер превысит лимит по памяти, его остановят OOM killer-ом.

Подключение кластера к внешнему хранилищу (Persistent Volumes)

Kubernetes позволяет управлять хранилищем с помощью Persistent Volume (PV) и Persistent Volume Claim (PVC).

Пример создания PV и PVC

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-example
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-example
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Комментарий:
PV описывает реальное хранилище, PVC — запрос от пода. Как только PVC совпадает с PV, он автоматически монтируется в нужный под.

Настройка логирования и аудит Kubernetes

Без централизованного логирования трудно поддерживать безопасность и отлаживать кластер.

Пример настройки логирования приложений

В Kubernetes принято выводить логи в stdout/stderr контейнеров, а затем собирать их через специализированные решения (например, Fluentd, Loki, ELK).

# В pod-контейнере ваше приложение должно логировать в стандартный вывод
command: ["/bin/sh"]
args: ["-c", "while true; do echo $(date); sleep 5; done"]

Включение аудита событий API

Можно включить аудит событий — эти логи помогают анализировать кто и что делает с кластером.

--audit-log-path=/var/log/kubernetes/audit.log
--audit-log-maxage=30
--audit-log-maxbackup=10
--audit-log-maxsize=100

Комментарий:
Далее к файлам аудита можно подключить сборщики логов.

Конфигурирование kubeconfig

Ваш доступ к кластеру осуществляется через kubeconfig — файл, используемый, например, kubectl.

Получение и настройка kubeconfig

# После инициализации кластера получите kubeconfig
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Комментарий:
Теперь kubectl будет знать, как подключаться к вашему кластеру.

Настройка Namespace и изоляция

Namespaces — инструмент для изоляции ресурсов внутри кластера, по сути, виртуальные окружения.

Пример создания namespace

kubectl create namespace dev-environment

Использование namespace

kubectl run nginx --image=nginx --namespace=dev-environment

Комментарий:
Таким способом удобно разделять ресурсы и доступы по командам/продуктам.

Установка сетевого плагина

Большинство Kubernetes-кластеров требует отдельного сетевого плагина для корректной работы межподовой сетевой коммуникации.

Пример установки Flannel

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Настройка autoscaling базовых параметров

Kubernetes поддерживает автоскейлинг подов и узлов.

Пример Horizontal Pod Autoscaler

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-demo
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: demo-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

Комментарий:
Это автоматически масштабирует ваш deployment при увеличении нагрузки по CPU.

Заключение

Настройка базовых параметров Kubernetes — это обязательный этап для продуктивной и стабильной работы ваших приложений. Мы рассмотрели ключевые настройки, которые необходимо задавать в самом начале: лимиты ресурсов, сетевые параметры, параметры безопасности и аутентификации, работу с логами, хранилищем, namespace и масштабированием. Такой подход обеспечивает вам управляемость, безопасность и надежность инфраструктуры, экономит ресурсы и время в дальнейшем.

Частозадаваемые технические вопросы по теме статьи и ответы на них

Как изменить сетевой диапазон для подов после инициализации кластера?

Изменение диапазона сети после инициализации невозможно стандартными средствами — рекомендуется пересоздать весь кластер с правильным параметром --pod-network-cidr при kubeadm init. Перед этим сохраните манифесты, чтобы можно было развернуть их повторно.

Как включить автозапуск подов после перезагрузки worker-узлов?

Поды автоматически восстанавливаются после рестарта, если используются реплика-сеты или deployment. Для статических подов убедитесь, что файлы с их описаниями находятся в /etc/kubernetes/manifests/.

Как добавить новый worker node в существующий кластер?

Сначала получите команду для join с master узла (kubeadm token create --print-join-command). Выполните её на новом worker. Проверьте, что firewall и сеть настроены — порты 6443, 10250 и канал overlay-плагина должны быть открыты.

Что делать, если pod не стартует из-за ошибки OOMKilled?

Повысьте лимиты памяти для контейнера в секции resources.limits.memory вашего pod/deployment YAML. Оцените, есть ли в кластере свободная память, или добавьте node или уменьшите требования других подов.

Как защитить доступ к API серверу Kubernetes извне?

Для защиты отключите проброс портов master наружу или используйте только контролируемые ingress-настройки, включите RBAC, настройте firewall, используйте kubectl proxy, а для удаленного доступа всегда применяйте kubeconfig с минимальными правами и туннели VPN/TLS.

Стрелочка влевоУстановка и настройка Kubernetes Dashboard

Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!

Kubernetes — часть карты развития DevOps

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Kubernetes

Terraform и Kubernetes инфраструктура как кодНастройка и использование Runners в KubernetesНастройка и деплой PostgreSQL в KubernetesСравнение и интеграция Openshift и KubernetesПримеры интеграции GitHub Actions и KubernetesDeploy приложений в Kubernetes - пошаговое руководство для начинающих и не толькоКак настроить CD в KubernetesИнтеграция Ansible в KubernetesИнтеграция CI/CD с Jenkins и KubernetesИнтеграция Kubernetes с GitLab - Автоматизация CI CD в облачной инфраструктуреГайд по DevOps инструментам в KubernetesОсобенности платформы Deckhouse в Kubernetes
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Kubernetes и Helm

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Микросервисы

Антон Ларичев
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий