Kubernetes: Основы и установка K3S для среднего и малого бизнеса
Введение в Kubernetes
Kubernetes (сокращенно k8s) — это открытая платформа контейнеризации, которая помогает управлять контейнеризированными приложениями через автоматизацию развертывания, масштабирования и операций. Она была создана компанией Google и сейчас поддерживается сообществом Linux Foundation. Kubernetes предоставляет мощные инструменты для управления кластерами контейнеров, обеспечивая высокую доступность и автоматическое восстановление приложений.
Зачем нужен Kubernetes?
- Управление контейнерами: Kubernetes позволяет легко управлять множеством контейнеров, обеспечивая их высокую доступность и масштабируемость.
- Автоматизация развертывания: Автоматизированные инструменты для развертывания приложений упрощают процесс обновления и масштабирования.
- Масштабирование: Kubernetes позволяет легко увеличивать или уменьшать количество работающих экземпляров приложения, что важно для поддержания производительности и снижения затрат.
- Обслуживание приложений: Инструменты для мониторинга и логгирования помогают быстро диагностировать и устранять неполадки в работе приложения.
Сравнение Kubernetes (k8s) и K3s
Что такое K3s?
K3s — это легковесная версия Kubernetes, разработанная специально для малых и средних предприятий. Она имеет меньший объем ресурсов по сравнению с полной версией k8s и предназначена для упрощения развертывания и управления кластерами Kubernetes.
Преимущества K3s:
- Легковесность: Меньшее потребление ресурсов, что делает его идеальным для ограниченных сред.
- Упрощенная установка и управление: Легче настроить и управлять по сравнению с k8s.
- Минимум конфигураций: Меньшее количество параметров, что уменьшает вероятность ошибок при настройке.
Установка K3S
Минимальные требования:
- Один сервер или виртуальная машина с операционной системой Linux (Ubuntu, CentOS, etc.).
- 2 ГБ RAM
- 2 ядра CPU
- 20 ГБ свободного места на диске
Пример установки K3S:
Шаг 1: Обновите систему и установите необходимые зависимости:
sudo apt update && sudo apt upgrade -y sudo apt install curl -y
Шаг 2: Скачайте и установите K3s:
curl -sfL https://get.k3s.io | sh -
Шаг 3: Настройка переменных окружения для работы с kubectl:
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml alias k="kubectl"
Шаг 4: Проверьте статус кластера:
k get nodes
Пример установки на разных серверах в разных местах:
Сервер 1 (Master):
- Установите k3s как описано выше.
- Проверьте статус кластера:
k get nodes
Сервер 2 и последующие (Workers):
- На всех рабочих серверах выполните установку k3s с использованием того же скрипта:
curl -sfL https://get.k3s.io | sh -
Добавьте их в кластер, указав IP-адреса серверов:
kubectl taint nodes <worker-node-name> node-role.kubernetes.io/master=:NoSchedule
Основные компоненты Kubernetes:
- kubelet: Агент, который запускается на каждой рабочей ноде и управляет контейнерами внутри этой ноды.
- kubeadm: Инструмент для упрощения установки Kubernetes.
- kubectl: Командная строка для взаимодействия с кластером Kubernetes.
- etcd: Распределенное хранилище ключей, используемое Kubernetes для хранения всех конфигураций и состояний кластера.
- API сервер: Основной интерфейс взаимодействия с кластером Kubernetes.
- Scheduler: Планировщик, который назначает положения Pods на узлах.
- Controller Manager: Отвечает за управление различными контроллерами в кластере, такими как ReplicaSet, DaemonSet и другие.
Развертывание веб-сервера с внешним доступом и базы данных PostgreSQL для среднего и малого бизнеса
В современном мире цифровых технологий, многие предприятия нуждаются в облачных сервисах для расширения своих возможностей. Развертывание веб-сервера с внешним доступом и базой данных PostgreSQL позволяет организациям предоставлять онлайн-сервисы, поддерживать взаимодействие с клиентами через интернет и увеличить гибкость работы. В этой статье мы рассмотрим, как развернуть такую среду на базе Kubernetes (k8s) или K3s.
Требования
Перед началом установки убедитесь, что у вас есть следующие компоненты:
- Сервер с операционной системой Linux (например, Ubuntu или CentOS).
- Доступ к сети для подключения извне.
- Установленные инструменты
kubectl
иhelm
, если вы планируете использовать Helm для установки приложений.
Шаг 1: Развертывание базы данных PostgreSQL
Для начала развернем базу данных PostgreSQL. Мы воспользуемся StatefulSet и PersistentVolumeClaim, чтобы обеспечить сохранность данных даже при перезапуске контейнеров.
Файл postgres-deployment.yaml
:
apiVersion: apps/v1 kind: StatefulSet metadata: name: postgres spec: selector: matchLabels: app: postgres serviceName: "postgres" replicas: 1 template: metadata: labels: app: postgres spec: containers: - name: postgres image: postgres:latest ports: - containerPort: 5432 env: - name: POSTGRES_PASSWORD value: "your-password" volumeMounts: - name: postgres-storage mountPath: /var/lib/postgresql/data volumeClaimTemplates: - metadata: name: postgres-storage spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi --- apiVersion: v1 kind: Service metadata: name: postgres spec: selector: app: postgres ports: - protocol: TCP port: 5432 targetPort: 5432
Комментарии к StatefulSet:
apiVersion: Определяет версию API, используемую для создания объекта. В данном случае это
apps/v1
— стандартная версия API для работы с StatefulSets.kind: Тип создаваемого объекта — в данном случае, это
StatefulSet
.metadata.name: Имя ресурса — здесь он назван “postgres”.
spec.selector.matchLabels.app: postgres и template.metadata.labels.app: postgres: эти метки используются для соответствия StatefulSet с правильными экземплярами контейнеров PostgreSQL.
serviceName: “postgres”: Название сервиса, которое будет использоваться в StatefulSet. Это важно для обеспечения стабильного DNS-имени и сетевых подключений к каждому экземпляру.
replicas: 1: Определяет количество реплик или повторяющихся экземпляров PostgreSQL, которые будут запущены. В этом случае — один экземпляр.
template.spec.containers:
- name: postgres: Имя контейнера.
- image: postgres:latest: Используется последняя версия образа PostgreSQL.
- ports.containerPort: 5432: Указывает, что порт
5432
будет использоваться для доступа к базе данных. - env.POSTGRES_PASSWORD: Задает пароль для подключения к базе данных. Важно заменить
"your-password"
на реальный пароль в Production среде.
volumeClaimTemplates:
- Объявление тома для хранения данных PostgreSQL, который будет использоваться каждым экземпляром StatefulSet.
name: postgres-storage
: Имя тома.accessModes: [ "ReadWriteOnce" ]
: Разрешает только одному узлу доступ к данным в режиме записи.resources.requests.storage: 10Gi
: Запрашиваемое пространство для хранения — 10 ГБ.
Комментарии к Сервису:
apiVersion: В данном случае
v1
— версия API для создания сервисов.kind: Тип объекта, создаваемого в Kubernetes —
Service
.metadata.name: Название сервиса, используемого для доступа к базе данных PostgreSQL. Здесь это также
"postgres"
.spec.selector.app: postgres: Отмечает, что этот сервис будет маршрутизировать трафик только на те ресурсы с меткой
app=postgres
.ports:
- protocol: TCP: Указывает протокол для использования — TCP.
- port: 5432: Порт, который будет использоваться для доступа к сервису из Kubernetes сетевой системы. В данном случае, это порт PostgreSQL.
- targetPort: 5432: Целевой порт в контейнере, на который будет маршрутизироваться трафик.
Таким образом, этот YAML-файл описывает установку и доступ к одному экземпляру базы данных PostgreSQL с использованием StatefulSet и соответствующего сервиса.
Применение конфигурации:
kubectl apply -f postgres-deployment.yaml
Шаг 2: Развертывание веб-сервера
Теперь развернем веб-сервер, который будет доступен извне. Мы используем Deployment для масштабирования и Service с внешним IP адресом для доступа.
Файл web-deployment.yaml
:
apiVersion: apps/v1 kind: Deployment metadata: name: web spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: web image: your-web-server-image ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: web spec: selector: app: web ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer
Применение конфигурации:
kubectl apply -f web-deployment.yaml
Шаг 3: Настройка базы данных и веб-сервера
После развертывания сервисов необходимо настроить подключение к базе данных из веб-сервера. Это можно сделать через переменные окружения в контейнере веб-сервера или посредством секретов Kubernetes.
Пример настройки переменных окружения для веб-сервера:
apiVersion: apps/v1 kind: Deployment metadata: name: web spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: web image: your-web-server-image ports: - containerPort: 80 env: - name: POSTGRES_HOST value: "postgres.default.svc.cluster.local" - name: POSTGRES_PORT value: "5432" - name: POSTGRES_USER value: "postgres" - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: postgres-secret key: password --- apiVersion: v1 kind: Secret metadata: name: postgres-secret data: password: cGFzc3dvcmQ= # base64 encoded "password"
Заключение
Теперь у вас есть работающая среда с внешним доступом, включающая веб-сервер и базу данных PostgreSQL. Этот пример демонстрирует основные шаги для развертывания приложений в Kubernetes или K3s. В зависимости от ваших требований, вы можете расширить и настроить эту среду, добавив больше реплик, используя различные базы данных и технологии для веб-серверов.