Kubelet Pods API дає змогу локальним компонентам вузла отримувати інформацію про Podʼи, що працюють на Вузлі, безпосередньо від kubelet. Це підвищує надійність, усуваючи залежність від сервера API Kubernetes для отримання локальної інформації про вузол, а також зменшує навантаження на панель управління.
Доступ до цього API обмежено локальними адміністраторами (зазвичай root) через права доступу до файлу на UNIX-сокеті.
API слухає на UNIX-сокеті за адресою: /var/lib/kubelet/pods-api/pods-api.sock
API надає наступні методи gRPC:
ListPodsПовертає список усіх подів, які наразі керуються kubelet на вузлі.
WatchPodsПовертає потік оновлень подів. Коли стан пода змінюється локально, kubelet надсилає оновлену інформацію про под через потік.
GetPodПовертає інформацію про конкретний под, ідентифікований за його UID.
API використовує наступне визначення protobuf:
import "google/protobuf/field_mask.proto";
import "k8s.io/api/core/v1/generated.proto";
service Pods {
// ListPods повертає список обʼєктів v1.Pod, який за бажанням можна відфільтрувати за допомогою маски полів.
rpc ListPods(PodListRequest) returns (PodListResponse) {}
// WatchPods повертає потік оновлень Pod, який за бажанням можна відфільтрувати за допомогою маски полів.
rpc WatchPods(PodWatchRequest) returns (stream PodWatchResponse) {}
// GetPod повертає обʼєкт v1.Pod для заданого UID пода, за бажанням можна відфільтрувати за допомогою маски полів.
rpc GetPod(PodGetRequest) returns (PodGetResponse) {}
}
message PodListRequest {
// Опційна маска полів у метаданих gRPC, щоб вказати, які поля пода повертати.
}
message PodListResponse {
repeated v1.Pod pods = 1;
}
message PodWatchRequest {
// Опційна маска полів у метаданих gRPC, щоб вказати, які поля пода повертати.
}
message PodWatchResponse {
v1.Pod pod = 1;
}
message PodGetRequest {
string podUID = 1;
// Опційна маска полів у метаданих gRPC, щоб вказати, які поля пода повертати.
}
message PodGetResponse {
v1.Pod pod = 1;
}
API підтримує google.protobuf.FieldMask, щоб дозволити клієнтам запитувати лише конкретні поля, які їм потрібні (наприклад, status.phase, status.podIPs). Це забезпечує ефективну передачу даних. Якщо маска полів не надана, повертається повний обʼєкт v1.Pod.
API надає найактуальнішу інформацію, відому локально kubelet, отриману з його внутрішнього кешу та узгодження з середовищем виконання контейнерів. Він залишається доступним навіть у разі втрати вузлом звʼязку з панеллю управління Kubernetes.
Якщо джерела подів kubelet ще не завершили початкову синхронізацію (наприклад, відразу після запуску або перезапуску kubelet), кожна операція повертає помилку gRPC FAILED_PRECONDITION замість неповних даних. Після завершення синхронізації запити обробляються нормально.
kubelet обмежує швидкість запитів ListPods та GetPod, щоб захистити себе від надмірного навантаження. Зазвичай сервер дозволяє 100 запитів на секунду з піковим значенням 10 токенів. Запити, що перевищують цей ліміт, отримують помилку gRPC RESOURCE_EXHAUSTED.
Потоки WatchPods не підпадають під це обмеження швидкості; натомість повільний споживач, який відстає від свого потоку подій, втрачає з’єднання спостереження (див. Метрики).
kubelet надає такі метрики для API подів, з мітками server_api_version та status_code:
kubelet_pod_requests_total: кумулятивна кількість запитів до API.kubelet_pod_requests_list_total: кількість запитів до точки доступу ListPods.kubelet_pod_requests_get_total: кількість запитів до точки доступу GetPod.kubelet_pod_requests_watch_total: кількість запитів до точки доступу WatchPods.kubelet також надає метрику kubelet_pod_watch_events_dropped_total, яка рахує події спостереження, відкинуті через те, що клієнт не встигав споживати свій потік подій.