CRI — це інтерфейс втулка, який дозволяє kubelet використовувати різноманітні середовища виконання контейнерів, не маючи потреби перекомпілювати компоненти кластера.
Для того, щоб kubelet міг запускати Podʼи та їхні контейнери, потрібне справне середовище виконання контейнерів на кожному вузлі в кластері.
Інтерфейс середовища виконання контейнерів (CRI) — основний протокол для взаємодії між kubelet та середовищем виконання контейнерів.
Container Runtime Interface (CRI) у Kubernetes визначає основний протокол gRPC для звʼязку між компонентами вузла kubelet та середовищем виконання контейнерів.
Kubelet діє як клієнт при підключенні до середовища виконання контейнерів через gRPC. Точки доступу служб середовища виконання та образів мають бути доступні в середовищі виконання контейнерів; їх можна налаштувати окремо в kubelet за допомогою прапорця командного рядка --container-runtime-endpoint.
Для Kubernetes v1.26 і пізніших версій kubelet вимагає, щоб середовище виконання контейнерів підтримувало API CRI v1. Якщо середовище виконання контейнерів не підтримує API v1, kubelet не зареєструє вузол.
Під час оновлення версії Kubernetes на вузлі kubelet перезапускається. Якщо середовище виконання контейнерів не підтримує API CRI v1, kubelet не зможе зареєструватися і повідомить про помилку. Якщо через оновлення середовища виконання контейнерів потрібне повторне зʼєднання gRPC, середовище виконання повинно підтримувати API CRI v1, щоб зʼєднання було успішним. Для цього може знадобитися перезапуск kubelet після правильного налаштування середовища виконання контейнерів.
To use this feature, you (or a cluster administrator) will need to enable the CRIListStreaming feature gate for all relevant components in your cluster.
See Enable Or Disable Feature Gates for more information.
Стандартні RPC-запити списку CRI (ListContainers, ListPodSandbox, ListImages) повертають усі результати в одній унарній відповіді. На вузлах із великою кількістю контейнерів (наприклад, понад приблизно 10 000, включаючи як ті, що працюють, так і зупинені), ці відповіді можуть перевищувати типове обмеження gRPC на розмір повідомлення у 16 МіБ, що призводить до збою kubelet під час узгодження стану з середовищем виконання контейнерів.
З увімкненою функціональною можливістю CRIListStreaming kubelet використовує серверні потокові RPC (такі як StreamContainers, StreamPodSandboxes, StreamImages), які дозволяють середовищу виконання контейнерів розподіляти результати по кількох повідомленнях відповіді, обходячи обмеження на розмір одного повідомлення. Це особливо корисно для:
Якщо середовище виконання контейнерів не підтримує потокові RPC, kubelet автоматично повертається до стандартних унарних RPC для забезпечення зворотної сумісності.