Skip to content

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)

[Клієнт] --> [Ingress Controller] --> [Service] --> [Pod] --> [Контейнери]