Платформа
Очевидним рішенням стало використання як стандарт Red Hat Enterprise Linux CoreOS (різновиди Red Hat Enterprise Linux) і CRI-O, і ось чому…
Оскільки тема мореплавання є дуже вдалою для пошуку аналогій при поясненні роботи Kubernetes та контейнерів, спробуємо розповісти про ті бізнес-проблеми, які вирішують CoreOS та CRI-O, на прикладі
А тепер уявіть, що Брюнелю довелося б зробити цю роботу для 20 різних моделей суден (версій Kubernetes) і для п'яти різних планет з різними морськими течіями та вітрами (хмарні провайдери). До того ж потрібно, щоб усі кораблі (кластери OpenShift), незалежно від планет, якими здійснюється навігація, з погляду капітанів (операторів, керуючих роботою кластерів) поводилися однаково. Продовжуючи морську аналогію, капітанам кораблів абсолютно не важливо, які такелажні блоки (CRI-O) використовуються на їх кораблях – для них головне, щоб ці блоки були міцними та надійними.
Перед OpenShift 4, як хмарна платформа, стоїть дуже схоже бізнес-завдання. Нові ноди повинні створюватися в момент створення кластера, у разі збою в одному з вузлів, або при масштабуванні кластера. При створенні та ініціалізації нового вузла мають бути відповідно налаштовані і критичні компоненти хоста, у тому числі CRI-O. Як і в будь-якому іншому виробництві на початку необхідно подати «сировину». У разі кораблів як сировина виступають метал та деревина. Однак у разі створення хоста для розгортання контейнерів у кластері OpenShift 4, на вході потрібно мати файли конфігурації та сервери API. Після чого OpenShift забезпечуватиме потрібний рівень автоматизації протягом усього життєвого циклу, пропонуючи необхідну продуктову підтримку для кінцевих користувачів і таким чином окупаючи інвестиції в платформу.
OpenShift 4 створювалася таким чином, щоб забезпечити можливість зручного оновлення системи протягом усього життєвого циклу платформи (для версій 4.X) для всіх основних постачальників хмарних обчислень, віртуалізації платформ і навіть bare metal систем. Для цього вузли повинні створюватися на основі взаємозамінних елементів. Коли кластер вимагає нову версію Kubernetes, він також отримує відповідну версію CRI-O CoreOS. Оскільки версія CRI-O прив'язана безпосередньо до Kubernetes, все це значно спрощує будь-які перестановки з метою тестування, усунення несправностей або підтримки. Крім того, подібний підхід дозволяє знизити витрати для кінцевих користувачів та Red Hat.
Це принципово новий погляд на кластери Kubernetes, який закладає основу для планування нових корисних і привабливих функцій. CRI-O (проект відкритого контейнера Container Runtime Interface – Open Container Initiative, скорочено CRI-OCI) виявився найбільш вдалим вибором для масового створення вузлів, який необхідний для роботи з OpenShift. CRI-O прийде на зміну раніше движку Docker, що використовувався раніше, пропонуючи користувачам OpenShift
Світ відкритих контейнерів
Світ уже давно рухається до відкритих контейнерів. Чи то в Kubernetes, чи на нижчих рівнях,
Все почалося із створення ініціативи Open Containers Initiative
Потім спільнота Kubernetes розробила єдиний стандарт інтерфейсу (pluggable interface), що отримав назву
Інженери Red Hat і Google побачили потребу в контейнерному движку, що існувала на ринку, який міг би приймати запити від Kubelet по протоколу CRI і представили контейнери, які були сумісні зі згаданими вище специфікаціями OCI. Так
Рис. 1.
Інновації з CRI-O та CoreOS
Із запуском платформи OpenShift 4 було змінено
Стоп, як це?
Саме так, з появою OpenShift 4, тепер більше немає потреби підключатися до окремих хостів і встановлювати контейнерний двигун, конфігурувати сховище, настроювати сервери для пошуку або конфігурувати мережу. Платформа OpenShift 4 була повністю перероблена для використання the
Kubernetes завжди дозволяв користувачам керувати програмами, визначаючи бажаний стан та використовуючи
Використовуючи оператори (Operators) у платформі, OpenShift 4 привносить цю нову парадигму (з використанням концепції заданого та фактичного стану) в керування RHEL CoreOS та CRI-O. Завдання конфігурування та управління версіями операційної системи та контейнерного двигуна автоматизується за допомогою так званого
Запуск контейнерів
Користувачі мали можливість використовувати двигун CRI-O у платформі OpenShift починаючи з версії 3.7 у статусі Tech Preview і з версії 3.9 у статусі Generally Available (підтримується в даний час). Крім того, Red Hat масово використовує
Мал. 2. Як працюють контейнери в кластері Kubernetes
CRI-O спрощує створення нових контейнерних хостів за рахунок синхронізації всього верхнього рівня при ініціалізації нових нод, а при випуску нових версій платформи OpenShift. Ревізія всієї платформи цілком дозволяє виконувати транзакційні оновлення/відкати, а також запобігає взаємним блокуванням у залежностях між ядром контейнерного хвоста, контейнерним движком, нодами (Kubelets) та майстер-нодою Kubernetes Master. При централізованому керуванні всіма компонентами платформи, з контролем та керуванням версіями, можна завжди відстежити чіткий шлях зі стану A до стану B. Це дозволяє спростити процес оновлень, підвищує безпеку, покращує ведення звітності щодо продуктивності та допомагає знизити витрати на оновлення та встановлення нових версій.
Демонстрація потужності змінних елементів
Як було згадано раніше, використання Machine Config Operator для керування хостом контейнера та контейнерним движком у OpenShift 4 забезпечує новий рівень автоматизації, який не був можливий на платформі Kubernetes раніше. Щоб продемонструвати нові можливості, ми покажемо, як ви могли б змінювати файл crio.conf. Щоб не заплутатися в термінології, намагайтеся сконцентруватись на результатах.
Перш за все, давайте створимо те, що називається конфігурацією середовища виконання контейнера - Container Runtime Config. Вважайте, що це ресурс Kubernetes, який представляє конфігурацію для CRI-O. Насправді ж це спеціалізована версія того, що називається MachineConfig, що є будь-якою конфігурацією, що розгортається на машині RHEL CoreOS в рамках кластера OpenShift.
Цей кастомний ресурс, званий ContainerRuntimeConfig, був придуманий для того, щоб полегшити для адміністраторів кластера налаштування CRI-O. Це досить потужний інструмент, який можна застосовувати лише до певних вузлів залежно від налаштувань MachineConfigPool. Вважайте це групою машин, які є однією і тієї ж мети.
Зверніть увагу на два останніх рядки, які ми збираємося змінити у файлі /etc/crio/crio.conf. Ці два рядки дуже схожі на рядки у файлі crio.conf, це:
vi ContainerRuntimeConfig.yaml
Висновок:
apiVersion: machineconfiguration.openshift.io/v1
kind: ContainerRuntimeConfig
metadata:
name: set-log-and-pid
spec:
machineConfigPoolSelector:
matchLabels:
debug-crio: config-log-and-pid
containerRuntimeConfig:
pidsLimit: 2048
logLevel: debug
Тепер відправимо цей файл до кластера Kubernetes і перевіримо, що він дійсно створений. Зверніть увагу, що робота здійснюється так само, як і з будь-яким іншим ресурсом Kubernetes:
oc create -f ContainerRuntimeConfig.yaml
oc get ContainerRuntimeConfig
Висновок:
NAME AGE
set-log-and-pid 22h
Після того, як ми створили ContainerRuntimeConfig, нам необхідно змінити один із MachineConfigPools, щоб дати зрозуміти Kubernetes, що ми хочемо застосувати цю конфігурацію до певної групи машин у кластері. У цьому випадку ми змінимо MachineConfigPool для майстер-вузлів:
oc edit MachineConfigPool/master
Висновок (для наочності залишено основну суть):
...
metadata:
creationTimestamp: 2019-04-10T23:42:28Z
generation: 1
labels:
debug-crio: config-log-and-pid
operator.machineconfiguration.openshift.io/required-for-upgrade: ""
...
У цей момент MCO починає створювати новий файл crio.conf кластера. При цьому повністю готовий конфігураційний файл можна переглянути засобами Kubernetes API. Пам'ятайте, ContainerRuntimeConfig – це лише спеціалізована версія MachineConfig, тому ми можемо побачити результат, поглянувши на потрібні рядки в MachineConfigs:
oc get MachineConfigs | grep rendered
Висновок:
rendered-master-c923f24f01a0e38c77a05acfd631910b 4.0.22-201904011459-dirty 2.2.0 16h
rendered-master-f722b027a98ac5b8e0b41d71e992f626 4.0.22-201904011459-dirty 2.2.0 4m
rendered-worker-9777325797fe7e74c3f2dd11d359bc62 4.0.22-201904011459-dirty 2.2.0 16h
Зверніть увагу, що отриманий файл конфігурацій для майстер-вузлів виявився новішою версією, ніж вихідні конфігурації. Щоб переглянути його, запустіть наступну команду. Принагідно зазначимо, що це, можливо, один із найкращих однорядкових скриптів за всю історію Kubernetes:
python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" $(oc get MachineConfig/rendered-master-f722b027a98ac5b8e0b41d71e992f626 -o YAML | grep -B4 crio.conf | grep source | tail -n 1 | cut -d, -f2) | grep pid
Висновок:
pids_limit = 2048
Тепер переконаємося, що конфігурація була застосована до всіх майстер-вузлів. Спочатку отримаємо список вузлів у кластері:
oc get node | grep master
Output:
ip-10-0-135-153.us-east-2.compute.internal Ready master 23h v1.12.4+509916ce1
ip-10-0-154-0.us-east-2.compute.internal Ready master 23h v1.12.4+509916ce1
ip-10-0-166-79.us-east-2.compute.internal Ready master 23h v1.12.4+509916ce1
Тепер переглянемо встановлений файл. Ви побачите, що файл було оновлено за новими значеннями директив pid та debug, які ми вказали у ресурсі ContainerRuntimeConfig. Сама елегантність:
oc debug node/ip-10-0-135-153.us-east-2.compute.internal — cat /host/etc/crio/crio.conf | egrep 'debug||pid’
Висновок:
...
pids_limit = 2048
...
log_level = "debug"
...
Всі ці зміни у кластері були внесені навіть без запуску SSH. Уся робота була виконана шляхом звернення до майстер-вузла Kuberentes. Тобто ці нові параметри були налаштовані тільки на майстер-вузлах. Робочі вузли при цьому не змінювалися, що демонструє переваги методології Kubernetes з використанням заданих та актуальних станів стосовно хостів контейнерів та контейнерних двигунів із взаємозамінними елементами.
Наведений вище приклад показує можливість вносити зміни до невеликого кластеру OpenShift Container Platform 4 з трьома робочими нодами або у величезний виробничий кластер з 3000 нодів. У будь-якому випадку обсяг робіт буде однаковим – і зовсім невеликим – достатньо налаштувати файл ContainerRuntimeConfig, та змінити одну мітку (label) у MachineConfigPool. І ви можете зробити це з будь-якою версією платформи OpenShift Container Platform 4.X, що використовується в Kubernetes, протягом усього її життєвого циклу.
Найчастіше технологічні компанії розвиваються настільки швидко, що ми можемо пояснити, чому ми вибираємо ті чи інші технології для базових компонентів. Контейнерні двигуни історично були тим компонентом, з яким користувачі взаємодіють безпосередньо. Оскільки популярність контейнерів закономірно починалася з появи контейнерних двигунів, користувачі часто виявляють до них зацікавленість. Це ще одна причина, чому Red Hat зупинила свій вибір на CRI-O. Контейнери розвиваються, при цьому сьогодні основна увага приділяється оркестровці, і ми дійшли висновку, що CRI-O забезпечує найкращий досвід роботи з OpenShift 4.
Джерело: habr.com