Контейнер – на конвейер: CRI-O сега по подразбиране в OpenShift Container Platform 4

Платформа Red Hat OpenShift Container Platform 4 позволява да се ускори процесът на създаване на хостинги за разгръщане на контейнери, включително в инфраструктурата на доставчиците на облачни услуги, на платформите за виртуализация или в системи bare-metal. За да създадем в истинския смисъл облачна платформа, трябваше да вземем под сериозен контрол всички използвани елементи и по този начин да увеличим надеждността на сложния процес на автоматизация.

Контейнер – на конвейер: CRI-O сега по подразбиране в OpenShift Container Platform 4

Очевидното решение беше да използваме като стандарт Red Hat Enterprise Linux CoreOS (разновидност на Red Hat Enterprise Linux) и CRI-O, и ето защо…

Тъй като темата за мореплаването е доста удачна за търсене на аналогии при обяснението на работата на Kubernetes и контейнерите, ще се опитаме да разкажем за бизнес-проблемите, които решават CoreOS и CRI-O, на примера на изобретението на Брюнел за производство на такелажни блокове. През 1803 година пред Марк Брюнел беше поставена задачата да произведе 100 хиляди такелажни блока за нуждите на растящия търговски флот на Великобритания. Такелажният блок е тип оборудване, използвано за закрепване на въжета към платната. До началото на 19-ти век тези блокове се произвеждаха ръчно, но на Брюнел му успя да автоматизира производството и да започне производството на стандартизирани блокове с помощта на машини. Автоматизацията на този процес означаваше, че всички блокове ставаха практически идентични, лесно заменяеми в случай на повреда и можеха да се произвеждат в голямо количество.

А сега си представете, че Брюнел е трябвало да изпълни тази работа за 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.

Светът на откритите контейнери

Светът отдавна се движи към отворени контейнери. Независимо дали става въпрос за Kubernetes или на по-ниски нива, развитието на стандартите за контейнери води до появата на екосистема от иновации на всеки етап.

Всичко започна с създаването на инициативата Open Containers Initiative през юни 2015 година. На този ранен етап бяха формулирани спецификациите на контейнерния образ (image) и среда на изпълнение (runtime).Това позволи да се гарантира, че инструментите могат да използват единен стандарт за контейнери и единен формат за работа с тях. По-късно бяха добавени спецификациите за дистрибуция (distribution),което позволи на потребителите лесно да обменят контейнери..

След това общността на Kubernetes разработи единен стандарт за свързващ интерфейс (pluggable interface), наречен Container Runtime Interface (CRI).С това потребителите на Kubernetes могат да свързват различни енджини за работа с контейнери в допълнение към Docker.

Инженерите на Red Hat и Google видяха съществуващата на пазара нужда от контейнерен енджин, който да може да приема заявки от Kubelet по протокола CRI и представиха контейнери, съвместими с гореспоменатите спецификации на OCI. Така се появи OCID.Но извинявайте, ние казахме, че този материал ще бъде посветен на CRI-O? Всъщност е точно така, просто с излизането на версия 1.0 проектът беше преименуван на CRI-O.

Рис. 1.

Контейнер – на конвейер: CRI-O сега по подразбиране в OpenShift Container Platform 4

Иновации с CRI-O и CoreOS.

С пускането на платформата OpenShift 4, беше променен контейнерният енджин,използван по подразбиране на платформата, и вместо Docker се появи CRI-O, който предлага икономична, стабилна, проста и скучна среда за стартиране на контейнери, развиваща се паралелно с Kubernetes. Това значително опростява поддръжката и конфигурирането на клъстера. Конфигурирането на контейнерния енджин и хоста, както и управлението им, става автоматизирано в рамките на OpenShift 4.

Стоп, какво?

Точно така, с появата на OpenShift 4, вече не е необходимо да се свързвате с отделни хостове и да инсталирате контейнерния енджин, да конфигурирате хранилището, да настройвате сървъри за търсене или да конфигурирате мрежата. Платформата OpenShift 4 беше напълно преработена за използване на Operator Framework не само по себе, а и по основни операции на нивото на платформата, като разгръщане на образи, конфигуриране на системата или инсталиране на актуализации.

