Розкриття потенціалу Kubernetes: Король оркестрації

Уявіть, що ви керуєте рестораном, і раптом до вас вбігає велика кількість клієнтів. Що ви зробите? Вам потрібно скоригувати кількість персоналу, площу кухні та запаси інгредієнтів, щоб задовольнити попит. Це саме те, що робить Kubernetes для додатків. Kubernetes — це відкрита платформа оркестрації контейнерів для автоматизації розгортання, масштабування та управління контейнеризованими додатками. Цей проєкт з відкритим кодом підтримується Cloud Native Computing Foundation (CNCF).

Можливо, ви замислюєтесь, що таке оркестрація контейнерів. Дозвольте пояснити: оркестрація контейнерів — це автоматизований процес управління та координації контейнерів. Саме це робить Kubernetes — він автоматизує такі завдання, як розгортання додатків, їх масштабування та управління їх життєвим циклом.

Чим Kubernetes відрізняється від Docker?

Щоб зрозуміти це, спершу потрібно дізнатися про контейнери.

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

Docker — це інструмент або платформа, яка допомагає розробникам створювати, розгортати та запускати додатки в контейнерах. Може виникнути питання: навіщо він потрібен? Хіба не можна просто завантажити залежності безпосередньо в систему? Так, можна, але Docker вирішує проблему, з якою стикаються розробники при перенесенні додатків з одного середовища в інше. Docker може упакувати додаток разом з усім, що йому потрібно, такими як код, залежності та бібліотеки, в контейнер. Це допомагає вирішити проблему установки на різних платформах та прискорює розгортання, оскільки ви можете швидко та легко запускати контейнери.

Тепер повернемося до нашого основного питання. Чим Kubernetes відрізняється від Docker? Оскільки Docker використовується для створення контейнерів, Kubernetes використовується для керування кількома контейнерами та забезпечення їх ефективної роботи разом.

Потреба в Kubernetes

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

Kubernetes надає вам:

Виявлення сервісів та балансування навантаження: Kubernetes може відкрити контейнер за допомогою DNS-імені або його IP-адреси. Якщо трафік до певного контейнера високий, Kubernetes може розподіляти трафік, щоб забезпечити стабільність розгортання.

Оркестрація зберігання: Kubernetes дозволяє автоматично підключати систему зберігання на ваш вибір.

Автоматичне відновлення: Якщо контейнер виходить з ладу, Kubernetes перезапускає цей контейнер, замінює його або вбиває контейнер, який не відповідає, і не відкриває його для клієнта, поки він не буде готовий. Простими словами, якщо контейнер падає, Kubernetes замінює його новим, щоб не було простою.

Автоматичне масштабування: Kubernetes може масштабувати ваш додаток або контейнери вгору або вниз залежно від трафіку та навантаження.

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

Архітектура

pic

Архітектура Kubernetes кластера

Kubernetes складається з контрольної площини та набору робочих машин, які називаються вузлами (nodes). В кластері повинен бути хоча б один робочий вузол для запуску подів (pods). Kubernetes працює за клієнт-серверною архітектурою. Він включає в себе майстер-вузол та робочі вузли, причому майстер встановлюється на одному Linux-системі, а робочі вузли — на багатьох Linux-робочих станціях.

Контрольна площина

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

Компоненти контрольної площини:

Kube-API Server: API сервер — це компонент контрольної площини Kubernetes, який відкриває API Kubernetes. Це як точка входу до кластера. Він слухає запити та запити від користувачів, сервісів і інших компонентів кластера через CLI, наприклад, Kubectl. Кожна дія в кластері, така як створення, оновлення або видалення ресурсів (наприклад, подів, розгортань тощо), здійснюється через API виклики до цього сервера.

etcd: Це сховище типу "ключ-значення", яке використовує Kubernetes для зберігання всіх даних кластера та налаштувань, включаючи інформацію про стан кластера, розгортання та секрети. Це критичний компонент, оскільки Kubernetes покладається на etcd для зберігання та отримання поточного стану системи. Будь-які зміни в кластері відображаються в etcd.

Kube-scheduler: Як випливає з назви, цей компонент спостерігає за новими подами (група одного або кількох контейнерів), які не мають призначеного вузла, і вибирає вузол для їх запуску, базуючись на індивідуальних та колективних вимогах до ресурсів, обмеженнях апаратного/програмного забезпечення/політик, специфікаціях аффінності та антиаффінності, локальності даних, взаємодії між навантаженнями та термінах виконання.

Kube Controller Manager: Він відповідає за виконання контролера, який обробляє різні аспекти контрольного циклу кластера. Наприклад, Replication Controller забезпечує, щоб бажана кількість реплік певного додатку працювала, а Node Controller відповідає за виявлення та реагування на випадки, коли вузли виходять з ладу.

Cloud Controller Manager: Менеджер контролера хмарних технологій відповідає за управління хмарними специфічними ресурсами, такими як балансувальники навантаження, мережеві ресурси та зберігання, особливо в хмарних платформах (AWS, Google Cloud, Azure). Cloud Controller Manager виконує тільки контролери, специфічні для вашого хмарного постачальника. Якщо ви запускаєте Kubernetes на власних потужностях або в навчальному середовищі на своєму ПК, кластер не матиме цього менеджера.

Компоненти вузла

Kubelet: Kubelet — це агент, який працює на кожному вузлі в кластері і відповідає за запуск пода з контейнером всередині. Kubelet отримує набір PodSpecs, який надається через різні механізми, і забезпечує, щоб контейнери, описані в цих PodSpecs, працювали і були здорові. Kubelet не керує контейнерами, які не були створені Kubernetes.

Kube-proxy: Він управляє мережею на кожному робочому вузлі. Kube-proxy відповідає за підтримку мережевих правил на вузлі. Ці мережеві правила дозволяють мережеву комунікацію до ваших подів з мережевих сесій всередині або зовні вашого кластера.

Container Runtime: Це компонент, який відповідає за управління виконанням і життєвим циклом контейнерів у середовищі Kubernetes.
Kubernetes підтримує контейнерні рантайми (container runtimes) такі як containerd, CRI-O та інші реалізації Kubernetes CRI (Container Runtime Interface).

Робота Kubernetes

Користувач або системний адміністратор взаємодіє з Kubernetes кластером через інтерфейс командного рядка kubectl (CLI) або через Kubernetes API (API server). API сервер отримує запити від користувачів або інших компонентів (таких як scheduler або controller manager) і оновлює etcd з поточним станом системи. Коли створюється новий под, планувальник (scheduler) визначає, який робочий вузол підходить для запуску пода, враховуючи доступні ресурси (CPU, пам’ять тощо). Як тільки планувальник призначає под на вузол, kubelet на цьому вузлі переконується, що контейнер всередині пода працює. Kubernetes надає механізм для комунікації сервісів між собою через поди. Kube proxy на кожному вузлі допомагає керувати мережевим трафіком і забезпечує правильну маршрутизацію запитів до відповідного пода.

Ключові концепції

Pods: Под — це найменша та найпростіша одиниця в Kubernetes. Він може містити один або більше контейнерів, наприклад, контейнерів Docker, які ділять одні й ті ж ресурси, мережу та сховище. Поди створені таким чином, щоб бути еферними, тобто їх можна легко створювати, знищувати та відновлювати.

Наприклад, ви можете створити под для запуску веб-сервера (наприклад, Nginx), і всередині цього пода можете запустити контейнер-сайдкар для обробки логування або моніторингу цього веб-сервера.

Приклад створення пода:

apiVersion: v1  
kind: Pod  
metadata:  
 name: nginx-pod  
spec:  
 container:  
 - name: nginx  
 image: nginx-latest  
 ports:  
 - containerPort: 80

Deployments: Розгортання (Deployment) — це абстракція вищого рівня в Kubernetes, яка керує життєвим циклом подів. Воно дозволяє вам визначити бажаний стан додатку (наприклад, скільки реплік пода ви хочете запустити) і забезпечує, щоб цей стан був підтримуваний. Коли ви створюєте Deployment, Kubernetes автоматично створює под для вас і гарантує, що вони працюють.

Приклад розгортання:

apiVersion: apps/v1  
kind: Deployment  
metadata:  
 name: nginx-deployment  
spec:  
 replicas: 3  
 selector:   
 matchLabels:  
 app: my-app # Зауважте, що ім'я додатку тут повинно відповідати імені додатку в мітках  
 template:  
 metadata:  
 labels:  
 app: my-app  
 spec:  
 containers:  
 - name: nginx  
 image: nginx-latest  
 ports:  
 - containerPort: 80

Простими словами, Поди — це робочі одиниці, де працює ваш додаток, а Розгортання (Deployments) — це менеджери, які забезпечують стабільну роботу подів із заданою кількістю реплік та автоматичним управлінням відмовами або оновленнями.

Запуск пода

Щоб застосувати yaml файл:

kubectl apply -f nginx-pod.yml # file_name = nginx-pod.yml

Щоб переглянути поди:

kubectl get pods

Налаштування Kubernetes

Ви можете використовувати різні інструменти для розробки Kubernetes. Деякі з них — це Minikube, kind, k3d, Getdeck та інші.

Я надам вам команди для використання Kubernetes у локальному середовищі за допомогою Minikube.

  1. Встановіть Minikube:
curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64/  
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64

Також ви можете ознайомитись з цією документацією для Mac та Windows через Minikube. Наведений код для Linux.

  1. Запустіть Minikube:

З терміналу з правами адміністратора (але не як root) виконайте:

minikube start
  1. Взаємодійте з вашим кластером
kubectl get po -A

Посилання:

  1. https://kubernetes.io/docs/home/
  2. https://minikube.sigs.k8s.io/docs/

Слідкуйте за оновленнями для більш глибокого занурення в Kubernetes. Підписуйтесь для отримання більше матеріалів по темі.

Перекладено з: Unleashing Kubernetes: The King of Orchestration

Leave a Reply

Your email address will not be published. Required fields are marked *