Лабораторна робота №7. Основи Kubernates

Мета: Ознайомитися з архітектурою та можливостями Kubernetes.

Теоретичні відомості

Kubernetes - це платформа з відкритим вихідним кодом для управління контейнеризованими робочими навантаженнями та супутніми службами. Її основні характеристики - кросплатформенність, розширюваність, успішне використання декларативної конфігурації та автоматизації. Вона має гігантську, швидкопрогресуючу екосистему. Назва Kubernetes походить з грецької та означає керманич або пілот. Google відкрив доступ до вихідного коду проекту Kubernetes у 2014 році.

Контейнери - це прекрасний спосіб упакувати та запустити застосунок але у прод оточенні потрібно керувати контейнерами, в яких працюють застосунки, і стежити, щоб не було простою. Наприклад, якщо один контейнер припиняє роботу, інший має бути запущений йому на заміну. Kubernetes надає каркас для еластичного запуску розподілених систем. Він опікується масштабуванням та аварійним відновленням вашого застосунку, пропонує шаблони розгортань тощо.

Основні характеристики Kubernetes:

  • Створювати сервісів та балансування навантаження. - надає доступ до контейнера, використовуючи DNS-ім'я або його власну IP-адресу. Якщо контейнер зазнає завеликого мережевого навантаження, Kubernetes здатний збалансувати та розподілити його таким чином, щоб якість обслуговування залишалась стабільною.
  • Оркестрація сховищ інформації - дозволяє автоматично монтувати системи збереження інформації на ваш вибір: локальні сховища, рішення від хмарних провайдерів тощо.
  • Автоматичне розгортання та відкатування - допомогає описати бажаний стан контейнерів, що розгортаються, і регульовано простежує за виконанням цього стану. Наприклад, ви можете автоматизувати в Kubernetes процеси створення нових контейнерів для розгортання, видалення існуючих контейнерів і передачу їхніх ресурсів на новостворені контейнери.
  • Автоматичне розміщення задач - в межах кластеру дає можливість для запуску контейнерізованих задач і вказувати, скільки ресурсів ЦПУ та пам'яті (RAM) необхідно для роботи кожного контейнера. Kubernetes розподіляє контейнери по вузлах кластера для максимально ефективного використання ресурсів.
  • Самозцілення - перезапускає контейнери, що відмовили; заміняє контейнери; зупиняє роботу контейнерів, що не відповідають на задану користувачем перевірку стану, і не повідомляє про них клієнтам, допоки ці контейнери не будуть у стані робочої готовності.
  • Управління секретами та конфігурацією - дозволяє зберігати та керувати чутливою інформацією, такою як паролі, OAuth токени та SSH ключі. Ви можете розгортати та оновлювати секрети та конфігурацію без перезбирання образів ваших контейнерів, не розкриваючи секрети в конфігурацію стека.

Kubernetes складається з кількох основних компонентів, які працюють разом для управління контейнеризованими додатками в кластері (рис. 1):

img_7_1.png

Рисунок 1 - Компоненти Kubernetes

Керівний компонент (Control Plane)

Керівний компонент координує всі процеси в кластері та відповідає за управління станом системи й складається з наступних компонентів:

  • API Server - основний інтерфейс для взаємодії з Kubernetes, який обробляє всі запити від користувачів, інших компонентів та інструментів автоматизації.
  • etcd - розподілена база даних ключ-значення, яка зберігає всі дані конфігурації та стану кластера.
  • Scheduler - відповідає за розподіл подів на вузли в кластері, базуючись на доступних ресурсах і вимогах конфігурації.
  • Controller Manager - запускає різні контролери, які слідкують за станом підконтрольних об'єктів і підтримують бажаний стан кластера.

Компоненти на вузлах (Node Components)

Ці компоненти працюють на кожному вузлі кластера і забезпечують виконання контейнерів та підтримку їхнього стану й складаються з наступних компонентів:

  • kubelet - агент, який запускає та керує подами на кожному вузлі. Він регулярно спілкується з API Server і підтримує стан подів.
  • kube-proxy - мережевий проксі, який забезпечує комунікацію між сервісами в кластері, керуючи правилами мережевої маршрутизації.
  • Container Runtime - середовище для запуску контейнерів (наприклад, Docker, containerd або CRI-O), яке відповідає за фактичний запуск та управління контейнерами.

Мережеві компоненти Kubernetes підтримує власну мережу для комунікації між подами, сервісами та вузлами за допомогою наступних елементів:

  • Cluster Networking - надає кожному поду власну IP-адресу і забезпечує їхню взаємодію в межах кластера.
  • Ingress - дозволяє керувати зовнішнім доступом до сервісів у кластері, використовуючи правила маршрутизації HTTP(S).

Основні об'єкти Kubernetes

Kubernetes має кілька основних об'єктів, які допомагають керувати станом додатків та ресурсами в кластері:

  • Pod - найменша одиниця в Kubernetes, яка представляє один або кілька контейнерів, що запускаються разом.
  • Service - об'єкт, що забезпечує постійний мережевий доступ до подів, навіть якщо їхні IP-адреси змінюються.
  • Deployment - контролює оновлення та масштабування подів, допомагає управляти відмовостійкістю додатків.
  • ReplicaSet - забезпечує певну кількість копій подів, підтримуючи необхідний рівень доступності.
  • ConfigMap і Secret: Використовуються для зберігання налаштувань і конфіденційних даних (паролів, ключів API), які можна передати в поди.

Kubernetes Command-Line Tool: kubectl

kubectl — це інструмент командного рядка для управління кластерами Kubernetes. Він дозволяє взаємодіяти з Kubernetes API Server, керувати ресурсами, перевіряти стан кластера та здійснювати деплой контейнеризованих додатків.

Основні команди

Категорія Команда Опис
Кластер та вузли kubectl cluster-info Перевірити статус кластера
kubectl get nodes Переглянути список вузлів у кластері
Поди (Pods) kubectl get pods Переглянути список подів
kubectl describe pod <pod-name> Переглянути детальну інформацію про под
kubectl logs <pod-name> Отримати логи пода
kubectl run nginx --image=nginx Запустити новий под з образом nginx
kubectl delete pod <pod-name> Видалити под
Розгортання (Deployments) kubectl get deployments Переглянути список розгортань
kubectl create deployment <deployment-name> --image=<image-name> Створити нове розгортання
kubectl set image deployment/<deployment-name> <container-name>=<new-image> Оновити образ у розгортанні
kubectl scale deployment <deployment-name> --replicas=<number> Масштабувати розгортання
kubectl delete deployment <deployment-name> Видалити розгортання
Сервіси (Services) kubectl get services Переглянути список сервісів
kubectl expose deployment <deployment-name> --type=<type> --port=<port> Створити сервіс для доступу до подів
kubectl delete service <service-name> Видалити сервіс
Налаштування kubectl get all -n <namespace> Переглянути всі ресурси в просторі імен
kubectl config set-context --current --namespace=<namespace> Перемикання на інший простір імен
YAML конфігурації kubectl apply -f <file.yaml> Застосувати конфігурацію з YAML файлу
kubectl replace -f <file.yaml> Оновити конфігурацію ресурсу з YAML файлу
kubectl delete -f <file.yaml> Видалити ресурси, визначені в YAML файлі
Додаткові команди kubectl get pods --sort-by=.metadata.creationTimestamp Сортувати поди за віком
kubectl exec -it <pod-name> -- <command> Виконати команду в поді
kubectl exec -it <pod-name> -- /bin/bash Відкрити інтерактивний термінал у поді
Довідка kubectl help Показати довідку

Більше інформації та документації можна знайти в офіційній документації Kubernetes.

Namespace (неймспейс) у Kubernetes — це логічний простір імен, який дозволяє розділяти ресурси кластера на ізольовані середовища. Це корисно для організації і розподілу ресурсів у великому кластері або в середовищі, де одночасно працюють кілька команд, проектів або додатків.

Namespace забезпечуэ:

  • Ізоляція - ізолює ресурси (такі як поди, сервіси, конфігурації), що дозволяє уникнути конфліктів між додатками або командами.
  • Розподіл ресурсів - можна налаштовувати обмеження на використання ресурсів (таких як CPU, пам'ять), щоб різні команди або додатки не перевищували свої квоти.
  • Спільний доступ - деякі ресурси, такі як nodes і PersistentVolumes, є спільними для всіх неймспейсів, що дозволяє використовувати їх між різними додатками.

Minikube

Minikube - інструмент, який дозволяє запустити Kubernetes кластер з однієї ноди у віртуальній машині на вашому персональному комп'ютері.

Завдання

  1. Встановити утиліту kubectl у локальному середовищі
  2. Встановити та запустити Kubernetes у локальному середовищі машину за допомогою Minikube.
  3. Отримати перелік нод кластера та інформацію про кластер.
  4. Запустити поди на базі образів apache, nginx, mysql.
  5. Створити сервіси для доступу до подів та протестувати доступ у браузері та додатку MySQl Workbench (або подібного)
  6. Послідовно видалити створені сервіси та відповідні поди.
  7. Створити та відправити на docker-hub docker образ додатку що буде відображати html сторінку з різними кольорами фону для різних версій (<vendor_name>/simple-web:[red|blue|green]).
  8. Створити deployment що базується на образі `<vendor_name>/simple-web:red.
  9. Створити сервіс для доступу до додатку.
  10. Перевірити доступ до додатку в браузері.
  11. Виконати та протестувати масштабування додатку (збільшити кількість реплік до 5).
  12. Змінити та протестувати інші версії додатку.
  13. Видалити створені сервіси та деплойменти.
  14. Зупинити Minikube.
  15. Всі кроки та результати роботи відобразити у звіті.

Контрольні питання

  • Яке призначення утиліти kubectl в Kubernetes?
  • Як створити новий под з образом nginx за допомогою kubectl?
  • Що таке namespace і для чого він використовується в Kubernetes?
  • Як створити сервіс типу NodePort для доступу до пода ззовні?
  • Як переглянути поточний контекст підключення kubectl?
  • Як переглянути список усіх подів у певному неймспейсі?
  • Що таке деплоймент (deployment) в Kubernetes і для чого він використовується?

Література