Kubernetes винаги е позволявал на потребителите да управляват приложения, определяйки исканото състояние и използвайки контролери (Controllers), за да гарантира, че действителното състояние максимално отговаря на зададеното. Този подход с използване на зададено състояние и действително състояние открива големи възможности както от гледна точка на разработка, така и от гледна точка на операции. Разработчиците могат да определят изискваното състояние, да го предадат на оператора под формата на YAML или JSON файл, след което операторът може да създаде в експлоатационната среда необходимия екземпляр на приложението, при което работното състояние на този екземпляр ще съответства на зададеното.

С помощта на оператори (Operators) в платформата, OpenShift 4 въвежда тази нова парадигма (чрез концепцията за зададено и действително състояние) в управлението на RHEL CoreOS и CRI-O. Задачите по конфигуриране и управление на версиите на операционната система и контейнерния двигател се автоматизират с помощта на така наречения оператор за конфигуриране на машина (Machine Config Operator, MCO). MCO значително опростява работата на администратора на клъстера, по същество автоматизирайки последните етапи на инсталацията, а също и последващите операции след инсталиране (day two operations). Всичко това прави OpenShift 4 истинска облачна платформа. Ще се спрем на това малко по-късно.

Стартиране на контейнери

Потребителите имаха възможност да използват движка CRI-O в платформата OpenShift от версия 3.7 в статус Tech Preview и от версия 3.9 в статус Generally Available (в момента се поддържа). Освен това Red Hat масово използва CRI-O за стартиране на производствени работни натоварвания в OpenShift Online от версия 3.10. Всичко това позволи на екипа, работещ по CRI-O, да придобие огромен опит в масовото стартиране на контейнери на големи клъстери Kubernetes. За да получим основни представа за това как Kubernetes използва CRI-O, нека разгледаме следната илюстрация, на която е показан принципът на работа на архитектурата.

Рис. 2. Как работят контейнерите в клъстера Kubernetes

Контейнер – на конвейер: CRI-O сега по подразбиране в OpenShift Container Platform 4

CRI-O опростява създаването на нови контейнерни хостове чрез синхронизация на целия горен слой при инициализация на нови нодове и при пускането на нови версии на платформата OpenShift. Прегледът на цялата платформа позволява извършването на транзакционни актуализации / обратно завъртания, както и предотвратява взаимни блокировки в зависимостите между ядрото на контейнерния хост, контейнерния двигател, нодовете (Kubelets) и майстор нода на Kubernetes. При централизирано управление на всички компоненти на платформата, с контрол и управление на версиите, е възможно винаги да се проследи ясен маршрут от състояние 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

Изход:

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. Цялата работа беше извършена чрез обаждане до главния възел на Kubernetes. Тоест, тези нови параметри бяха конфигурирани само на главните възли. Работните възли не бяха променяни, което демонстрира предимствата на методологията Kubernetes с използване на зададени и актуални състояния относно хостовете на контейнери и контейнерни двигатели с взаимозаменяеми елементи.

По-горният пример показва възможността да се внасят промени в малък клъстер OpenShift Container Platform 4 с три работни възела или в огромен производствен клъстер с 3000 възела. Във всеки случай обемът на работата ще бъде същият – и много малък – просто трябва да настроите файла ContainerRuntimeConfig и да промените една етикета (label) в MachineConfigPool. И можете да направите това с всяка версия на използваната в Kubernetes платформа OpenShift Container Platform 4.X през целия й жизнен цикъл.

Често технологичните компании се развиват толкова бързо, че не можем да обясним защо избираме определени технологии за основните компоненти. Контейнерните двигатели исторически бяха компонентът, с който потребителите взаимодействат директно. Тъй като популярността на контейнерите закономерно започна с появата на контейнерни двигатели, потребителите често проявяват интерес към тях. Това е още една причина, поради която Red Hat избра CRI-O. Контейнерите се развиват, а днес основното внимание е насочено към оркестрация и достигнахме до заключението, че CRI-O осигурява най-доброто изживяване при работа с OpenShift 4.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster