Современный цифровой ландшафт характеризуется стремительным ростом количества приложений, сервисов и облачных услуг, требующих эффективного использования ресурсов. С увеличением вычислительных мощностей и необходимостью их оптимизации возникла потребность в инструментах, позволяющих:
– Развертывать множество приложений на одном оборудовании.
– Управлять ресурсами (CPU, RAM, хранилище) с минимальными издержками.
– Обеспечивать изоляцию и безопасность рабочих нагрузок.
Первым шагом к решению этих задач стали гипервизоры, которые позволили запускать изолированные виртуальные машины. Однако с развитием контейнеризации появилась потребность в более гибких и легковесных решениях. Именно для этого была создана платформа Kubernetes.
Определение
Kubernetes (K8s) — это открытая платформа для оркестрации контейнеризированных приложений. Её ключевые функции:
– Автоматизация развертывания, масштабирования и управления приложениями.
– Оптимизация использования ресурсов кластера.
– Обеспечение отказоустойчивости и самовосстановления.
Изначально разработанная Google на основе внутренней системы Borg, в 2014 году Kubernetes стала проектом Cloud Native Computing Foundation (CNCF). Сегодня это стандарт для управления распределенными системами в гибридных и мультиоблачных средах.
Почему Kubernetes, а не гипервизоры?
В отличие от гипервизоров, которые работают с виртуальными машинами, Kubernetes оперирует контейнерами — легковесными, быстро запускаемыми процессами с общей ОС. Это обеспечивает:
– Более высокую плотность размещения рабочих нагрузок.
– Минимизацию накладных расходов.
– Портативность приложений между средами.
Предназначение
Основное предназначение Kubernetes — автоматизация развертывания, масштабирования и управления контейнеризированными приложениями, включая самовосстановление, балансировку нагрузки, работу с хранилищами, безопасность и поддержку гибридных сред. Он обеспечивает отказоустойчивость, оптимизацию ресурсов и единое управление приложениями в облаках или on-premise-инфраструктуре.
Что позволяет решать K8s сразу несколько проблем:
1. Устраняет хрупкость контейнеров, то есть следит за их восстановлением
2. Позволяет автоматизировать ручное масштабирование, и сделать добавлять ресурсы без остановки сервисов
3. Помогает уменьшить и автоматизировать сложность сетевых настроек
4. Помогает эффективнее использовать ресурсы, без простоев.
Основные понятия
1. Deployment — объект для управления жизненным циклом Pod’ов: обеспечивает развертывание, масштабирование и обновление приложений.
2. Pod — минимальная единица Kubernetes, запускающая один или несколько контейнеров с общими сетевыми/хранимыми ресурсами.
3. Service — абстракция, предоставляющая стабильный доступ к Pod’ам через балансировку нагрузки и DNS.
4. ConfigMap и Secret — хранят конфигурации (ConfigMap) и секретные данные (Secret) для безопасного использования в приложениях.
5. Volume — предоставляет постоянное хранилище данных для Pod’ов, сохраняющееся после их перезапуска.
6. Namespace — логическое разделение кластера на изолированные среды (например, dev/prod) для управления доступом и ресурсами.
Архитектура
Архитектура K8s делится на две части:
1. Control Plane (Управляющая плоскость) – предназначена для управления кластером
2. Worker Nodes (Рабочие ноды) – предназначена для выполнения рабочих задач
Требования для развертывания K8s
Для развертывания полноценного k8s необходимо следующее:
1. Развертывание минимум одного мастер-узла (control plane) и произвольного количества рабочих узлов (worker nodes)
2. IP-адрес для каждого узла
3. Минимальное требование к железу 2 vCPU ядра и два 2 GBi
4. Связь между двумя нодами
Установка k8s
1. Обновление системы и установка зависимостей – для устранения уязвимости и установить пакеты (apt-transport-https, gnupg2), необходимые для работы с репозиториями Kubernetes и CRI-O.
2. Отключение swap-памяти – для предотвращения конфликта управления памятью в Kubernetes. Swap может вызывать ошибки OOM Killer и снижать производительность. Путем выполнения следующей команды:
sudo rm /swap.img # Удаление swap-файла
sed -i '/swap/d' /etc/fstab # Закомментировать строку с swap в /etc/fstab
3. Включение модулей ядра br_netfilter и overlay – br_netfilter — для сетевой фильтрации и работы CNI-плагинов и overlay — для поддержки overlay-файловых систем (требуется для хранения данных контейнеров). Путем выполнения следующей команды.
echo "br_netfilter" >> /etc/modules
echo "overlay" >> /etc/modules
4. Настройка IP-пересылки – для разрешения маршрутизации сетевого трафика между подами и узлами. Путем выполнения следующей команды:
5. Установка Kubelet, kubeadm, kubectl – так как kubelet — агент для запуска Pods на узлах, kubeadm — инструмент для инициализации кластера, kubectl — CLI для управления кластером. Путем добавления репозитория Kubernetes и установка пакетов:
apt-mark hold kubelet kubeadm kubectl # Запрет автообновлений
6. Установка CRI-O (контейнерной среды выполнения) – для замена Docker. CRI-O — легковесная среда, совместимая с Kubernetes CRI (Container Runtime Interface). Путем выполнения следующих команд:
echo "deb https://download.opensuse.org/.../ /" > /etc/apt/sources.list.d/cri-o.list
apt-get update
apt-get install -y cri-o cri-o-runc
systemctl enable crio && systemctl start crio
7. Инициализация кластера через kubeadm – для развертывания Control Plane (API Server, etcd, Scheduler, Controller Manager). Путем выполнения следующей команды, где –pod-network-cidr задает диапазон IP-адресов для сети Pods.
8. Добавление рабочего узла (worker) – для расширения кластера для запуска приложений. Путем использования токена из вывода kubeadm init:
kubeadm join :6443 --token --discovery-token-ca-cert-hash
9. Настройка доступа через kubectl – применяется для управление кластером с локальной машины
Выполним это путем копирования конфигурационного файла:
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
Управление k8s
Основные команды kubectl
Работа с ресурсами
Просмотр состояния:
kubectl get nodes # Список узлов
kubectl get deployments # Список Deployments
kubectl describe pod # Детали Pod
Создание/обновление:
kubectl create deployment nginx --image=nginx:1.25 # Создать Deployment
Масштабирование:
Обновление и откат:
kubectl rollout undo deployment/nginx # Откатить изменения
Удаление:
Отладка
Логи контейнеров:
kubectl logs -c # Логи конкретного контейнера
Вход в контейнер:
Мониторинг ресурсов:
kubectl top pods # Использование CPU/RAM Pods
Управление конфигурацией и секретами
ConfigMap
Использование для хранения конфигураций (настройки среды, файлы).
– Пример:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.env: |
LOG_LEVEL=INFO
DB_HOST=postgres
Secret
Используется хранение чувствительных данных (пароли, TLS-сертификаты).
– Пример:
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
password: dGVzdC1wYXNzd29yZA== # base64-encoded
Использование в Pods
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
Работа с хранилищами
Persistent Volumes (PV) и Persistent Volume Claims (PVC)
– PV: Физический ресурс хранения (например, облачный диск).
– PVC: Запрос на выделение хранилища из PV.
– Пример PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Использование в Pods
volumes:
- name: data-storage
persistentVolumeClaim:
claimName: data-pvc
containers:
- name: app
volumeMounts:
- mountPath: "/data"
name: data-storage
Безопасность
RBAC (Role-Based Access Control
Для управления правами доступа пользователей и сервисов.
– Пример роли:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
Network Policies
Для ограничения сетевого трафика между Pods.
– Пример запрета всего входящего трафика:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
Мониторинг и логирование
Инструменты
Prometheus + Grafana – Сбор метрик (CPU, RAM, сетевой трафик).
EFK-стек (Elasticsearch, Fluentd, Kibana) – Агрегация и анализ логов.
Kubernetes Dashboard – Веб-интерфейс для управления кластером.
Настройка мониторинга
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/prometheus
Автоматизация и CI/CD
GitOps с Argo CDL
Для автоматического развертывание приложений из Git-репозитория.
– Пример:
argocd app create my-app --repo https://github.com/user/repo --path manifests
Интеграция с Jenkins/GitLab CI
# .gitlab-ci.yml
deploy:
stage: deploy
script:
- kubectl apply -f k8s/
# .gitlab-ci.yml
deploy:
stage: deploy
script:
- kubectl apply -f k8s/
Устранение неполадок
– Проверка событий кластера:
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl get events --sort-by=.metadata.creationTimestamp
– Проверка состояния узлов:
kubectl describe node # Просмотр ресурсов и проблем
– Диагностика сети:
kubectl run -it --rm debug --image=nicolaka/netshoot -- sh # Запуск сетевого дебаг-контейнера