Kubernetes для початківців
Контейнеризація — один з головних трендів в IT. Це підхід до розробки ПЗ, за якого додаток чи сервіс, його залежності та конфігурація упаковуються в образ контейнера. Але контейнери мають один мінус — складність із налаштуванням масштабування.
Щоб усунути цей мінус, з’явилися автоматичні системи керування контейнеризацією. Kubernetes — найпопулярніша з них. Вона поєднує в собі гнучкість, безпеку та потужність.
У цьому матеріалі розповімо про Kubernetes для чайників: що це, як він працює і як з ним розібратися навіть початківцям. Наш гайд допоможе розібратися вам із програмою на початковому рівні, а стати гуру оркестрації — можна на нашому курсі Адміністрування Kubernetes.
Що таке Kubernetes
Перш ніж перейти до самої програми, розберемося з деякими важливими поняттями:
* Оркестрація — автоматизоване керування контейнерами.
* Контейнер — пакет ПЗ з усіма залежностями. Туди входять код, середовище виконання, конфігурація та системні бібліотеки.
Тепер розберемося, що таке Kubernetes:
* Kubernetes або K8s — це платформа з відкритим кодом для управління контейнерами. Вона спрощує декларативне налаштування та автоматизацію.
Це не традиційна Platform-as-a-Service, оскільки Kubernetes працює на рівні контейнерів, а не на рівні обладнання. Він має деякі функції PaaS, наприклад, розгортання, масштабування, балансування навантаження, ведення логів і моніторинг. Проте Kubernetes — це не монолітне рішення, тому ці можливості вважаються додатковими. У програми є все для створення платформи для розробника, але при цьому за користувачем зберігається право вибору, а також гнучкість там, де це важливо.
Історія створення
Проєкт з’явився на базі менеджера управління кластерами від Google — Borg. Назва програми походить від високотехнологічної раси кіборгів із серіалу “Зоряний шлях”.
У команди Google Borg було завдання створити відкрите ПЗ для оркестрування контейнерів, яке мало стати вкладом Google у розвиток світових технологій.
У процесі розробки проєкт називався Project Seven на честь персонажа того ж серіалу — Seven of Nine (“Сьома-з-дев’яти”). Сьома — андроїд-борг, що змогла повернути собі людяність. Пізніше проєкт перейменували на звичний для нас “Kubernetes”. Назва походить від грецького слова κυβερνήτης, що означає “керманич”.
Вихідні коди компанія представила у 2014 році, а за рік з’явилася перша версія програми Kubernetes 1.0. Пізніше права на продукт перейшли некомерційному
фонду Cloud Native Computing Foundation. Це проєкт Linux Foundation, куди входять Google, IBM, Red Hat, Cisco та інші найбільші технологічні корпорації. Мета CNCF — просування контейнерної технології та паралельна адаптація технологічної галузі у відповідність до її розвитку.
Як працює технологія
Розглянемо принципи влаштування та роботи, а також які завдання виконує Kubernetes та його переваги.
Як улаштований Kubernetes
Основний принцип роботи — декларативний підхід. Розробник вказує, що потрібно отримати, а не як це отримати.
Для роботи з K8s використовуються об’єкти API Kubernetes. Вони дають описати бажаний стан вашого кластера: які програми ви хочете запустити та скільки ресурсів для цього потрібно виділити. Об’єкти зазвичай створюються через інтерфейс командного рядка kubectl. Хоча для взаємодії з кластером, установки або зміни бажаного стану API можна використовувати напряму.
Також у програмі можна використати імперативні команди, такі як create, edit, delete. Вони дозволяють створювати, модифікувати та видаляти ресурси. Але для критично важливих завдань краще ними не користуватися.
Kubernetes — принципи роботи
Для розгортання ПЗ в K8s використовується база Linux-контейнерів, наприклад, Containerd або CRI-O, і опис, про який ми говорили вище. Саме розгортання відбувається з урахуванням нод — віртуальних чи фізичних машин.
Основні завдання Kubernetes
- Розгортання контейнерів та всі операції для запуску потрібної конфігурації. Наприклад, перезапуск контейнерів, що зупинилися, або їх переміщення, щоб виділити ресурси для нових контейнерів.
- Масштабування та запуск кількох контейнерів одночасно на великій кількості хостів.
- Балансування безлічі контейнерів у процесі запуску. Для цього програма логічно групує контейнери. Це дає можливість визначити їх пули, задати їм розміщення та розподілити навантаження.
Переваги Kubernetes
- Виявлення сервісів та балансування навантажень. Контейнери можуть мати власні IP-адреси або загальне ім’я DNS для цілої групи. K8s розподіляє навантаження мережного трафіку для стабільного розгортання.
- Автоматичне керування сховищами. Це дозволяє вказати, яке сховище за замовчуванням використовувати для розгортання. Це може бути внутрішнє сховище, сховище зовнішнього хмарного провайдера або інші варіанти.
- Автоматичне впровадження та відкат змін. Користувач може доповнювати поточну конфігурацію контейнерів. А якщо це порушить стабільність розгортання, програма автоматично поверне зміни до версії, що працює стабільно.
- Автоматичне розподілення ресурсів. K8s сам виділяє простір та оперативну пам’ять із виділеного кластера нод. Так кожен контейнер отримує все, що потрібне для його роботи.
- Управління паролями та налаштуваннями. K8s можна використовувати як програму для обробки конфіденційної інформації, наприклад, паролів, OAuth-токенів та SSH-ключів. Дані та налаштування можна оновити без створення контейнера заново.
- Самовідновлення у разі виникнення збою. Програма має спеціальні показники, які швидко знаходять пошкоджені контейнери. Якщо контейнер вийшов з ладу, Kubernetes його створить заново та перезапустить.
Початківцям це може здатися складним, але Kubernetes є одним з найзручніших рішень для оркестрації контейнерів. Він не буде працювати без підготовки та додаткових налаштувань, але для того ми й підготували нашу інструкцію для чайників.
Ми допоможемо вам розібратися незалежно від ваших знань з оркестрації. Але перш ніж перейти до установки Kubernetes, ми розповімо з чого складається програма.
Основні компоненти Kubernetes
В API Kubernetes представлені об’єкти, які ми можемо розділити на дві групи: основні та абстракції вищого рівня.
Основні об’єкти Kubernetes включають:
Node
Ноди або вузли — віртуальні або фізичні машини, на яких розгортають та запускають контейнери. Ноди складаються в кластер Kubernetes.
Кластером керує перша запущена нода або майстер-нода. Це відбувається через менеджера контролерів та планувальник — controller manager та scheduler відповідно. Майстер-нода відповідає за інтерфейс взаємодії з користувачами через сервер API. У ній лежить сховище “etcd” з конфігурацією кластера, метаданими та статусами об’єктів.
Pod
Под — один або більше контейнерів для спільного розгортання на ноді. Це первинний об’єкт розгортання та основний логічний юніт у K8s.
Якщо контейнери взаємозалежні та повинні запускатися в одній ноді, програма їх групує. Це підвищує швидкість відгуку при взаємодії. Наприклад, між контейнерами вебпрограми та сервісу для її кешування.
Service
Абстрактний спосіб представити програму, що працює на наборі подів, у вигляді сервісу. Для цього програму не потрібно ніяк модифікувати. Дозволяє балансувати навантаження між подами.
Namespace
Простір імен — об’єкт, що розподіляє ресурси кластера між командами та проєктами. Це кілька віртуальних кластерів, запущені на одному фізичному.
Абстракції вищого рівня надають додаткові функції. До таких абстракцій можна віднести:
Deployment
Розгортання — об’єкт Kubernetes, який зберігає описи подів, кількість реплік та алгоритм їх заміни, якщо зміняться параметри. Контролер розгортання дозволяє виконувати декларативні оновлення, тобто описуючи потрібний стан нод та наборів реплік.
DaemonSet
Набір демона відповідає за те, щоб на кожній ноді запускався один екземпляр вибраного пода.
StatefulSet
Набір стану дозволяє розгортати та керувати одним або декількома подами. Особливість набору стану в тому, що в ідентифікаторів пода передбачувані й збережувані при перезапуску значення.
ReplicaSet
Набір реплік відповідає за опис та контроль кількох реплік подів у кластері. Чим більше реплік, тим вища стійкість від відмов та масштабованість програми. Набір реплік можна створити за допомогою Deployment.
ReplicaSet — більш просунута версія Replication Controller — традиційного способу організації реплікації у кластері.
Job/CronJob
Разові або постійні завдання регулюють запуск вибраних подів та контролюють завершення їх роботи. Контролер Job використовується для разового запуску, а CronJob запускає кілька завдань за розкладом.
Встановлення Kubernetes
Для встановлення програми потрібно мінімум 2 Гб пам’яті для майстер-ноди та 1 Гб пам’яті для робочої.
Також установка Kubernetes передбачає, що у вас є один або більше серверів з операційною системою Ubuntu 16.04 та новіше, Debian 9, CentOS 7, RHEL 7, Fedora 25/26, HypriotOS v1.0.1+ або Container Linux. У нашому прикладі розглянемо установку на Ubuntu.
При цьому важливо заздалегідь відключити розділ “swap”. Для цього в терміналі необхідно виконати команду swapoff -a. Якщо на сервері ОС ще не встановлено, просто не створюйте цей розділ.
Потім відкриваємо “/etc/fstab” з правами root і видаляємо рядок “#/swapfile”.
Проєкт Kubernetes працює на основі контейнерів Docker, сильно підвищуючи їхню функціональність. Тому спочатку необхідно встановити його.
Оскільки ми розглядаємо Kubernetes для чайників, зупинимося на легкому способі. На результат це не вплине. Тому зупинимося на версії, доданій до репозиторію на цей момент. Розробники її протестували, тому така зв’язка Docker та Kubernetes працюватиме стабільно.
Встановлення контейнерів на Ubuntu
Для встановлення Docker на Ubuntu потрібні права суперкористувача.
Вводимо команду:
apt-get update
apt-get install -y docker.io
Якщо потрібні новіші версії контейнерів, запустіть команди:
apt-get update
apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable"
apt-get update
apt -get install -y docker-ce docker-ce-cli containerd.io
Установка kubeadm, kubelet та kubectl
Коли Docker встановлено, переходимо до утиліт kubeadm, kubelet та kubectl. З ними ми зможемо керувати кластером:
- Kubectl — створює та налаштовує об’єкти в кластері.
- Kubelet — запускає контейнери на хостах.
- Kubeadm — налаштовує компоненти кластера.
Встановити ці компоненти можна так:
apt-get update && apt-get install -y apt-transport-https software-properties-common
curl -s https://packages.cloud.google.com/apt/doc/apt-key. gpg | apt-key add -
add-apt-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
apt-get update
apt-get install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
Настройка Kubernetes
Щоб налаштувати Kubernetes, ми маємо створити та налаштувати кластер, налаштувати CNI, додати ноди в кластер і отримати токен авторизації.
Ініціалізація кластера
Щоб створити та настроїти кластер у Kubernetes, потрібно вказати сервер, на якому він встановлений. Цей сервер буде первинним: на ньому ми будемо запускати всі операції. Виконуємо команду:
kubeadm init --pod-network-cidr=10.244.0.0/16
У команді вище важливо враховувати, що “–pod-network-cidr” у вас може бути іншим. Він відрізняється залежно від мережевого плагіна, який ви використовуєте.
У нашому прикладі використовується плагін Flannel, який використовує мережу “10.244.0.0/16”.
Ця команда може викликати помилки та попередження системи. Помилки потрібно обов’язково виправити, а попередження можна упустити, якщо вони не в оточенні “production”.
Якщо все правильно, на екрані побачимо команду, яка дозволить приєднати до хоста інші ноди кластера. Виконуємо її та зберігаємо собі, тому що вона нам ще знадобиться. Отримуємо такий результат:
Далі виконуємо команди від імені користувача, який управлятиме кластером:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u ):$(id -g) $HOME/.kube/config
Налаштування CNI
Щоб запускати програми у кластері, потрібно налаштувати Container Network Interface — мережний інтерфейс контейнера. Він потрібен, щоб налаштовувати взаємодії та керувати контейнерами у кластері.
Ми розповімо, як це зробити за допомогою плагіна Flannel. Завдяки його простоті, це оптимальне рішення для початківців.
Щоб встановити плагін, вводимо команду:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Додавання нод до кластера
Щоб додати до кластера нові ноди, потрібно:
- Під’єднатися до сервера через SSH.
- Встановити Docker, Kubelet, Kubeadm, як ми робили раніше.
- Виконати команду:
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
Це команда, яку ми отримали у виведенні після виконання команди kubeadm init на майстер-ноді.
Отримання токена авторизації кластера
Підключаємося до сервера через SSH і знову запускаємо команду, яку ми отримали після виконання kubeadm init. Наприклад:
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
Якщо токена немає, можна отримати його іншим способом. Виконайте на майстер-ноді команду kubeadm token list
Ви отримаєте токен, який діятиме 24 години. Якщо ви захочете додати ноду після закінчення цього часу, можна створити новий токен командою kubeadm token create
Отримаєте приблизно такий висновок:
5didvk.d09sbcov8ph2amjw
Якщо ви не знаєте значення параметра “—discovery-token-ca-cert-hash”, його можна отримати так:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst-sha256-hex | sed 's/^.* //'
У результаті отримаємо:
8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78
Щоб ввести IPv6-адресу в <control-plane-host>:<control-plane-port>, адресу потрібно писати у квадратних дужках: [fd00::101]:2073
Через кілька секунд нода з’явиться у виведенні команди kubectl get nodes
Додаткові налаштування
Дефолтна конфігурація не передбачає запуску контейнерів за допомогою майстер-ноди. Вона стежить за станом кластера та розподіляє ресурси. Але якщо ввести наступну команду, ви зможете запускати контейнери і на майстер-ноді:
kubectl taint nodes --all node-role.kubernetes.io/master-
Перевірка працездатності кластера
Переконаємося, що ми правильно провели налаштування кластера:
kubectl -n kube-system get pods
У висновку має показати системні поди Kubernetes.
Тепер базове встановлення Kubernetes завершено. Далі можна підключати додаткові функції, наприклад, настроїти контролер ingress, увімкнути диспетчер пакетів helm.
Настанови
Тепер ви знаєте, як встановити та налаштувати Kubernetes — найпопулярніший оркестратор контейнерів. Він дає автоматизувати розгортання та оптимізує процес роботи з контейнерами. Ми знаємо, що налаштування Kubernetes могло здатися складним. Але якщо ви впоралися, то ви вже не початківець. Так що не зупиняйтесь, навчайтеся на практиці та вивчайте інші можливості програми. Радимо зробити це на нашому курсі Kubernetes.
Бонус
Якщо ви дочитали гайд до кінця, але вам хочеться дізнатися щось нове, у нас є невеликий бонус. Розповідаємо про налаштування ingress — http проксі сервера Kubernetes. Сервер дозволяє звертатися до ресурсів за іменами.
Контролери ingress не запускаються автоматично разом із кластером. Kubernetes дозволяє окремо вибрати реалізацію ingress, яка найкраще підходить для вашого кластера. Це можна зробити тут.