Kubernates
Kubernates - K8s⚑
Kubernates⚑
Kubernetes (K8s) — це система з відкритим кодом для автоматизації розгортання, масштабування та управління контейнеризованими застосунками. Тобто це система, яка дозволяє запускати та керувати контейнерами на великій кількості машин.
Основні аспекти, які характеризують Kubernetes
- Оркестрація контейнерів: Kubernetes дозволяє автоматизувати процеси, пов’язані з розгортанням, оновленням, балансуванням навантаження та управлінням контейнеризованими застосунками.
- Підтримка контейнерів: Переважно працює з Docker, але підтримує й інші контейнерні середовища.
- Масштабованість: Спрощує горизонтальне масштабування застосунків за допомогою зміни кількості реплік.
- Висока доступність: Забезпечує відмовостійкість через автоматичне перезапускання контейнерів або їх перенесення на інші вузли кластера.
- Мікросервіси: Добре підходить для архітектури, побудованої за принципом мікросервісів, завдяки підтримці складних взаємозв’язків між сервісами.
- Секрети та конфігурації: Можливість безпечного зберігання чутливої інформації (паролі, ключі) та роботи з конфігураційними даними.
Основні компоненти Kubernates⚑
Контейнер - це спосіб запакувати ваш застосунок разом з усіма його залежностями, щоб він працював однаково в будь-якому середовищі. Найпопулярніший це Docker.
Кластер - це група машин (вузлів), які працюють разом для управління контейнеризованими застосунками. У кластері є master node (відповідає за управління) і worker nodes (виконують робочі навантаження).
Pod - найменша одиниця у Kubernetes, яка являє собою абстракцію над одним або кількома контейнерами. Всі контейнери в поді мають спільну мережу та можуть взаємодіяти між собою через localhost. Це «обгортка» навколо одного або кількох контейнерів (Docker).
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-app
image: nginx:latest
ports:
- containerPort: 80
Node - це фізичний або віртуальний сервер у кластері. Кожен вузол містить компоненти Kubernetes, такі як kubelet, які дозволяють виконувати поди.
Deployment - контролер, який визначає бажаний стан застосунку (кількість реплік, образ контейнера тощо). Він відповідає за оновлення подів, їх масштабування та забезпечення безперервної роботи.
Якщо створювати Pod-и вручну, то у разі збою чи оновлення доведеться вручну їх видаляти, перезапускати та стежити, щоб вони були в потрібній кількості.
Deployment це своєрідний «менеджер» для Pod-ів. У конфігурації описується скільки і яких Pod-ів потрібно, а Kubernetes сам їх створює, стежить, щоб їх кількість відповідала тому, що ми прописали в конфігах, та оновлює їх без простоїв (по одному чи партіями, щоб сервіс не зупинявся).
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: nginx:latest
ports:
- containerPort: 80
Service - це об'єкт, який забезпечує стабільну IP-адресу та DNS-ім'я для доступу до подів. Використовується для балансування навантаження між подами та дозволяє іншим сервісам або користувачам звертатися до подів через єдиний вхідний інтерфейс.
У Kubernetes Pod-и мають тимчасові IP-адреси. Якщо Pod перезапуститься, його IP зміниться. Це проблема, бо інші контейнери з додатками або юзери не зможуть знайти його за старою адресою. Service вирішує цю проблему: він дає постійну адресу (ім’я в DNS або IP), яка завжди вказує на потрібні Pod-и, навіть якщо ті перезапускаються.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
Приклад YAML-файлу для створення Deployment і Service:
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 3
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- name: example-container
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
selector:
app: example
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Цей приклад створює Deployment з трьома подами Nginx і Service для доступу до них.
Secret — це спеціальний тип об'єкта Kubernetes для зберігання більш чутливих даних. Він не шифрує їх «по-справжньому», але зберігає у base64. Для повноцінного захисту треба ще додатково налаштовувати шифрування в Kubernetes (Encryption at Rest) або інтегруватися з одним із секрет-менеджерів (HashiCorp Vault, AWS Secrets Manager тощо).
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
DB_USER: dXNlcg== # user (base64)
DB_PASS: cGFzc3dvcmQ= # password (base64)
Ingress — це механізм, який дозволяє керувати зовнішнім HTTP/HTTPS трафіком, що надходить до сервісів у кластері. У Kubernetes кожен Pod має внутрішню IP-адресу, але вони недоступні напряму ззовні. Навіть якщо створити Service, він за замовчуванням доступний лише всередині кластера.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
spec:
rules:
- host: myapp.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
Ingress - це просто набір правил, який описує:
- як маршрутизувати HTTP(S)-запити на конкретні сервіси;
- які хости обробляти (myapp.com, admin.myapp.com);
- які шляхи куди направляти (/login → один сервіс, /api → інший);
- і навіть HTTPS/TLS, редіректи, обробку помилок тощо.
Але Ingress це лише конфіг. Щоб він реально працював, у кластері має бути встановлений Ingress Controller — це спеціальний сервіс, який «слухає» ці правила і обробляє трафік. Kubernetes не має вбудованого Ingress Controller — його треба встановити окремо (NGINX Ingress Controller, Traefik, HAProxy)