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. В зависимости от ваших требований, вы можете расширить и настроить эту среду, добавив больше реплик, используя различные базы данных и технологии для веб-серверов.


